Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi eingebettete DLL-Form, Scrollbar Problem (https://www.delphipraxis.net/68768-eingebettete-dll-form-scrollbar-problem.html)

jensw_2000 5. Mai 2006 08:18


eingebettete DLL-Form, Scrollbar Problem
 
Ich habe eine Anwendung eingebetteten Formularen (DLL basiert).
Diese funktioniert soweit zufriedenstellend, jedoch sind bisher alle Versuche Scrollbalken bei Größenänderung der Hauptanwendung darzustellen erfolglos geblieben.
Die DLL-Forms werden auf einem Panel der Hauptanwendung mit CreateParented dargestellt.

Zur Zeit versuche ich es auf folgenden Weg:
Ich sende im OnResize der Hauptanwendung eine Message an das eingebettete DLL Formular, die der Form die aktuelle Größe des "Patent-Panels" (PluginTarget) mitteilt.
Delphi-Quellcode:
SendMessage( AdsPlugins[CurrentPluginIndex].Plugin.PluginFormHandle,
             WM_MainAppResize,
             PluginTarget.Width,
             PluginTarget.Height );
Das DLL-Formular hat einen entsprechenden Eventhandler für die Message.

Delphi-Quellcode:
procedure TPluginForm.onWM_MsgAppResize(var message: TMessage);
begin
  // DLL Form positionieren und Größe an den "Parent-Panel anpassen"
  Align:=alNone;
  Top:=0;
  Left:=0;
  Height:=Message.lParam;
  Width:=Message.WParam;
  AutoScroll:=true;
 
  // alle Steuerelemente der DLL Form liegen auf einem Panel ("BgPanel")
  // dieser wird nun konfiguriert
  With BgPanel do
  begin
    Top:=0;
    Left:=0;
    Constraints.MinHeight:=680;
    Constraints.MinWidth:=850;
    Width:=ClientWidth;
    Height:=Clientheight;
  end;

end;
Funktioniert leider nicht. Die Größe der DLL-Form wird zwar angepasst und stimmt, aber wenn die Größe des "ParentPanels" die in den BgPanel.Contraints festgelegten Minimalablessungen unterschreitet zeigt die DLL-Form die Scrollballken nicht an, sondern schiebt sich über den "Bildrand".

Ich habe schon 100 andere Wege probiert und kapituliere :?

Unter anderem habe ich folgendes erfolglos getestet:
- Scrollbox auf der DLL-Form
- Scrollbox auf dem "Parent-Panel"
- AutoScroll in Hauptanwendung
- AutoScroll in DLL-Form
- Scrollbars in Hauptanwendung erzwingen mit ShowScrollBar(handle, SB_BOTH, true);
- Scrollbars in DLL-Form erzwingen mit ShowScrollBar(handle, SB_BOTH, true);
- diverse Varianten von Align und SetBounds

Ich bin ratlos.

Kann mit jemand erklären wie automatisch Scrollbars bekomme, wenn die Hauptanwendung kleiner ist als das eingebettete DLL-Formular ?



Schöne Grüße,
Jens
:hi:

Igotcha 5. Mai 2006 11:41

Re: eingebettete DLL-Form, Scrollbar Problem
 
Aus Erfahrung kann ich nur sagen, vergiss DLL-Forms in Form von Fenstern, die Du innerhalb Deiner Anwendung anzeigen willst.

Als modales Fenster von mir aus, aber als eingebettetes Fenster hast Du viele Probleme, da Deine Anwendung und Deine DLL-Form kein gemeinsames Application-Objekt benutzen und somit normalerweise automatisch stattfindende Aktionen (Resizing, Tab-Funktion, etc.) hier nicht funktionieren.

Ich habe damit auch eine Weile gekämpft bis ich auf BPLs umgestiegen bin und mit denen funktioniert das absolut problemlos.

Viele Grüße
Igotcha

himitsu 5. Mai 2006 12:48

Re: eingebettete DLL-Form, Scrollbar Problem
 
Zitat:

Zitat von Igotcha
... da Deine Anwendung und Deine DLL-Form kein gemeinsames Application-Objekt benutzen und somit normalerweise automatisch stattfindende Aktionen (Resizing, Tab-Funktion, etc.) hier nicht funktionieren.

Da viele mir nur ein, daß man Application in der DLL auf Application in der EXE umleiten muß ... sind ja nur Objekte ... also wenn man beim Initiiren der DLL alles was mit Application(DLL) abhängig ist auf Application(EXE) überträgt und dann den Zeiger von Application(DLL) mit dem von Application(EXE) überschreibt, dann sollte das Problem doch behoben sein :gruebel:
(klingt für mich allerdings nach massig Arbeit)

[add]
ach ja ... beim/vorm Freigeben der DLL müßte man das natürlich auch wieder rückgängig machen -.-''

Bernhard Geyer 5. Mai 2006 12:54

Re: eingebettete DLL-Form, Scrollbar Problem
 
Zitat:

Zitat von himitsu
Da viele mir nur ein, daß man Application in der DLL auf Application in der EXE umleiten muß ... sind ja nur Objekte ... also wenn man beim Initiiren der DLL alles was mit Application(DLL) abhängig ist auf Application(EXE) überträgt und dann den Zeiger von Application(DLL) mit dem von Application(EXE) überschreibt, dann sollte das Problem doch behoben sein :gruebel:

Diesen "Trick" darfst Du auch nur machen wenn die DLL und die Exe mit der identischen Delphi-Version und vermutlich auch mit den gleichen Compiler-Optionen kompiliert sind. Ansonsten haben deine Objekte unterschiedliches Speicherlayout und es kracht. Und auch wenn Du das hinbekommen würdest vermute ich das es noch an 1000 anderen Stellen kracht

Also wenn schon "lebende" Objekte austauschen dan Laufzeitpackages verwenden. Ansonsten alles auf WinAPI-Ebene mit Handels usw. erledigen.

himitsu 5. Mai 2006 12:59

Re: eingebettete DLL-Form, Scrollbar Problem
 
Nicht austauschen ... einfach nur alles was Application zugeordnet ist abfragen und der anderen Application übertragen ...
aber hab ja gesagt, daß es nach massig Arbeit klingt ... vorallem da man dann bei der Übertragung wirklich nichts vergessen dürfte -.-''

Notfalls könnte man ja auch drüben(EXE) die Objekte als Kopie neu erstellen und hier(DLL) löschen.

nitschchedu 5. Mai 2006 13:12

Re: eingebettete DLL-Form, Scrollbar Problem
 
Habe da mal ne Frage ? Wie hast du es geschaft das Forms aus der Dll zuladen kannst du mir da mal ein Bsp. Projekt Posten oder per Mail schicken wäre ganz toll

jensw_2000 5. Mai 2006 17:21

Re: eingebettete DLL-Form, Scrollbar Problem
 
Zitat:

Zitat von nitschchedu
Habe da mal ne Frage ? Wie hast du es geschaft das Forms aus der Dll zuladen kannst du mir da mal ein Bsp. Projekt Posten oder per Mail schicken wäre ganz toll

Ich bin heute erst gegen 23:00 Uhr von der Arbeit zurück. Dann sende ich dir ein Beispiel.
Falls du es schneller haben willst, schau einfach mal hier nach. Das ist verwende ich immer als Basis für meine pluginfähigen Anwendungen.


@All

Ich weiss, das Formulare aus DLL's ein leidiges Thema sind, aber in diesem Fall hat es nichts mit der DLL zu tun ....
Vorhin habe ich testweise eine Instanz eines anderen Formulars der Hauptanwendung mit CreateParented auf dem "DLL-Form"-Panel erzeugt. Da bestelt das Problem genauso.
Keinen Schimmer, was ich da falsch mache ... :gruebel:




Schöne Grüße,
Jens
:hi:

jensw_2000 6. Mai 2006 10:56

Gelöst: eingebettete DLL-Form, Scrollbar Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gewonnen ! :dancer:

Ich habe ein Lösung für das Scrollbar-Problem gefunden.
Forms aus DLL's müssen in der Tat anders behandelt werden als Forms aus Packages (bzw. eingebettete Forms).

Für alle, die mal vor dem selben Problem stehen habe ich mein kleines Spielprojekt mit angehängt.
Die Source-Kommentierung musste ich aus Zeitgründen weglassen. Das Code ist aber relativ simpel gestrickt.

Schöne Grüße,
Jens

nitschchedu 7. Mai 2006 14:02

Re: eingebettete DLL-Form, Scrollbar Problem
 
Danke ganz toll von dir !! Sieht auch cool aus aber wo bekomme ich nun die ExceptionLog her ?

jensw_2000 7. Mai 2006 23:00

Re: eingebettete DLL-Form, Scrollbar Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von nitschchedu
Danke ganz toll von dir !! Sieht auch cool aus aber wo bekomme ich nun die ExceptionLog her ?

Die ExceptionLog kannst du einfach aus der Uses-Liste werfen. Sie gehört zu Eurekalog.
Ich habe leider bei der Hauptanwendung übersehen, den Exceptionhandler zu deaktivieren.

In der Anlage hängt auch noch einmal das bereinigte Projekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.
Seite 1 von 2  1 2      

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