Страница 1 из 1
DLL и TStringGrid
Добавлено: 25 фев 2005, 14:57
ChPuK
я создал библиотеку и подгружаю ее обычным external 'XX.DLL';
Всем известно, что если в библиотеке присутсвует функция, которая имеет параметр string или возвращает его, то будут возникать ошибки с памятью. Моя функция заполняет якейки таблицы TStringGrid посредством обычного
AStringGrid.Cells[r-1,k-1]:='aaaa';
т.к. этот параметр, т.е. AStringGrid.Cells[r-1,k-1] является типом String то, при закрытии сообщения вылазет ошибка....
Как по другому присвоить значение для ячейки?
Добавлено: 26 фев 2005, 09:31
Naeel Maqsudov
Всем известно, что если в библиотеке присутсвует функция, которая имеет параметр string или возвращает его, то будут возникать ошибки с памятью.
Всем известно, что если создавать DLL с помошью меню File/New... то будет сгенерирован пустой модуль, в начале которого будет добавлен комментарий, в котором сказано как этих ошибок избежать.
Моя функция заполняет якейки таблицы TStringGrid посредством обычного
AStringGrid.Cells[r-1,k-1]:='aaaa';
т.к. этот параметр, т.е. AStringGrid.Cells[r-1,k-1] является типом String то, при закрытии сообщения вылазет ошибка....
Как по другому присвоить значение для ячейки?
Если не использовать стандартное решение (применение Delphi-менеджера памяти (см. тот самый автокомментарий)) то Ваша основная программа должна выделить память сама (например, присвоить во все ячейки строки по 20 пробелов). А функция должна заполнять эти строки (но не выходя за их длину) используя функции для копирования участков памяти (например StrLCopy).
Добавлено: 01 авг 2005, 16:07
Storm
не совсем понятно о чем речь... но в dll есть тип WideString....
Добавлено: 20 сен 2005, 17:30
Naeel Maqsudov
Неважно каким типом данных Вы пользуетесь String, WhideString, ShortString и т.д.
Важно что тот модуль который выделил память, должен ее и освобождать.
За этим надо либо следить самому, либо воспользоваться готовым велосипедом в виде менеджеров памяти.
Я говорил о том, что внутри DLL (если не испольуется менеджер памяти) нельзя сделать присвоение строки
AStringGrid.Cells[r-1,k-1]:='aaaa'
(за исключение ShortString, которые могут передаваться через стек вызова). Но можно заполнять выделенную память данными.
В основной программе
AStringGrid.Cells[1,1]:='хххх';
А в DLL
AStringGrid.Cells[1,1][2]:='A';
Тут ошибок не будет.