Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Form aus DLL wird nur teilweise angezeigt (https://www.delphipraxis.net/45781-form-aus-dll-wird-nur-teilweise-angezeigt.html)

alcaeus 12. Mai 2005 09:24


Form aus DLL wird nur teilweise angezeigt
 
Hallo allerseits,

meine DLL-Forms halten mich wiedermal beschaeftigt. Ich hab jetzt das Ganze so umgestellt, dass ich nur mehr ein Handle eines Forms erwarte, und nicht ein TForm-Objekt (damit auch C++-DLLs verwendet werden koennen).
Nun habe ich aber das Problem, dass nicht alles angezeigt wird. Hier mal ein paar Codeschnippsel.
In der DLL geschieht das:
Delphi-Quellcode:
function GetMainForm: HWND; stdcall;
begin
   Result := TfrmDLL.Create(nil).Handle;
end;
Geladen wird so:
Delphi-Quellcode:
Module.DLLFormProc := GetProcAddress(Module.DLLHandle, PChar('GetMainForm'));
//...
Module.ModuleFormHandle := TGetDLLFrm(Module.DLLFormProc);

SetParent(Module.ModuleFormHandle, ModuleParentHandle);
WindowStyle := GetWindowLong(Module.ModuleFormHandle, GWL_STYLE);
WindowStyle := WindowStyle or WS_CHILD;
WindowStyle := WindowStyle and not WS_BORDER;
WindowStyle := WindowStyle and not WS_THICKFRAME;
WindowStyle := WindowStyle and not WS_CAPTION;
WindowStyle := WindowStyle or WS_MAXIMIZE;
WindowStyle := WindowStyle and not WS_SYSMENU;
SetWindowLong(Module.ModuleFormHandle, GWL_STYLE, WindowStyle);
SetWindowPos(Module.ModuleFormHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
ShowWindow(Module.ModuleFormHandle, SW_HIDE);
Anschliessend zeige ich irgendwo das Form an, und zwar mit
Delphi-Quellcode:
ShowWindow(TTBXItem(Sender).Tag, SW_SHOW);
Das Handle des Forms wird ins Tag des TBX-Buttons geschrieben, welcher die Anzeige regelt. Das Problem ist hierbei nicht, dass das Form nicht angezeigt wird, sondern dass nicht alles angezeigt wird. Ich hab 3 Labels, 1 StaticText, ein Memo und eine TBXToolbar auf dem Form, aber ich sehe nur die 3 Labels. Muss ich noch irgendwelche Messages ans Form schicken, damit es sich neu zeichnet oder so? Waere nett wenn mir jemand weiterhelfen koennte.

Greetz
alcaeus

Mephistopheles 13. Mai 2005 10:48

Re: Form aus DLL wird nur teilweise angezeigt
 
Gucke mal im VCL-Source nach den Fensternachrichten die mit CM_* beginnen. Durch diese privaten WMs regelt die VCL ihre Dinge. Ansonsten hilft wohl nur die Arbeit mit Interfaces ;)

alcaeus 14. Mai 2005 08:59

Re: Form aus DLL wird nur teilweise angezeigt
 
Also ich hab jetzt mal versucht, an das Form die CM_RECREATEWND-Message zu senden:
Delphi-Quellcode:
SendMessage(Module.ModuleFormHandle, CM_RECREATEWND, 0, 0);
Dies hatte nur zur Folge, dass ich gar nichts mehr gesehn hab, nichtmal die Labels. Die anderen Messages haben mir nicht zugesagt, also waere ich fuer jeden Tipp dankbar :)

Greetz
alcaeus

jfheins 14. Mai 2005 10:21

Re: Form aus DLL wird nur teilweise angezeigt
 
Hast du schon versucht mit Invalidate(Rect) ein neuzeichnen des Formulars zu veranlassen ?

alcaeus 14. Mai 2005 21:09

Re: Form aus DLL wird nur teilweise angezeigt
 
Hallo Julius,

Zitat:

Zitat von jfheins
Hast du schon versucht mit Invalidate(Rect) ein neuzeichnen des Formulars zu veranlassen ?

da Invalidate eine Member-Funktion von TControl ist faellt die Funktion mal flach. Nach einem Blick in die Sourcen habe ich allerdings InvalideRect gefunden. Ich habs so aufgerufen:
Delphi-Quellcode:
GetWindowRect(Module.ModuleFormHandle, ModuleRect);
InvalidateRect(Module.ModuleFormHandle, @ModuleRect, True);
Geholfen hat dies leider nicht. Hat sonst noch jemand einen Tipp fuer mich? So langsam verzweifle ich an der Sache :roll:

Greetz
alcaeus

Johnny_W 15. Mai 2005 00:25

Re: Form aus DLL wird nur teilweise angezeigt
 
Hi alcaeus,

Dein "Problem" klingt interessant.
Habe deinen Fehler hier mal reproduziert.3 Labels, 1 Memo. Mir "fehlt" das Memo. Versuche die Komponente neu zu zeichnen fielen auf die schnelle auch fehl. :gruebel:
Umgangen habe ich das erstmal mit:
Delphi-Quellcode:
function ShowModalfrm:integer;stdcall;
begin
  with TfrmDLL.Create(nil) do
    result := ShowModal;
end;
Falls es Dir hilft... :cat:

MfG :)

alcaeus 15. Mai 2005 08:58

Re: Form aus DLL wird nur teilweise angezeigt
 
Hallo Johnny,

nicht ganz. Die Forms die ich lade sollen zuerst mal dahinvegetieren, bis der Anwender auf den Button fuers entsprechende Modul klickt. Sobald er das macht, soll das Form auf dem Panel gezeichnet werden. Gleich am Anfang ShowModal aufzurufen klappt also leider nicht.
Trotzdem Danke fuer den Tipp.

Greetz
alcaeus

Sprint 15. Mai 2005 09:29

Re: Form aus DLL wird nur teilweise angezeigt
 
Zitat:

Zitat von alcaeus
Nun habe ich aber das Problem, dass nicht alles angezeigt wird. Hier mal ein paar Codeschnippsel.

http://delphi.about.com/library/weekly/aa020805a.htm

Könnte vielleicht interessant für dein Projekt sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz