Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 12. Feb 2007, 17:13
Zitat von DGL-luke:
bitte ersma Parent zuweisen.
Wovon? Wenn du das Memofeld meinst => inherited, wenn du die ListBox meinst => Create von dem Memofeld:
completionBox.Parent := AOwner as TWinControl;
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 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.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat