|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
создать на лету Label из DLL на форме
Есть PROJECT.PAS который содержит Form1 и прицепляет DLL. В DLL-файле нужно произвести создание на Form1 некоего графического элемента (например, Label и Button). При попытке компилировать DLL файл пишет, что Unknown identifier Form1. Что нужно добавить в код чтобы это исправить?
Текст Project.PAS: Код:
... var Form1: TForm1; implementation {$R *.dfm} procedure Starter(); stdcall; external 'initial.dll'; procedure TForm1.FormCreate(Sender: TObject); begin Starter; end; end. Текст DLL-файла: Код:
library initial; uses SysUtils, Classes, Dialogs, StdCtrls; {$R *.res} procedure Starter(); stdcall; var label_tmp : TLabel; begin ShowMessage('dll'); label_tmp := TLabel.Create(nil); label_tmp.parent := Form1; label_tmp.Visible := True; label_tmp.Left := 100; label_tmp.Top := 100; label_tmp.Transparent := True; label_tmp.Caption := 'text'; end; exports Starter; begin end. Последний раз редактировалось smart_man, 08.07.2009 в 18:23. |
#2
|
||||
|
||||
А откуда он знает про этот Form1? Попробуй форму через параметр передавать...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
|||
|
|||
Сама идея понятна. Проблема в том как это выразить в коде =)
Может ошибочна сама идея пытаться делать TLabel.Create из DLL... Последний раз редактировалось smart_man, 08.07.2009 в 18:50. |
#4
|
||||
|
||||
В dll:
Код:
//procedure Starter(); stdcall; procedure Starter(var Form1: TForm); stdcall; Код:
//procedure Starter(); procedure Starter(var Form1: TForm); stdcall; external 'initial.dll'; //Starter(); Starter(Form1); Не забудь в dll добавить в uses модуть Forms С тебя +++ Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
||||
|
||||
И, вдгонку, жёсткое подключение к dll лучше заменить на LoadLibrary, так правильнее, и проверку можно норм оформить...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
|||
|
|||
Так не получается. Несоответствие между:
Код:
var Form1: TForm1; и Код:
Starter(var Form1: TForm); Возможно тут надо как-то указатель использовать... Последний раз редактировалось smart_man, 08.07.2009 в 19:24. |
#7
|
|||
|
|||
Я думаю тебе лучше пересмотреть сам алгоритм, т. е. может тебе лучше из dll отправлять какое-то сообщение на форму с необходимым параметром. Например заставь форму обновиться а в tag формы поставь какое-нибудь число чтобы форма знала что надо создать объект.
|
#8
|
|||
|
|||
Это вариант конечно. Но это значит писать свой интерпритатор... Зачем тогда DLL? С таким успехом можно вместо DLL считывать текстовый файлик...
|
#9
|
||||
|
||||
Попробуй в вызове функции использовать не Form1, а
Код:
(Form1 as TForm) Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
||||
|
||||
Tlabel таким образом добавить не получтся т.к. это не окно, используй TStaticText
попробуй такой вариант: Код:
procedure Starter(hForm : hwnd); stdcall; var label_tmp : TStaticText; begin label_tmp := TStaticText.Create(nil); label_tmp.parent := nil; label_tmp.ParentWindow := hForm; label_tmp.Show; label_tmp.Left := 100; label_tmp.Top := 100; label_tmp.Transparent := True; label_tmp.Caption := 'text'; end; Код:
Starter(Form1.Handle); ...сказал, и загрустил от бесспорной своей правоты |