Delphi-PRAXiS
Seite 1 von 3  1 23      

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 "Element '' hat kein übergeordnetes Fenster" (https://www.delphipraxis.net/86317-element-hat-kein-uebergeordnetes-fenster.html)

xZise 12. Feb 2007 15:42


"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.ä.

yörsch 12. Feb 2007 15:48

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...

xZise 12. Feb 2007 15:54

Re: "Element '' hat kein übergeordnetes Fenster"
 
Du meinst:

Delphi-Quellcode:
constructor Create(AOwner : TComponent)
???
Ist schon so... Die Listbox hat auch dessen Owner...

yörsch 12. Feb 2007 16:01

Re: "Element '' hat kein übergeordnetes Fenster"
 
Gib mal einen codeschnipsel vielleicht fällt mir auf :roll:

xZise 12. Feb 2007 16:06

Re: "Element '' hat kein übergeordnetes Fenster"
 
Die Create Methode:
Delphi-Quellcode:
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;
Und ggf. wichtig:
Die Property der ListBox:
Delphi-Quellcode:
  published
    property CompletionList : TStringList read FCompletionList write FCompletionList;

DGL-luke 12. Feb 2007 16:09

Re: "Element '' hat kein übergeordnetes Fenster"
 
bitte ersma Parent zuweisen.

Sidorion 12. Feb 2007 16:14

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.

yörsch 12. Feb 2007 16:39

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...

xZise 12. Feb 2007 17:13

Re: "Element '' hat kein übergeordnetes Fenster"
 
Zitat:

Zitat von DGL-luke
bitte ersma Parent zuweisen.

Wovon? Wenn du das Memofeld meinst => inherited, wenn du die ListBox meinst => Create von dem Memofeld:
Delphi-Quellcode:
completionBox.Parent := AOwner as TWinControl;
Zitat:

Zitat von yörsch
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...

Ich verstehe nicht, warum das so wichtig ist, weil die StringList nicht an der ListBox hängt. Nur wenn sie angezeigt wird (was sie nicht wird), wird die gebraucht.

xZise hat folgendes hinzugefügt:
Das funktioniert nicht:
Zitat:

---------------------------
Fehler
---------------------------
nil kann nicht zu TRichEditStrings zugewiesen werden.
---------------------------
OK Details >>
---------------------------




Zitat:

Zitat von Sidorion
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.

Ich werde mal gucken...

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.

xZise 14. Feb 2007 14:16

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 04:05 Uhr.
Seite 1 von 3  1 23      

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