|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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? Попробуй форму через параметр передавать... | 
| 
			 
			#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 С тебя +++ | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   И, вдгонку, жёсткое подключение к dll лучше заменить на LoadLibrary, так правильнее, и проверку можно норм оформить... | 
| 
			 
			#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) | 
| 
			 
			#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); |