Announcement

Collapse
No announcement yet.

D6: TreeView und Frames

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • D6: TreeView und Frames

    Wieder ein Bug mit Frames:

    Ein Hauptfenster und ein Frame, auf dem Frame ein TTreeView.
    Das Frame wird zur Laufzeit ins Hauptfenster eingefügt:

    MyFrame := TMyFrame.create(self);
    MyFrame.parent := self;

    In einer normalen Anwendung klappt alles wunderbar.

    In einer DLL jedoch bekomme ich beim Erstellen des Frame die folgende Exception (EInvalidOperation):
    "Element 'MyFrame' hat kein übergeordnetes Fenster"

    Kann ja auch nicht, weil ich parent ja erst in der Zeile darauf setze.
    Seltsamerweise funktioniert es in einer normalen Anwendung...

    Beispielquelltext folgt...

  • #2
    Ich habe das gleiche Problem bei der Entwicklung COM-Server-DLL. Das Frame enthält eine von TCustomListbox abgeleitete TSelectionlistbox von TMS. Beim Laden dieser Komponente aus dem Stream wird TListBoxStrings.Add für die Einträge der Selectionlist aufgerufen. Dort wird mirt folgendem Code der Eintrag eingefügt:
    <PRE>
    SendMessage(ListBox.Handle, LB_ADDSTRING, 0, Longint(PChar(S)));
    </PRE>
    Der Aufruf von Listbox.Handle führt zum rekursiven Aufruf von TWinControl.HandleNeeded bis zum Frame. Da dieser noch keinen Parent hat wird TWinControl.CreateWnd aufgerufen. Die Eigenschaft Application.Handle einer DLL ist 0, deshalb ist auch Param.WndParent einer Frame 0. In CreateWnd wird in diesem Fall eine Exception ausgelöst. Weil hier zusätzlich Owner.ComponentState auf csReading abgefragt wird, kommt es beim Laden eines Formular mit Designtime-Frame nicht zu einer Exception.

    In der Hilfe zu Delphi findet sich folgender Hinweis:<BR>
    Weisen Sie beim Schreiben einer DLL, die VCL-Formulare verwendet, ihrer Eigenschaft Application.Handle das Handle des Hauptfensters der zentralen EXE-Datei zu. Damit wird das DLL-Formular Teil der Host-Anwendung. Weisen Sie der Eigenschaft Handle in einer EXE-Datei niemals einen Wert zu.<BR>
    Leider hilft mir das nicht weiter, weil der COM-Server auf in einem WSH-Skript verwendet werden soll. Weiss jemand welches Applikationshandle ich in diesen Fall verwenden kann, oder muß ich wirklich alle Frames zur Designzeit einbinden?

    &#10

    Comment

    Working...
    X