Показать сообщение отдельно
  #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;
Ответить с цитированием