я создал библиотеку и подгружаю ее обычным external 'XX.DLL';
Всем известно, что если в библиотеке присутсвует функция, которая имеет параметр string или возвращает его, то будут возникать ошибки с памятью. Моя функция заполняет якейки таблицы TStringGrid посредством обычного
AStringGrid.Cells[r-1,k-1]:='aaaa';
т.к. этот параметр, т.е. AStringGrid.Cells[r-1,k-1] является типом String то, при закрытии сообщения вылазет ошибка....
Как по другому присвоить значение для ячейки?
DLL и TStringGrid
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Всем известно, что если создавать DLL с помошью меню File/New... то будет сгенерирован пустой модуль, в начале которого будет добавлен комментарий, в котором сказано как этих ошибок избежать.Всем известно, что если в библиотеке присутсвует функция, которая имеет параметр string или возвращает его, то будут возникать ошибки с памятью.
Если не использовать стандартное решение (применение Delphi-менеджера памяти (см. тот самый автокомментарий)) то Ваша основная программа должна выделить память сама (например, присвоить во все ячейки строки по 20 пробелов). А функция должна заполнять эти строки (но не выходя за их длину) используя функции для копирования участков памяти (например StrLCopy).Моя функция заполняет якейки таблицы TStringGrid посредством обычного
AStringGrid.Cells[r-1,k-1]:='aaaa';
т.к. этот параметр, т.е. AStringGrid.Cells[r-1,k-1] является типом String то, при закрытии сообщения вылазет ошибка....
Как по другому присвоить значение для ячейки?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Неважно каким типом данных Вы пользуетесь String, WhideString, ShortString и т.д.
Важно что тот модуль который выделил память, должен ее и освобождать.
За этим надо либо следить самому, либо воспользоваться готовым велосипедом в виде менеджеров памяти.
Я говорил о том, что внутри DLL (если не испольуется менеджер памяти) нельзя сделать присвоение строки
AStringGrid.Cells[r-1,k-1]:='aaaa'
(за исключение ShortString, которые могут передаваться через стек вызова). Но можно заполнять выделенную память данными.
В основной программе
AStringGrid.Cells[1,1]:='хххх';
А в DLL
AStringGrid.Cells[1,1][2]:='A';
Тут ошибок не будет.
Важно что тот модуль который выделил память, должен ее и освобождать.
За этим надо либо следить самому, либо воспользоваться готовым велосипедом в виде менеджеров памяти.
Я говорил о том, что внутри DLL (если не испольуется менеджер памяти) нельзя сделать присвоение строки
AStringGrid.Cells[r-1,k-1]:='aaaa'
(за исключение ShortString, которые могут передаваться через стек вызова). Но можно заполнять выделенную память данными.
В основной программе
AStringGrid.Cells[1,1]:='хххх';
А в DLL
AStringGrid.Cells[1,1][2]:='A';
Тут ошибок не будет.