Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.07.2009, 18:21
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию создать на лету 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  
Старый 08.07.2009, 18:30
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А откуда он знает про этот Form1? Попробуй форму через параметр передавать...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 08.07.2009, 18:45
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Сама идея понятна. Проблема в том как это выразить в коде =)

Может ошибочна сама идея пытаться делать TLabel.Create из DLL...

Последний раз редактировалось smart_man, 08.07.2009 в 18:50.
Ответить с цитированием
  #4  
Старый 08.07.2009, 18:56
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

В dll:
Код:
//procedure Starter(); stdcall;
procedure Starter(var Form1: TForm); stdcall;
В pas:
Код:
//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  
Старый 08.07.2009, 18:58
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

И, вдгонку, жёсткое подключение к dll лучше заменить на LoadLibrary, так правильнее, и проверку можно норм оформить...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 08.07.2009, 19:07
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Так не получается. Несоответствие между:

Код:
var  Form1: TForm1;

и

Код:
Starter(var Form1: TForm);


Возможно тут надо как-то указатель использовать...

Последний раз редактировалось smart_man, 08.07.2009 в 19:24.
Ответить с цитированием
  #7  
Старый 08.07.2009, 19:36
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Я думаю тебе лучше пересмотреть сам алгоритм, т. е. может тебе лучше из dll отправлять какое-то сообщение на форму с необходимым параметром. Например заставь форму обновиться а в tag формы поставь какое-нибудь число чтобы форма знала что надо создать объект.
Ответить с цитированием
  #8  
Старый 08.07.2009, 19:42
smart_man smart_man вне форума
Прохожий
 
Регистрация: 08.12.2008
Сообщения: 40
Репутация: 10
По умолчанию

Это вариант конечно. Но это значит писать свой интерпритатор... Зачем тогда DLL? С таким успехом можно вместо DLL считывать текстовый файлик...
Ответить с цитированием
  #9  
Старый 08.07.2009, 20:45
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Попробуй в вызове функции использовать не Form1, а
Код:
(Form1 as TForm)
может, прокатит... А вообще, как-то через хендл можно вроде... но как - не помню...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #10  
Старый 08.07.2009, 22:13
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

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);
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter