TSynEdit und TSynCompletion, Fehler

Rund um die LCL und andere Komponenten
Antworten
jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

TSynEdit und TSynCompletion, Fehler

Beitrag von jrx »

Hallo,

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ändigt
Wenn die Zeichenkette nicht erkannt wird, also ein dem Programm unbekannter Name verwendet wird, poppt auch keine Liste hoch.

Das funktioniert bei mir aber nicht. Im Programmrumpf, also nur die beiden Komponenten und bisschen Menü ging es noch. :x

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;
Bitte um Tipps. Vielen Dank.
jrx

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von Michl »

Hallo,

es gibt unter den Examples ein Beispiel (Lazarus\examples\SynEdit\Completion\SynCompletionSample), wie das mit der Vervollständigung funktioniert (Ctrl + Space öffnet dort das SynCompletionPopup).

Da ich das auch mal für etwas anderes testen wollte, habe ich ein Beispiel mit einer Vervollständigung erstellt, was sich nach Eingabe von 2 Buchstaben öffnet (PopUp ähnlich des Vervollständigers der IDE, Ctrl + Space geht hier aber nicht). Kannst Du dir ja mal ansehen, wenn Du willst (geht evtl. auch einfacher)?!

PS: Du solltest unbedingt Dein Lazarus mal updaten, k.A., ob die Beispiele bei Dir funktionieren - es geht mit großen Schritten auf Lazarus 1.4 zu!
Dateianhänge
Synedit.zip
(738.3 KiB) 101-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von jrx »

Hallo Michl,

wenn ich mein Programm eindampfe, bleibt das Beispiel übrig :-(.
Ich hatte zwar die Befüllung von SynCompletion1.ItemList.Text etwas anders gelöst, aber die simple 1:1 Übertragung von DoExecute und DoSearchPosition aus dem Beispiel ("SynCompletion1.ItemList.Add('bla');") ändert auch nichts.

Es wird auch immer die richtige TStringlist erzeugt, was ich mit dem Schnipsel auch sehen kann.

Code: Alles auswählen

procedure TfrmSYEMain.Button1Click(Sender: TObject);
begin
  ShowMessage(SynCompletion1.ItemList.Text);
end; 


irgendwas behindert das erscheinen der Liste. Es gibt nur ein Flickern auf dem Schirm. Der sinnvollste Weg wäre wohl, ausgehend vom Beispiel, alles noch mal zu schreiben. Das "Warum" bleibt aber.
:|

Irgend was habe ich wohl verwurschtelt, Das Beipielprogramm funktioniert.
Kann es sein, das was mit den Tastatur-Events was nicht passt?
Aber wenn der Focus im SynEdit ist, sollte es da auch ausgewertet werden, bzw. SynCompletion wertet dessen Eingaben aus, weil wir ja den Editor zugewiesen haben.

Was bleibt ist Verzweiflung und der Durst nach Bier.
Schönes Wochenende
jrx

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von Michl »

Hallo jrx,

kannst Du nicht einfach ein Minimalbsp. hier hochladen und beschreiben was dann nicht funktioniert und wie es Deiner Meinung nach funktionieren sollte. Evtl. kann man Dir dann etwas mehr Hilfe bieten?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von jrx »

Hallo Michl,

ich hab noch mal alles "nachvollzogen" und stehe vor einem Rätsel,

Wenn ich das Programm neu aufbaue, so mit Formulareditor, dann geht alles.
Wenn ich mein Programm abspecke, dass das gleiche übrigbleibt, geht's nicht.

Hier die Quelltexte, das Beispiel noch mal abgespeckt. Die 6 Zeichenketten werden ersetzt. In meinem Code war hier eine umfangreichere Function drin. Es geht aber auch nach dem Ersetzen mit dem dargestellten nicht.
Auf dem Formular ist nur Synedit und SynCompletion. In letzterem ist die Editoreigenschaft .Editor noch auf Synedit gesetzt und die die beiden procedures geschrieben.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
  SynCompletion, SynEdit, StdCtrls, ComCtrls, ExtCtrls;
 
type
  { TForm1 }
  TForm1 = class(TForm)
    SynCompletion1: TSynCompletion;
    SynEdit1: TSynEdit;
    procedure SynCompletion1Execute(Sender: TObject);
    procedure SynCompletion1SearchPosition(var aPosition: integer);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
{ TForm1 }
 
procedure TForm1.SynCompletion1Execute(Sender: TObject);
 
  procedure Add(s: string);
  begin
    if pos(lowercase(SynCompletion1.CurrentString), lowercase(s)) = 1 then
      SynCompletion1.ItemList.Add(s);
  end;
 
begin
  SynCompletion1.ItemList.Clear;
  Add('Personal Computer');
  Add('Personal');
  Add('Computer');
  Add('Police Constable');
  Add('Police');
  Add('Constable');
end;
 
procedure TForm1.SynCompletion1SearchPosition(var aPosition: integer);
 
  procedure Add(s: string);
  begin
    if pos(lowercase(SynCompletion1.CurrentString), lowercase(s)) = 1 then
      SynCompletion1.ItemList.Add(s);
  end;
 
begin
  SynCompletion1.ItemList.Clear;
  Add('Personal Computer');
  Add('Personal');
  Add('Computer');
  Add('Police Constable');
  Add('Police');
  Add('Constable');
  if SynCompletion1.ItemList.Count > 0 then
    APosition := 0
  else
    APosition := -1;
end;
 
end.             


Ich werde mal in Ruhe alle Abhängigkeiten und auch die Reihenfolgen der Units vergleichen. Irgendwo ist da der Wurm drin. Die Komplexität übersteigt m.E. die Möglichkeiten der Anzeige in einem Forum.
Wie gesagt, die Proceduren SynCompletion1Execute und SynCompletion1SearchPosition funktionieren. Die Liste wird einfach nicht angezeigt.
Die Auswertung nach Eingabe z.B. "Co" + Strg-Space geht. Das sieht man. wenn man sich SynCompletion1.ItemList.Text ausgeben läßt. Da steht dann wie erwartet der "Computer" und der "Constable" drin.

Vielleicht hat noch jemand einen Tipp.

Grüße jrx

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von Michl »

Hallo jrx,

kannst Du nicht dieses minimierte Bsp. (*.pas, *.lps, *.lfm, *.lpi, *.res etc), als Zip (nicht die *.exe) hier hochladen?! Das erspart das Nachbauen und zeigt mögliche gesetzte Eigenschaften, verknüpfte Events etc., was sonst alles nur Spekulation wäre. Gerade, wenn es sich um einen Bug handelt, müsste man wissen, ob der nur unter Win oder Linux zu finden ist, das geht nur mit einem kompletten Beispiel, was jeweils entsprechend getestet wird.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: TSynEdit und TSynCompletion, Fehler

Beitrag von jrx »

Wie vermutet, folgendes zur Lösung:
- Löschen der beiden Componenten
- Auskommentieren der betroffenen Quelltextzeilen.
- Refactoring: Entfernen unbenutzter Units
- Alles schön speichern und Compilieren
- Wieder einbauen der beiden Componenten im Formulardesigner

Hätte man ja auch gleich so machen können.
Mein System ist auch nicht aktuell, ich habe einen "Spiegel" auf Arbeit und kann da nur schlecht neue Versionen installieren, weil wir paranoide Admins haben.
Zippen und exe und alles was so mit Compilern zu tun hat, macht die ganz wuschig.

jrx

Antworten