![]() |
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:
Geladen wird so:
function GetMainForm: HWND; stdcall;
begin Result := TfrmDLL.Create(nil).Handle; end;
Delphi-Quellcode:
Anschliessend zeige ich irgendwo das Form an, und zwar mit
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);
Delphi-Quellcode:
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.
ShowWindow(TTBXItem(Sender).Tag, SW_SHOW);
Greetz alcaeus |
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 ;)
|
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:
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 :)
SendMessage(Module.ModuleFormHandle, CM_RECREATEWND, 0, 0);
Greetz alcaeus |
Re: Form aus DLL wird nur teilweise angezeigt
Hast du schon versucht mit Invalidate(Rect) ein neuzeichnen des Formulars zu veranlassen ?
|
Re: Form aus DLL wird nur teilweise angezeigt
Hallo Julius,
Zitat:
Delphi-Quellcode:
Geholfen hat dies leider nicht. Hat sonst noch jemand einen Tipp fuer mich? So langsam verzweifle ich an der Sache :roll:
GetWindowRect(Module.ModuleFormHandle, ModuleRect);
InvalidateRect(Module.ModuleFormHandle, @ModuleRect, True); Greetz alcaeus |
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:
Falls es Dir hilft... :cat:
function ShowModalfrm:integer;stdcall;
begin with TfrmDLL.Create(nil) do result := ShowModal; end; MfG :) |
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 |
Re: Form aus DLL wird nur teilweise angezeigt
Zitat:
![]() Könnte vielleicht interessant für dein Projekt sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz