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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.10.2009, 10:43
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию Взаимодействиес DLL

Не знаю точно в какую тему писать, так что напишу в эту(да простит меня администратор)
Задача в следующем в run time я строю на форме некоторые объекты родителями для которых является Tpanel (его родитель форма). Потом, после выполнения своих функций Tpanel уничтожается(с ней уничтожаются все её потомки). После процесс повторяется и т.д
Понятное дело объем кода сильно возрастает. Вот и пришло в головумысль вынести часто повторяющиеся процедуры создания раунда в отдельную DLL , и тут возникла проблема как назначить в DLL обьекту
родителя , ведь Форма размещена в проекте а её потомок Tpanel в DLL.
А значит если напишем
Код:
one:=TPanel.Create(AOwner);
one.Parent:=Form1;
То понятно что это ошибка ведь в DLL не описан класс, мы можем конечно(если я не ошибаюсь) описать класс прямо в DLL, типа
Код:
type
  Tround1 = class(TForm)
    Panel1: TPanel;
Но ведь в таком случае у нас будет 2 одинаковых класса , что тоже не допустимо.
Отсюда вопрос, как реализовать это и в какую сторону копать ?
Буду благодарен за ссылки на материалы по теме
Ответить с цитированием
  #2  
Старый 11.10.2009, 12:32
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

В приложении опиши функции добавления\манипулирования с компонентами и передай их в dll, где библиотека и будет делать то что ей нужно. И размер dll'ки будет маленький (если не добавлять Forms и др модули компонентов) и повторно ничего не придётся писать.
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #3  
Старый 11.10.2009, 14:20
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

А можно подробнее о
"опиши функции добавления\манипулирования с компонентами и передай их в dll," или ссылку на статью
Ответить с цитированием
  #4  
Старый 11.10.2009, 15:15
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Приведу небольшой работающий примерчик, как я понял вам нужно в реал-тайме создавать компоненты из библиотеки? Вот на скорую руку написал примерчик, конечно он получился громоздким, но это ему придаёт ту шустрость которой нехватает делфи приложениям.По аналогии дополни рекорд TProcs своими функциями и наздоровье передавай их в библиотеку, откуда она будет манипулировать формой. Прикрепляю файл с исходниками и ЕХЕшником, я работаю на Delphi 2009, поэтому если у вас версия ниже, возможно не скомпилируется.

Этот код в основном приложении:

Код:
type
  TForm1 = class(TForm)
  ...
  public
    ...
    procedure InitLib;
  end;

  TProcAddButton = function(AName: PChar): Cardinal;
  TProcModButton = procedure(ABtn: Cardinal; ACaption: PChar;
    AX, AY, AW, AH: Integer; AOnClick: TNotifyEvent);

  PProcs = ^TProcs;
  TProcs = record
    AddBtn: TProcAddButton;
    ModBtn: TProcModButton;
  end;

  TInitLibProc = procedure(AProcs: PProcs);
...
implementation
...
function ProcAddBtn(AName: PChar): Cardinal;
var
  btn: TButton;
begin
  //do add button
  btn := TButton.Create(Form1);
  btn.Parent := Form1;
  btn.Name := AName;

  Result := Cardinal(Pointer(btn));
end;

procedure ProcModBtn(ABtn: Cardinal; ACaption: PChar; AX, AY, AW, AH: Integer;
  AOnClick: TNotifyEvent);
var
  btn: TButton;
begin
  //do modify button
  btn := TButton(Pointer(ABtn));
  btn.Left := AX;
  btn.Top := AY;
  btn.Width := AW;
  btn.Height := AH;
  btn.Caption := ACaption; // в спешке забыл, но не думаю что это суть меняет
  btn.OnClick := AOnClick;
end;

procedure TForm1.InitLib;
const
  lib = 'MyLib.dll';
var
  lLib: Cardinal;
  lProc: TInitLibProc;
  lProcs: TProcs;
begin
  lLib := LoadLibrary(pchar(lib));
  if(lLib<>0)then
  begin
    lProc := GetProcAddress(lLib,pchar('Init'));
    if(@lProc<>nil)then
    begin
      FillChar(lProcs,sizeof(lProcs),$00);
      lProcs.AddBtn := ProcAddBtn;
      lProcs.ModBtn := ProcModBtn;
      lProc(@lProcs);
    end
    else MessageDlg('Неудалось инициализировать библиотеку mylib.dll',mtError,
      [mbOK],0);
  end
  else MessageDlg('Неудалось загрузить библиотеку mylib.dll',mtError,
    [mbOK],0);
end;

Вот код библиотеки:
Код:
...
type
  TForm = class(TObject)
  public
    procedure btnTest1Click(Sender: TObject);
    procedure btnTest2Click(Sender: TObject);
  end;

  TProcAddButton = function(AName: PChar): Cardinal;
  TProcModButton = procedure(ABtn: Cardinal; ACaption: PChar;
    AX, AY, AW, AH: Integer; AOnClick: TNotifyEvent);

  PProcs = ^TProcs;
  TProcs = record
    AddBtn: TProcAddButton;
    ModBtn: TProcModButton;
  end;

...

var
  procs: TProcs;
  form: TForm;

procedure TForm.btnTest1Click(Sender: TObject);
begin
  MessageBox(0,pchar('Clicked test button 1'),pchar('Echo'),
    MB_OK or MB_ICONINFORMATION);
end;

procedure TForm.btnTest2Click(Sender: TObject);
begin
  MessageBox(0,pchar('Clicked test button 2'),pchar('Echo'),
    MB_OK or MB_ICONINFORMATION);
end;

procedure Init(AProcs: PProcs);
begin
  procs := AProcs^;
  form := TForm.Create;

  procs.ModBtn(procs.AddBtn(pchar('btnTest1')),pchar('Test button 1'),10,10,
    75,25,form.btnTest1Click);
  procs.ModBtn(procs.AddBtn(pchar('btnTest2')),pchar('Test button 2'),10,40,
    75,25,form.btnTest2Click);
end;

exports
  Init;

...

зы: чота репа у меня низкая...
Вложения
Тип файла: rar Example_by_AleD.part01.rar (87.9 Кбайт, 8 просмотров)
Тип файла: rar Example_by_AleD.part02.rar (87.9 Кбайт, 8 просмотров)
Тип файла: rar Example_by_AleD.part03.rar (87.9 Кбайт, 8 просмотров)
Тип файла: rar Example_by_AleD.part04.rar (4.1 Кбайт, 7 просмотров)
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;

Последний раз редактировалось AleD, 11.10.2009 в 15:54.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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