Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi AutoComplete für TMemo, TRichEdit uvm. (https://www.delphipraxis.net/125828-autocomplete-fuer-tmemo-trichedit-uvm.html)

Woodman 15. Dez 2008 09:13

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Zitat:

Zitat von sx2008
Zitat:

Zitat von Woodman
Verzeih' einem Anfänger, das ich Dir nicht ganz folgen kann :wall:
Was ist falsch daran, den Owner mit zu geben?

Du hast ein Klasse TForm1 und eine globale Variable Form1.
Solange es nur ein Formular dieser Klasse gibt ist alles in Ordnung.
Wenn es aber mehrere Formulare der gleichen Klasse gibt, dann können ja nicht alle in der Variable Form1 gespeichert sein.
Das würde dann bedeuten, dass die Autocomplete Komponente auf das falsche Formular zugreift.
Es könnte sogar sein, dass die Variable Form1 = nil ist.
Man kann sich vorstellen, dass das sehr unangenehm werden kann.

Du meinst wahrscheinlich die Klasse TForm!? :P
Aber Spaß beiseite. Es liegt ja in der Verantwortung des Programmieres, welchem Formular er das AutoComplete zuweist.
Delphi-Quellcode:
AutoComplete1 := TAutoComplete.Create(Form1,'TextDatei',Memo1);
Da könnte auch Form2, Form3 oder sonstwas stehen. In der Komponente selbst greife ich ja nicht direkt auf die Form zu. Ich könnte natürlich noch eine Prüfung einbauen etwa
Wenn AOwner = nil dann löse eine Exeption aus.

himitsu 15. Dez 2008 09:29

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Tipps:
warum 'ne lokale Variable, wie z.B. comp, global in der Klase definieren?

als Owner (für die ListView) kannst du entweder das EditControl oder dessen .Parent verwenden.

wenn du in dieser for k:= 0 to wortzahl-1 do-Schleife viele Werte hinzufügen (Items.Add) willst, dann bietet sich Items.BeginUpdate und danach Items.EndUpdate an.
geht so schneller, da dann nichtmehr bei jedem Hinzufügen ein Update der StringList(ListView) ausgeführt wird.

die ListView sollte wieder ausgeblendet werden, wen sie nicht mehr benötigt wird. (z.B. das Edit verliert den Fokus)
in deinem Bild sieht man sogar gleich mehrere von diesen Dingern, zur selben Zeit.



kannst dich ja gern mal etwas umschauen:
  • Strg + Leertaste = Autovervollständigung sofort anzeigen
  • bei Eingabe eine Wortes, ab 3 Zeichen (Standard) Autovervollständigung anzeigen
  • Links/Rechts = Markierung (im Wort) ändern
  • Hoch/Runter/Bild Hoch/Bild Runter = in Liste Auswahl ändern
  • irgendwo hinklicken/ESC/Tab = abbrechen
  • Enter/Item anklicken = auswählen
  • Backspace/Zeichen eintippen = Wort/Auswahl ändern
  • Größe und Position der Auswahlbox ist unter dem EditControl (wenn's da hinpaßt), oder unter dem Cursor/Wort (in Memo und Co.), mit Breite des Controls, oder da, wie es angegeben ist (.Position und .Size)
  • via PopupMenü im Edit Wort hinzufügen
  • und über's PopupMenü der ListView Wort löschen
  • WortListe wird nicht von der Komponente gespeichert ... sollte man also selber machen ;)
    z.B.: If AutoComplete._WordsChanged Then AutoComplete.SaveWordsTo.....
  • Tschuldschung, hab mir mal deine Wörterlisten gemopst



[edit] Datei siehe #17

Woodman 15. Dez 2008 10:53

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Wow, ich erkenne meine Komponente nicht wieder :roll: (Das soll jetzt keine Bewertung sein)
Zitat:

Zitat von himitsu
Tipps:
warum 'ne lokale Variable, wie z.B. comp, global in der Klase definieren?

Warum nicht?(Ist ja als 'private' deklariert)
Zitat:

Zitat von himitsu
...
wenn du in dieser for k:= 0 to wortzahl-1 do-Schleife viele Werte hinzufügen (Items.Add) willst, dann bietet sich Items.BeginUpdate und danach Items.EndUpdate an.
geht so schneller, da dann nichtmehr bei jedem Hinzufügen ein Update der StringList(ListView) ausgeführt wird.

Das sehe ich ein. Das ich die ListView erst auf visible setze wenn die Liste aufgebaut ist, reicht also nicht aus?

Zitat:

Zitat von himitsu
die ListView sollte wieder ausgeblendet werden, wen sie nicht mehr benötigt wird. (z.B. das Edit verliert den Fokus)
in deinem Bild sieht man sogar gleich mehrere von diesen Dingern, zur selben Zeit.

Das war teilweise Absicht (Man sieht auch 2 Mouse-Cursor :P ), aber Du hast recht.

Zitat:

Zitat von himitsu
kannst dich ja gern mal etwas umschauen:
  • Strg + Leertaste = Autovervollständigung sofort anzeigen

  • Gute Idee :thumb:
    Zitat:

    Zitat von himitsu
  • bei Eingabe eine Wortes, ab 3 Zeichen (Standard) Autovervollständigung anzeigen

  • Funktioniert bei meiner Komponente
    Zitat:

    Zitat von himitsu
  • Links/Rechts = Markierung (im Wort) ändern

  • Ok, das funktioniert bei mir nicht.
    Zitat:

    Zitat von himitsu
  • Hoch/Runter/Bild Hoch/Bild Runter = in Liste Auswahl ändern

  • Funktioniert bei mir nur mit Hoch/Runter
    Zitat:

    Zitat von himitsu
  • irgendwo hinklicken/ESC/Tab = abbrechen

  • Funktioniert bei mir mit ESC bzw. non-matching Character
    Zitat:

    Zitat von himitsu
  • Enter/Item anklicken = auswählen

  • Funktioniert bei mir.
    Zitat:

    Zitat von himitsu
  • Backspace/Zeichen eintippen = Wort/Auswahl ändern

  • Funktioniert bei mir.
    Zitat:

    Zitat von himitsu
  • Größe und Position der Auswahlbox ist unter dem EditControl (wenn's da hinpaßt), oder unter dem Cursor/Wort (in Memo und Co.), mit Breite des Controls, oder da, wie es angegeben ist (.Position und .Size)

  • Da hab' ich's mir einfach gemacht, ist immer unter dem Wort bzw. Edit :wink:
    Zitat:

    Zitat von himitsu
  • via PopupMenü im Edit Wort hinzufügen

  • Funktioniert bei mir.
    Zitat:

    Zitat von himitsu
  • und über's PopupMenü der ListView Wort löschen

  • Funktioniert bei mir nicht.
    Zitat:

    Zitat von himitsu
  • WortListe wird nicht von der Komponente gespeichert ... sollte man also selber machen ;)
    z.B.: If AutoComplete._WordsChanged Then AutoComplete.SaveWordsTo.....

  • Das ist Geschmackssache, ich lagere gerne soviel wie möglich aus, so das ich mich im Hauptprogramm nicht mehr drum kümmern muss.
    Zitat:

    Zitat von himitsu
  • Tschuldschung, hab mir mal deine Wörterlisten gemopst

Dafür habe ich sie veröffentlicht.

Aber: Etwas klemmt noch in Deiner Version:
Versuch mal im RichEdit diesen Satz flüssig einzugeben:
Zitat:

Und nicht aus dieser Liste...
Und versuch mal diesen Satz per copy&paste im Memo einzugeben...

sx2008 15. Dez 2008 10:56

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Zitat:

Zitat von Woodman
...Es liegt ja in der Verantwortung des Programmieres, welchem Formular er das AutoComplete zuweist.
Delphi-Quellcode:
AutoComplete1 := TAutoComplete.Create(Form1,'TextDatei',Memo1);
Da könnte auch Form2, Form3 oder sonstwas stehen...

Hmmm... es hat bei dir noch nicht "klick" gemacht.
Ich wiederhole deinen Code vom 1. Beitrag:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   AutoComplete1 := TAutoComplete.Create(self,'worte.txt',Memo1);       // RICHTIG
   AutoComplete2 := TAutoComplete.Create(Form1,'plz.txt',LabeledEdit1); // FALSCH
   AutoComplete3 := TAutoComplete.Create(Form1,'words4.txt',RichEdit1); // FALSCH
end;
Siehst du es jetzt? (weg mit den Tomaten :stupid: )
Du bist innerhalb der Klasse TForm1.
Self ist das aktuelle Objekt, auf dem du gerade arbeitet.
Form1 ist unter Umständen <> self.
Self ist richtig und Form1 ist falsch.
Ich hoffe du hast den Fehler jetzt erkannt.
Du musst zugeben, dass dieser Fehler ziemlich gemein und schwer zu erkennen ist.

Woodman 15. Dez 2008 11:17

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Zitat:

Zitat von sx2008
....Ich wiederhole deinen Code vom 1. Beitrag:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   AutoComplete1 := TAutoComplete.Create(self,'worte.txt',Memo1);       // RICHTIG
   AutoComplete2 := TAutoComplete.Create(Form1,'plz.txt',LabeledEdit1); // FALSCH
   AutoComplete3 := TAutoComplete.Create(Form1,'words4.txt',RichEdit1); // FALSCH
end;
Siehst du es jetzt? (weg mit den Tomaten :stupid: )
Du bist innerhalb der Klasse TForm1.
Self ist das aktuelle Objekt, auf dem du gerade arbeitet.
Form1 ist unter Umständen <> self.
Self ist richtig und Form1 ist falsch.
Ich hoffe du hast den Fehler jetzt erkannt.
Du musst zugeben, dass dieser Fehler ziemlich gemein und schwer zu erkennen ist.

Aua, ich glaube, jetzt hab' ich es :wall: . Ok, das war jetzt mein Fehler im Hauptprogramm und hat nichts mit der Komponente AutoComplete zu tun. Richtig?

sx2008 15. Dez 2008 11:23

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Zitat:

Zitat von Woodman
Ok, das war jetzt mein Fehler im Hauptprogramm und hat nichts mit der Komponente AutoComplete zu tun. Richtig?

Exaktamente. :zwinker: Und weil der Fehler so schwer zu erkennen ist, war mein Rat, den Owner ganz wegzulassen und vom Steuerelement abzugreifen.

himitsu 15. Dez 2008 11:53

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Liste der Anhänge anzeigen (Anzahl: 1)
joar, vielleicht sollte man alle Zeichen (auch die in WordSeparator definierten) an das Edit weiterleiten :oops:


Zitat:

Ok, das war jetzt mein Fehler im Hauptprogramm ...
wie gesagt, am Einfachsten und Fehlerunanfälliger wäre es den Owner garnicht zu übergeben, sondern diesen über das Edit zu beziehen.


Zitat:

Wow, ich erkenne meine Komponente nicht wieder :roll: (Das soll jetzt keine Bewertung sein)
ok, dann dann bedank ich mich auch nicht für das Lob :mrgreen:

Zitat:

Warum nicht?(Ist ja als 'private' deklariert)
diese Variable wird nur kurzzeitig, innerhalb einer Procedur verwendet und auch nur wärend der Laufzeit dieser Prozedur verwendet ... nimmt also erstmal unnötig Platz in der Komponente ein, macht es etwas unübersichtlicher, weil man ja mehr von dieser Variable halten könnte ... es am Ende aber eigentlich nur 'ne lokale Variable einer Prozedur ist
Code:
TAutoComplete = class(TListView)
  ...
private
  [s]comp: TControl;[/s]


constructor TAutoComplete.Create(...
[b]var comp: TControl;[/b]
begin
Zitat:

Das sehe ich ein. Das ich die ListView erst auf visible setze wenn die Liste aufgebaut ist, reicht also nicht aus?
nee, die ganzen Bearbeitungsschritte innerhalb der Komponente laufen ja dennoch ab

Zitat:

Gute Idee :thumb:
hab ich mit von Delphi abgeguckt :stupid:

Zitat:

Da hab' ich's mir einfach gemacht, ist immer unter dem Wort bzw. Edit
Hauptsache es ist da :angel2:
war/ist aber och nicht so leicht es innerhalb des Fensters zu behalten und ist bestimmt och 'ne fehleranfällige Berechnung (du glaubst garnicht was da das vorher fehlende Minus von TEdit(_Edit).Font.Height mir für 'nen Spaß bereitete :wall: )

Zitat:

Das ist Geschmackssache, ich lagere gerne soviel wie möglich aus, so das ich mich im Hauptprogramm nicht mehr drum kümmern muss.
da bei mir ja auch noch von verschiedenen Quellen aus eingelesen werden kann, isses so einfacher, manchma isses ja nichtmal möglich (z.B. alles wo die Komponente nicht auf die Datei zugreift) und zusätzlich kann der User sich jetzt noch überlegen ob er überhaupt speichern will und wenn wo und wie.

Zitat:

Funktioniert bei mir nur mit Hoch/Runter
nun ja, ..bei mir ist halt die ListView aktiv (hat den Fokus), drum geht der Bildlauf dort von selbst

dafür muß ich alles Andere zum Edit zurückleiten.

siehe "vielleicht sollte man alle Zeichen ... weiterleiten :oops:"
sonst passieren komische Dinge :shock:
kleine Ändrung bei Case-Else in ListViewKeyPress

sirius 15. Dez 2008 15:45

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Zitat:

Zitat von himitsu
Zitat:

Wichtig: Durch AutoComlete werden die Ereignisbehandlungen 'OnChange', 'OnKeyDown', 'OnKeyPress' und 'OnContextPopup'überschrieben.
Sollten diese im Hauptprogramm benötigt werden, ist diese Lösung zunächst nicht einsetzbar.
dann überschreib die Eigenschaften doch nicht einfach!

ließ die vorherrigen Werte aus und ruf (falls da schon etwas eingetragen ist) dieses in deiner Klasse auf.

Jo, das ist die kurze Variante. Aber was ist, wenn jemand im Nachinein die Ereignisse ändert. Hier muss man weiter vorne ansetzen. Unter Umständen ist Subclassing das Mittel der Wahl.

Woodman 15. Dez 2008 18:11

Re: AutoComplete für TMemo, TRichEdit uvm.
 
@himitsu: Ich hab' mir erst jetzt Dein AutoComplete richtig angesehen :o . Da sieht man den professionellen Komponenten-Entwickler - alles ist konfigurierbar und sogar die eventuell bestehenden Events hast Du berücksichtigt :thumb: .
Zitat:

Zitat von himitsu
...
sonst passieren komische Dinge :shock:

Das stimmt :P , versuch mal diesen - sinnfreien - Satz unter Berücksichtigung der Groß/Kleinschreibung einzugeben:
Zitat:

Du große schöne Frau! Warum bist Du so schön?
Heraus kommt dabei:
Zitat:

Du grobe Schane Frau! warum Bist Du so Schan?

himitsu 15. Dez 2008 18:24

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Also, mit der letzen Version hab ich bei mir keine Probleme :gruebel:

[edit]Anhang entfernt (man darf ja mal die DP entlasten)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 Uhr.
Seite 2 von 4     12 34      

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