TFrame w DLL i wywołanie jej głównym programie

0

Witajcie.
Mam nadzieję, że nikt na mnie nie na krzyczy, za głupie pytania.
Tworzę aplikację. Postanowiłem umieścić główne funkcje programu w oddzielnych DLL-ach razem z formami i ramkami. Trochę kodu.

Główne okno aplikacji.

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus;

type
  TDuoArray = array of array of string;
  TfrmMain = class(TForm)
    MainMenu1: TMainMenu;
    mmProducts: TMenuItem;
    mmPurchase: TMenuItem;
    mmSell: TMenuItem;
    procedure mmProductsClick(Sender: TObject);
    procedure mmPurchaseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  frmRamka: TFrame;
  
implementation

{$R *.dfm}

uses DM, ADODB;

procedure ShowProducts; stdcall; external 'productsDynamic.dll' name 'ShowProducts';

procedure TfrmMain.mmProductsClick(Sender: TObject);
begin
  Data.adsProducts.Active := False;
  ShowProducts;
  Data.adsProducts.Active := True;
end;

end.

Kod główny biblioteki dll:

library productsDynamic;

uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  ProductsDLL in 'ProductsDLL.pas' {frmProductsDLL: TFrame},
  NewEditProductDLL in 'NewEditProductDLL.pas' {Form1},
  Main;

{$R *.res}

var frmRamka : TfrmProductsDLL;

procedure ShowProducts; stdcall;
begin
  frmRamka := TfrmProductsDLL.Create(Application);
  frmRamka.Parent := frmMain;
end;

exports
  ShowProducts name 'ShowProducts';

begin
end.

Kodu ramki nie zamieszczam, bo nie ma ona znaczenia.

Kiedy klikam w pozycję menu w głównym oknie, powinna pojawić się ramka. Niestety nie pojawia się. Ale jest tworzona, bo kiedy ponownie klikam tą pozycję menu, wyskakuje błąd z informacją, że taki TFrame już jest.
Co robię źle?
Jeśli ktoś zakwalifikuje tego posta jako newbie, nie obrażę się. :)

0

Podpowiem jak ja sobie kiedyś poradziłem z tworzeniem GroupBoxa w zabawach z dllkami dawno temu. I podejrzewam, że dla TFrame można spróbować podobnie. Poniżej przykładowy kod.

library dllka_do_testow;

uses
  Windows, Controls, Forms, StdCtrls, Graphics;

{$R *.res}

procedure TworzGroupBox(Komponent_Rodzic: TForm; Handle: HWND);
var
  GroupBox1 : TGroupBox;
begin
  with Komponent_Rodzic do
  begin
    GroupBox1 := TGroupBox.Create(Komponent_Rodzic);
    GroupBox1.ParentWindow := Handle;
    GroupBox1.Color := clBtnFace;
    GroupBox1.Name := 'Grp';
    GroupBox1.Caption := 'Test';
  end;
end;

exports
  TworzGroupBox;

begin
end.
0

Nie wiem czy pomoże - zobacz - prosty przykład z tframe w dll-ce z dopisanymi: konstruktorem i destruktorem dla tframe.

0

No niestety. Żadna z podpowiedzi nie działa. Ramka się niejako wczytuje, ale nie widać jej na formie. Co jest nie tak?? Co więcej. W przypadku konstruktora przy wyjściu z aplikacji pojawia się błąd.

0

Dołączam cały projekt.
Wytknijcie mi moje błędy. ;)

0

Trochę podebugowałem, potestowałem i już głupi jestem.
Dodałem następującą linijkę w procedurze ShowProducts.

ShowMessage(BoolToStr(frmRamka.Visible));

Wywaliło mi: -1. Znaczy false. No to dodałem przed tym:

frmRamka.Visible := True;

Build i efekt? Hmm. Taki sam, czyli -1.
No to zadam jeszcze kolejny problem. Przynajmniej dla mnie. Jak zrobić program, aby TDataModule było w dll? Dodatkowo, żeby z głównego programu oraz z innych dll-ek można było korzystać z komponentów umieszczonych w tym TDataModule?
Podpowiedzcie coś, bo już jestem sfrustrowany tym.
Aha. Jeszcze jedno. To co jest w procedurze ShowProducts podmieniałem na różne sposoby. W tej chwili (w tym poście) odwołuję się do mojej pierwotnej wersji, która zamieszczona jest w pierwszym poście.

0

Pomoże ktoś?? Szukałem, grzebałem i nic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1