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.