Forma w DLL

Odpowiedz Nowy wątek
2003-05-22 01:15
Rav
0

Witam,
Mam formę w dll'u i wywołuję ją sobie jako ShowModal czyli jak wywołam tą formę to nie mogę korzystać z programu dopóki nie wyłączę tego okienka.
Moje pytanie brzmi czy i jeżeli tak to jak można wyświetlić inaczej tą formę - tzn. chodzi mi o odpowiednik Form2.Show - wtedy mogę nadal korzystać z Form1.
Przy moich próbach forma się pojawiała i zaraz znikała - co było raczej do przewidzenia bo w dll było Form.Free;

Jak więc przerobić ten kod:

function ShowPlugin (hnd: THandle): Integer; stdcall;
var
Form : TDLLForm;
begin
Result:=-1;

Application.Handle := Form.Handle;

Form := TDLLForm.Create(Application);
try
Result := Form.ShowModal; // wyswietl - to chciałbym inaczej
finally
Form.Free;
end;
end;

//ps znaczniki delphi sa bardziej przejrzyste od code - moderator

Pozostało 580 znaków

2003-05-22 08:15
0

Nie dawaj w Finally Form.Free tylko ustaw w tej drugiej formie w OnClose Action:=caFree;


Szymek

<span style="color: blue">"Nie twierdzę, że kobiety są głupie,
zostały stworzone na podobieństwo mężczyzn...
"</span> - George Eliot<span style="color: green">

Pozostało 580 znaków

2003-05-22 08:22
0

Możesz to też zrobić ciut inaczej (nie jestem pewien, ale powinno chyba działać). Walnąć sobie w DLL'ku dodatkową procedurę, która zamykała by tę formę.
PS. Nie jestem pewien czy to zadziała, bo nie robiłem jeszcze czegoś takiego, ale zawsze warto spróbować. :)


Grunt to uziemienie...

Pozostało 580 znaków

2003-05-23 01:27
Rav
0

Obawiam się, że się nie zrozumieliśmy. W dll jest jedna forma więc nie rozumiem tekstu:

Nie dawaj w Finally Form.Free tylko ustaw w tej drugiej formie w OnClose Action:=caFree;

To z Form2.Show to był przykład o co mi chodzi. Może inaczej. Chcę aby po naciśnięciu w programie np. Buttona wyświetliła mi się forma z dll ale nie jako FormModal tylko jako Show - analogicznie do tego jak w Outlooku damy Nowa poczta - pojawi się nowe okno i taki efekt chciałbym uzyskać.

Co do drugiej odpowiedzi - być może tym podejściem może uda mi się wykonać to zadanie. Czy ktoś ma jeszcze inne sugestie jak to wykonać?
Z góry dzięki (dzięki za obecne próby wskazania rozwiązania).
Pozdrawiam.

Pozostało 580 znaków

2003-05-23 04:17
0

Moze sprobuj zamiast TDLLForm uzyc zwyklej TForm.
I zastosuj sie do rady Szymka.
Wywal to Free i stworz procke, w ktorej wpiszesz:

begin
Action := caFree.
end;

A potem przypisz ja do OnClose stworzonej formy. Wydaje mi sie, ze powinno dzialac.

Pozostało 580 znaków

2003-05-26 13:46
0

ja tez szukałem i znalazłem bo pokombinowałem spruboj to ale nie gwarantuje ze zadziała

[code]
function ShowPlugin (hnd: THandle): Integer; stdcall;
var
Form : TDLLForm;
begin
Result:=-1;

Application.Handle := Form.Handle;

Form := TDLLForm.Create(Application);
try
Result := Form.Show; // wystarczy usunac modal ale nie jestem pewien bo to juz dawno sie nie bawiłem z dll'kami
finally
Form.Free;
end;
end;
[/code]
jak bys troche pokombinował to bys tez trafił jak ja szukałem na chybił trafił, ale tobie chodzi na pewno by nie było belki na pasku menu to juz musisz poszukac to w gotowcach lub faq, bo juz bylo nawet na forum.
[code]form1.showmodal; //wyswietla z belka na menu
form2.show; //wyswietla bez belki w menu[/code]
o to ci napewno chodzi, ja powiem tyle gdzies gdzie jest showmodal musiasz posukac i pozmieniac w samej dll'ce to ci nic nie da trzeba jeszcze w programie jak ja wywolujesz cos zmienic ale tego ci nie powiem co bo juz nie wiem


..:: DELPHI 6 ::..

Pozostało 580 znaków

2003-05-26 16:34
0

Klaster, DOKŁADNIE to na SAMYM POCZĄTKU napisał Rav, że tak ma i tak NIE CHCE.

W DLLu:

procedure ShowPlugin (hnd: THandle); stdcall;
var
Form : TDLLForm;
begin
Application.Handle := Form.Handle;
Form := TDLLForm.Create(Application);
end;

w OnClose TDLLForm:

Action:=caFree

I nie mów, że bez sensu zanim nie przetestujesz.

[dopisane]
a tak jest NAJLEPIEJ: przeniesienie klasy formy do programu, później można nawet odłączyć bibliotekę.

library Plugin;

uses
Forms,
ueText in 'ueText.pas' {PluginForm};
//przykładowy unit z formą

type
TFormClass = class of TForm;

function GetFormClass: TFormClass;
begin
Result:=TPluginForm;
end;

exports
GetFormClass;

begin
end.

Natomiast w programie:

procedure TForm1.Button1Click(Sender: TObject);
var HLib: THandle;
TmpForm: TForm;
PluginFormClass: TFormClass;
GetFormClass: function:TFormClass;
begin
HLib:=LoadLIbrary(PChar('nazwa DLLa');
@GetFormClass:=GetProcAddress(HLib,'GetFormClass');

PluginFormClass:=GetFormClass;
TmpForm:=PluginFormClass.Create(Application);
TmpForm.Show;
FreeLibrary(HLib)
end;


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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