TForm z DLL - do execa

TForm z DLL - do execa
migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370
0

Chciałbym zrobić cos takiego : jest sobie exec i dll`ka.
Biblioteczka zawiera formę, którą chce zagnieździć w np. panel1 formy glownej programu. Ma ktoś jakieś pomysły? :D


AklimX
  • Rejestracja:prawie 22 lata
  • Ostatnio:prawie 14 lat
  • Postów:1218
0

na co ? na zagnieżdżenie do panelu, ładowanie z dll czy coś jeszcze innego ??


Piszę programy w językach: C, C++, Java, Python, Bash, PHP, SQL.
Przyjmuję zlecenia
migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370
migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370
0

Sorry, zle przeczytalem pytanie :P
Ogolnie, to znaczy co i jak przekazywać :P

Probowalem czegos takiego:
Dll:
procedure CreateFrm(parent:pointer);
begin
Form1:=TForm1.Create(pointer);
Form1.Parent:=(pointer as TWinControl);
Form1.Show;
end;

a w execu: CreateFrm(Panell1)
Ale nie wychodzlilo ;(


brodny
  • Rejestracja:ponad 22 lata
  • Ostatnio:prawie 11 lat
0

W jednym ze swoich programów zrobiłem po prostu tak:

Kopiuj
function ShowPrinters(AParent: TWinControl): TForm;
begin
  Result := TPrintersFrm.Create(Application);
  with Result do
  begin
    Parent := AParent;
    BorderStyle := bsNone;
    BorderIcons := [];
    Left := 0;
    Top := 0;
    Align := alClient;
    Show;
  end;
end;

TPrintersFrm to typ formularza pokazywanego na Panelu. Funkcja przy okazji zwraca wskaźnik do formularza, aby można go było zwolnić, gdy już nie będzie potrzebny.


Mam nadzieję, że pomogłem :) Łukasz Brodny
migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370
0

W jednym ze swoich programów zrobiłem po prostu tak:

Kopiuj
function ShowPrinters(AParent: TWinControl): TForm;
begin
  Result := TPrintersFrm.Create(Application);
  with Result do
  begin
    Parent := AParent;
    BorderStyle := bsNone;
    BorderIcons := [];
    Left := 0;
    Top := 0;
    Align := alClient;
    Show;
  end;
end;

TPrintersFrm to typ formularza pokazywanego na Panelu. Funkcja przy okazji zwraca wskaźnik do formularza, aby można go było zwolnić, gdy już nie będzie potrzebny.

W zasadzie brzmi niezle,ale... Nie działa... Może źle używam? Robie to tak:

Kopiuj
ShowPrinters(Panel1);

a deklaruje tak: function ShowPrinters(AParent: TWinControl): TForm;external 'project1.dll';

Kopiuj
 a oczywiscie w project1.dll jest ta funkcja w exports :P. Jak klikam na button1 (do ktorego jest przypisane uzycie funkcji) to nie dzieje sie nic a jak wylaczam program to sie pojawia blad Acces Violation...  :-/ 

brodny
  • Rejestracja:ponad 22 lata
  • Ostatnio:prawie 11 lat
0

Hmm, ciężko mi powiedzieć bez kodu... Ja to miałem w EXE :) Może ew. spróbuj zrobić tak:

Kopiuj
function ShowPrinters(AParent: Longint): Longint;
begin
  Result := Longint(TPrintersFrm.Create(TWinControl(AParent)));
  with TForm(Result) do
  begin
    Parent := TWinControl(AParent);
    BorderStyle := bsNone;
    BorderIcons := [];
    Left := 0;
    Top := 0;
    Align := alClient;
    Show;
  end;
end;

Czyli przekazuj zwykłe Longinty zamiast "kompletnych" obiektów. Później sprawę załatwisz poprzez rzutowanie. Jak nie działa, to może zamieść kod, który powoduje problem.

// DOPISANE:
Podaj kod, który powoduje ten problem, to postaram się coś wykombinować.


Mam nadzieję, że pomogłem :) Łukasz Brodny
migajek
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 6 lat
  • Postów:370

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.