Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Как в процедуру из библиотеки передать 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
1-1082001029
bear9
2004-04-15 07:50
2004.05.02
Список выделенных компонентов в Tlistview


7-1078577438
SPeller
2004-03-06 15:50
2004.05.02
Как определить, ками процессами загружен мой модуль?


1-1081881050
ЧупаЧупс
2004-04-13 22:30
2004.05.02
Окружности


1-1081780593
EugeneKo
2004-04-12 18:36
2004.05.02
Как "правильно" читать HTML в Delphi 5


3-1081137790
Хэтч
2004-04-05 08:03
2004.05.02
Можно ли по нажатию на Button выделить строку DBGrid а ?