Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизКак в процедуру из библиотеки передать TStringList? Найти похожие ветки
← →
tytus © (2004-04-12 16:05) [0]Добрый день ВСЕМ. Имеется библиотека для вызова модальной формы. В этой форме мне бы хотелось отобразить список в элементе ListBox
(ListBox.Items.Assign(List)), где List - одна из переменных при вызове процедуры.
Заголовок примерно такой:
Procedure Show(AHandle:THandle;List:TStringList);stdcall;
Если есть идеи - прошу подскажите как это сделать.
← →
Гаврила (2004-04-12 16:12) [1]передавай PChar
PChar(SourceList.Text)
в приемнике
ListBox.Items.Text:= <переданный PChar>
← →
clickmaker © (2004-04-12 16:14) [2]List:TStringList - всего лишь указатель. Аналогично
Procedure Show(AHandle:THandle;List: Pointer);stdcall;
begin
SL := TStringList(List);
Поэтому можно смело передавать как есть
← →
Reindeer Moss Eater © (2004-04-12 16:15) [3]Зачем же закладываться на особенности реализации Items.Text?
Лучше передать callback которая заенумерэйтит все элементы списка
← →
Гаврила (2004-04-12 16:32) [4]>>clickmaker © (12.04.04 16:14) [2]
Смело так передавать можно только в случае bwrtp
← →
clickmaker © (2004-04-12 16:34) [5]
> Гаврила (12.04.04 16:32) [4]
Отнюдь. Причем тут bwrtp?
← →
Reindeer Moss Eater © (2004-04-12 16:37) [6]Procedure Show(AHandle:THandle;List: Pointer);stdcall;
После этого останется только объяснить программисту на VB, C++, etc - пользователю созданной DLL что такое TStringList и где у него элементы списка лежат
← →
Гаврила (2004-04-12 16:38) [7]>>clickmaker © (12.04.04 16:34) [5]
Во первых, управление памятью (пресловутый ShareMem может понадобиться)
во вторых, как уже упоминалось в этом форуме, при такой передаче не сработает оператор is, так как по сути это разные классы.
В третьих, директивы для компилятора (такие как например, выравнивание $A), может быть разным в хосте и библиотеке - рискуем поиметь проблемы. С другой стороны, велика вероятность, что все сработает, но, имхо, это неправильно концептуально. И опасно
← →
Reindeer Moss Eater © (2004-04-12 16:41) [8]Библиотеки должны экспортировать функции с параметрами - базовыми типами Windows
← →
tytus © (2004-04-12 16:46) [9]>Гаврила.
Спасибо, получилось.
Выглядит так:
procedure GetNewNodeName(AHandle:THandle;VList:PChar);
var
AddTVfm: TAddTVfm;
begin
Application.Handle:=AHandle;
AddTVfm:=TAddTVfm.Create(Application);
try
AddTVfm.ListBox1.Items.Text:=VList;
AddTVfm.ShowModal;
и т.д...
>Reindeer Moss Eater
Вроде как поинтересней будет, если можно - пару строк идейки.
← →
Reindeer Moss Eater © (2004-04-12 16:56) [10]Передавая PChar на Items.Text обрекаем пользователя DLL на необходимость знать как текст делится строки.
Если он программирует на Delphi это не проблема. А если нет?
Я бы передал в библиотеку указатель на процедуру, которая перечисляет элементы списка в хост приложении.
Вот и все.
← →
tytus © (2004-04-12 17:09) [11]>Reindeer Moss Eater
Попробую вспомнить:
Как строка текст формируется с разделителями #13#10.
Как нуль-строка - с разделителями #0 и в самом конце #0#0.
Правильно?
Передавать текст длл никому не буду (хотя хакеры возможно будут).
А насчет CallBack сам давно хотел почитать у Ксавье & Ко.
Пока все.
Всем спасибо!
← →
Гаврила (2004-04-12 17:10) [12]>>Reindeer Moss Eater © (12.04.04 16:56) [10]
>>Передавая PChar на Items.Text обрекаем пользователя DLL на необходимость знать как текст делится строки.
Как делится.... #13#10 и делится, стандартно
ничего страшного...
← →
Гаврила (2004-04-12 17:14) [13]>>tytus © (12.04.04 17:09) [11]
Нет, там только в конце один #0
внутри текста нулей нет
← →
tytus © (2004-04-12 17:28) [14]>Гаврила
Интересно, в хелпе сказано другое, или я заблуждался.
Когда-то я использовал Функцию GetLogicalDriveStrings.
lpBuffer
Points to a buffer that receives a series of null-terminated strings, one for each valid drive in the system, that end with a second null character. The following example shows the buffer contents with <null> representing the terminating null character.
c:\<null>d:\<null><null>
Вот это <Null> наверное и есть #0.
Или в стринглистах все по-другому...
← →
Гаврила (2004-04-12 17:44) [15]>>tytus © (12.04.04 17:28) [14]
В функциях API часть применяется такая схема, в стринглисте по другому
← →
Игорь Шевченко © (2004-04-12 18:57) [16]Да какая разница, как передавать, главное, чтобы передающая и принимающая стороны договорились между собой о способе передачи.
А уж разделять нулями, или #13#10 или точкой с запятой, какая разница ?
← →
Palladin © (2004-04-12 19:03) [17]Очень удобно использовать CommaText
← →
Polevi © (2004-04-12 22:04) [18]> [10] Reindeer Moss Eater © (12.04.04 16:56)
тогда уж сразу не просто DLl, а COM
и возвращать интерфейс-енумератор, чтобы форичем из васика удобно было
:)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c