![]() |
"Element '' hat kein übergeordnetes Fenster"
Ich Bau meine Memo um und schreibe eine Komponente mit einer ListBox.
Problem ist nur, wenn ich dessen repräsetant (die Property) setze, und as "StringList"-Editor-Fenster schliesse, dann kommt die Meldung, dass Element '' kein übergeordnetes Fenster hat. Ich bin auch ratlos, woran es liegen könnte... Wenn ihr Code braucht, dann schicke ich ihn nach (bitte nur einzelene Segemente, wie "Destroy-funktion", "Header" o.ä. |
Re: "Element '' hat kein übergeordnetes Fenster"
Hai, :hi: das Fenster müstest du im create als Referenz mit geben, und dann setzen! dann sollte es gehn...
|
Re: "Element '' hat kein übergeordnetes Fenster"
Du meinst:
Delphi-Quellcode:
???
constructor Create(AOwner : TComponent)
Ist schon so... Die Listbox hat auch dessen Owner... |
Re: "Element '' hat kein übergeordnetes Fenster"
Gib mal einen codeschnipsel vielleicht fällt mir auf :roll:
|
Re: "Element '' hat kein übergeordnetes Fenster"
Die Create Methode:
Delphi-Quellcode:
Und ggf. wichtig:
constructor TCompletionMemo.Create(AOwner: TComponent);
begin inherited; completionBox := TListBox.Create(self); completionBox.Parent := AOwner as TWinControl; completionBox.Width := FCompletionSizeWidth; completionBox.Height := FCompletionSizeHeight; FCompletionList := TStringList.Create; end; Die Property der ListBox:
Delphi-Quellcode:
published
property CompletionList : TStringList read FCompletionList write FCompletionList; |
Re: "Element '' hat kein übergeordnetes Fenster"
bitte ersma Parent zuweisen.
|
Re: "Element '' hat kein übergeordnetes Fenster"
Die Strings von der ListBox werden wie die von der ComboBox vom BS verwaltet. Und das BS kann das erst, wenn die ListBox ein Handle hat. Du kannst mal schaun, ob 'completionBox.HandleNeeded' was hilft. Nen parent zuweisen hilft nicht. Der könnte ja auch noch 'unsichtbar' sein und kein Handle haben.
[edit]: das HandleNeeded nachdem Zuweisen eines Parent schreiben, weil ohne den ist das BS hilflos in Sachen Handle kreieren. |
Re: "Element '' hat kein übergeordnetes Fenster"
Hmm??? Sidorion hat da leiderrecht...
wenn´s möglich ist das TStringList.Create vieleicht zu einem späteren Zeitpunkt ausführen?? also im onShow oder so... |
Re: "Element '' hat kein übergeordnetes Fenster"
Zitat:
Delphi-Quellcode:
completionBox.Parent := AOwner as TWinControl;
Zitat:
xZise hat folgendes hinzugefügt: Das funktioniert nicht: Zitat:
Zitat:
PS: Ich bin noch in der IDE ... Nur damit ihr das nicht durcheinander bringt! xZise hat folgendes hinzugefügt: Das tut es auch nicht :/ Ich habe kein Plan, warum das nicht funktioniert... Vielleichts hilft es ja:
Delphi-Quellcode:
TKeyPress = procedure (Sender: TObject; var Key: Char) of object;
TKeyDown = procedure (Sender: TObject; var Key: Word; Shift: TShiftState) of object; TSize = array [0..1] of Integer; TCompletionMemo = class(TMemo) private FCompletionList : TStrings; completionBox : TListBox; FMoveableCaret: Boolean; preSelect : string; caretPosition : Integer; FCompletionSizeWidth: Integer; FCompletionSizeHeight: Integer; procedure repositionating; procedure SetCompletionSizeHeight(const Value: Integer); procedure SetCompletionSizeWidth(const Value: Integer); protected procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: Char); override; public constructor Create(AOwner : TComponent); override; destructor Destroy; override; published property CompletionList : TStrings read FCompletionList write FCompletionList; property CompletionSizeWidth : Integer read FCompletionSizeWidth write SetCompletionSizeWidth default 80; property CompletionSizeHeight : Integer read FCompletionSizeHeight write SetCompletionSizeHeight default 40; property MoveableCaret : Boolean read FMoveableCaret write FMoveableCaret; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TCompletionMemo]); end; { TCompletionMemo } constructor TCompletionMemo.Create(AOwner: TComponent); begin inherited; completionBox := TListBox.Create(self); completionBox.Parent := AOwner as TWinControl; completionBox.Width := FCompletionSizeWidth; completionBox.Height := FCompletionSizeHeight; completionBox.HandleNeeded; FCompletionList := TStringList.Create; end; destructor TCompletionMemo.Destroy; begin FreeAndNil(completionBox); FreeAndNil(FCompletionList); inherited; end; procedure TCompletionMemo.KeyDown(var Key: Word; Shift: TShiftState); begin {...} inherited; end; procedure TCompletionMemo.KeyPress(var Key: Char); var i : Integer; begin {...} inherited; end; procedure TCompletionMemo.repositionating; var CaretPos : TPoint; begin CaretPos := GetCaretPos; CaretPos := ClientToParent(CaretPos); with completionBox do begin Left := CaretPos.X + 3; Top := CaretPos.Y - Font.Height + 3; end; end; procedure TCompletionMemo.SetCompletionSizeHeight(const Value: Integer); begin FCompletionSizeHeight := Value; completionBox.Height := Value; end; procedure TCompletionMemo.SetCompletionSizeWidth(const Value: Integer); begin FCompletionSizeWidth := Value; completionBox.Width := Value; end; end. |
Re: "Element '' hat kein übergeordnetes Fenster"
Die Frage ist leider immernoch nicht beantwortet :(
Wäre nett, wenn mich mal jemand aufklären könnte... Immerhin gibt es ja auch andere Controls, welche TStrings als Property verwenden... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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