in einem Programm habe ich die beiden o.g. Komponenten drin.
Die Variable SynCompletion1.ItemList wird bei mir in Abhängigkeit des aktuellen Zeileninhaltes angepasst, das funktioniert auch. Zumindest hat die TStringList die gewünschten Zeichenketten.
Als Beispiel soll die Eingabe von Namen in Formulartexten vereinfacht werden. Die Namen stammen aus einer Liste. Wenn der Name nicht existiert, wird er später in die Liste mit aufgenommen (Auswertung des Inhaltes).
In meinem SynEdit trage ich dann ein:
Code: Alles auswählen
N= hier wird die gesamte Liste angezeigt.
N=Meyer hier werden alle Meyers und "Bindestrich-Mayers" angezeigt
N=Meyer, P hier wird dann gleich auf den Peter vervollständigtDas funktioniert bei mir aber nicht. Im Programmrumpf, also nur die beiden Komponenten und bisschen Menü ging es noch.
Jetzt wird die Liste nicht mehr angezeigt. Nur Variante 3. geht.
An der Befüllung der Variable SynCompletion1.ItemList liegt es nicht. Mein "Peter Meyer" wird auch richtig ersetzt, wenn ich STRG-SPACE drücke.
Der Fehler tritt auf, wenn ich den Formulardesigner nehme und auch wenn TSynCompletion im Quelltext mit .Create erzeuge.
Mir erscheint auch die Zuordnung von TSynEdit und TSynCompletion eigenartig. Ich würde erwarten, das TSynCompletion dem TSynEdit zugewiesen wird (analog wie HighLighter) und nicht umgekehrt über SynCompletion1.Editor:=SynEdit;
Woran kann es denn liegen?
- Hat mein Lazarus zu viel Patina (Lazarus 1.0.2 r39019 FPC 2.6.0 i386-win32-win32/win64) ?
- muss ich die Anzeige der Liste erzwingen?
- Mich dünkt, ich brauche OnExecute etc nicht. Für den o.g. Fall geht's ja.
Code: Alles auswählen
procedure TfrmSYEMain.FormCreate(Sender: TObject);
begin
SynCompletion1 := TSynCompletion.Create(self);
SynCompletion1.Editor := TSynEdit1;
SynCompletion1.ItemList.Text := defaultAutoComplete; //Zeichenkette mit sinnvollen Vorbelegungen
end;
procedure TfrmSYEMain.SynEdit1Change(Sender: TObject);
var
s: string;
begin
if SynEdit1.Lines.Text <> '' then
begin
s := SynEdit1.Lines.Strings[SynEdit1.CaretY - 1];
SynCompletion1.ItemList.Text := ModAutoCompleteList(s); //Funktion zur Befüllung
end;
end;jrx