DLL и TStringGrid

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
ChPuK
Сообщения: 28
Зарегистрирован: 25 фев 2005, 08:40
Откуда: Tashkent
Контактная информация:

я создал библиотеку и подгружаю ее обычным external 'XX.DLL';

Всем известно, что если в библиотеке присутсвует функция, которая имеет параметр string или возвращает его, то будут возникать ошибки с памятью. Моя функция заполняет якейки таблицы 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 или возвращает его, то будут возникать ошибки с памятью.
Всем известно, что если создавать DLL с помошью меню File/New... то будет сгенерирован пустой модуль, в начале которого будет добавлен комментарий, в котором сказано как этих ошибок избежать.

Моя функция заполняет якейки таблицы TStringGrid посредством обычного
AStringGrid.Cells[r-1,k-1]:='aaaa';

т.к. этот параметр, т.е. AStringGrid.Cells[r-1,k-1] является типом String то, при закрытии сообщения вылазет ошибка....

Как по другому присвоить значение для ячейки?
Если не использовать стандартное решение (применение Delphi-менеджера памяти (см. тот самый автокомментарий)) то Ваша основная программа должна выделить память сама (например, присвоить во все ячейки строки по 20 пробелов). А функция должна заполнять эти строки (но не выходя за их длину) используя функции для копирования участков памяти (например StrLCopy).
Storm
Сообщения: 1
Зарегистрирован: 01 авг 2005, 15:24
Откуда: Омск, Москва, Новосибирск (живу командировочно) основной ОМСК
Контактная информация:

не совсем понятно о чем речь... но в dll есть тип WideString....
Аватара пользователя
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';

Тут ошибок не будет.
Ответить