Delphi-PRAXiS
Seite 3 von 4     123 4      

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 18:29

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

Zitat von himitsu
Also, mit der letzen Version hab ich bei mir keine Probleme :gruebel:

Ja klar, weil Du das AutoComplete "ausgeschaltet" hast :P
Delphi-Quellcode:
  Procedure TAutoComplete.EditChange(Sender: TObject);
    Var B: Boolean;

    Begin
      {B := _IsKeyPressed;
      _IsKeyPressed := False;
      If B Then ShowListView Else Hide;
      If Assigned(_OnEditChange) Then _OnEditChange(Sender);}
    End;

himitsu 15. Dez 2008 18:39

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Ups, was hab ich denn da vergessen :shock:

stümmt, jetzt passiert des doch :wall:

OK, heißt also es gibt Probleme mit der Übergabe von Sonderzeichen ... ma gucken


Ach ja, hatte alles in den Edit-Ereignisprozeduren auskommentiert und igendwie funktioniert [Entf] und sowas wie Kopieren/Auschneiden/Einfügen beim Edit dennoch nicht ... hab also noch keine Ahnung warum :?

[edit] in #17 die Fehler bezüglich der Auskommentierung behoben

Woodman 15. Dez 2008 18:47

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

Zitat von himitsu
...Ach ja, hatte alles in den Edit-Ereignisprozeduren auskommentiert und igendwie funktioniert [Entf] und sowas wie Kopieren/Auschneiden/Einfügen beim Edit dennoch nicht ... hab also noch keine Ahnung warum :?...

Das kann ich Dir sagen: Beim TEdit und TRichEdit funktionierts manuell.
Beim TMemo mußt Du noch das Popup-Menu bereinigen oder die ActionList aus meinem Testprogramm wieder zufügen.

Ich bin dann mal weg...

himitsu 15. Dez 2008 18:54

Re: AutoComplete für TMemo, TRichEdit uvm.
 
oder irgendwas vom OLE einbinden ... mir fällt einfach nur nimmer ein was das war.

So, das Problem mit den äöüß... liegt nicht an der Zeichenübergabe an das Edit, sonder vermutlich irgendwo an der ListBox-Selektierung ... muß ich nur noch rausfinden was da schiefgeht

himitsu 18. Dez 2008 07:51

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zu dem Memo ... ich hab langsam die Beführchtung,
es reicht, wenn man nur die ActionList auf's Formular zieht. :gruebel:

Bei Memo1 hab ich es mal (so wie bei dir) ins Popupmenü eingebunden, aber in Memo2 nicht und dennoch geht dieses dort jetzt auch. :shock:



Du hast 'nen Fehler beim Befüllen der ListBox ... es fehlen viele Wörter.
(siehe Anhang > Unbenannt.png und Unbenannt2.png)

"sch" = 4464 wörter, aber bei dir sind es nur 5
"fra" = 655 wörter und bei dir sind's wieder nur 5

Gut, ich laß auch nicht unendlich viele Wörter in der ListView zu, da die Delphi-Version leider ein "klitzekleines" Geschwindigkeitsproblem hat, wenn sie zu voll wird.

Zitat:

// Wichtig: Parent festlegen, sonst gibt's
// einen Laufzeitfehler
ach ja, weißt du auch warum?

Owner = Besitzer des Komponente und das kann alles (jeder nachkomme von TComponent) und nichts (nil) sein.
es ist nur derjenige, welcher sich um die Freigabe der Komponente kümmert (wenn er selber freigegeben wird), falls niemand anderes die Komponente freigibt,

welches eigentlich auch der Programmierer machen könnte:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  AutoComplete1.Free;
  AutoComplete2.Free;
  AutoComplete3.Free;
end;
PS: drum hab ich als Owner auch die Edit-Komponente gewählt, da die Funktion an diese Komponente gebunden ist.

Parent aber ist die Komponente, auf welcher deine Komponente dargestellt wird ... und wenn da nichts angegeben ist, wo soll die ListView dann hin? (sozusagen ohne Leinwand um sich zu Zeichnen)



hab jetzt auch mal mit 'ner Version einer "unsichtbaren" ListView gespielt (ListView ist zwar noch vorhanden, da über sie die Eingabe läuft, aber so klein, daß man sie nicht sieht)

die Eingabe wurde verbessert und einige Fehler ausgemerzt
  • Entf-Taste wird nun unterstützt
  • das Schreiben geht flüssiger
  • Wörter werden nicht mehr verfällscht
  • man kann jetzt eine StringList für mehrere Komponenten(TAutoComplete) verwenden
    - einfach statt 'ner normalen StringList beim Laden TCommonWordList (oder deren Nachfahren) übergeben
  • statt nur TStringList und Nachkommen wird jetzt alles ab TStrings, als Quelle, unterstützt

[add]
Wenn du von statt TEdit TCustomEdit entgegennimmst, werden mehr Komponenten unterstützt.
TEdit macht nur einige Methoden sichtbar, welche es in TCustomEdit noch nicht sind und falls du dann innerhalb deiner Komponente Probleme hast auf bestimmte Methoden zuzugreifen, dann einfach nach TEdit casten.

[edit]merk grad, hab mir irgendwo 'nen Fehler bei der Positionierung der ListView eingebaut ... muß ich mal nachsehn wo der sich versteckt


Beitrag #17: AutoComplete.7z (742 KB) - Source+Exe

Woodman 18. Dez 2008 19:02

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

Zitat von himitsu
...
Du hast 'nen Fehler beim Befüllen der ListBox ... es fehlen viele Wörter.
(siehe Anhang > Unbenannt.png und Unbenannt2.png)

"sch" = 4464 wörter, aber bei dir sind es nur 5
"fra" = 655 wörter und bei dir sind's wieder nur 5

Das ist in Ordnung, wie Du oben siehst, öffne ich im Memo eine ander Textdatei als im RichEdit.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   AutoComplete1 := TAutoComplete.Create(self,'worte.txt',Memo1);
   AutoComplete2 := TAutoComplete.Create(Form1,'plz.txt',LabeledEdit1);
   AutoComplete3 := TAutoComplete.Create(Form1,'words4.txt',RichEdit1);
   
end;
Zitat:

Zitat von himitsu
Gut, ich laß auch nicht unendlich viele Wörter in der ListView zu, da die Delphi-Version leider ein "klitzekleines" Geschwindigkeitsproblem hat, wenn sie zu voll wird.

Bei der Option, das AutoComplete nur "anspringt", wenn 3 Zeichen eingetippt sind, gibt es dieses Problem (fast) nicht. :wink:
Zitat:

Zitat von himitsu
Zitat:

// Wichtig: Parent festlegen, sonst gibt's
// einen Laufzeitfehler
ach ja, weißt du auch warum?

Owner = Besitzer des Komponente und das kann alles (jeder nachkomme von TComponent) und nichts (nil) sein.
es ist nur derjenige, welcher sich um die Freigabe der Komponente kümmert (wenn er selber freigegeben wird), falls niemand anderes die Komponente freigibt,

welches eigentlich auch der Programmierer machen könnte:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  AutoComplete1.Free;
  AutoComplete2.Free;
  AutoComplete3.Free;
end;
PS: drum hab ich als Owner auch die Edit-Komponente gewählt, da die Funktion an diese Komponente gebunden ist.

Parent aber ist die Komponente, auf welcher deine Komponente dargestellt wird ... und wenn da nichts angegeben ist, wo soll die ListView dann hin? (sozusagen ohne Leinwand um sich zu Zeichnen)

Das ist ein wichtiger Hinweis und war mir bis jetzt noch nicht bewusst bzw. bekannt:
Der Unterschied Owner <> Parent.
Früher dachte ich, die Kinder gehören den Eltern :wall:

Zitat:

Zitat von himitsu
hab jetzt auch mal mit 'ner Version einer "unsichtbaren" ListView gespielt (ListView ist zwar noch vorhanden, da über sie die Eingabe läuft, aber so klein, daß man sie nicht sieht)

Mhm, muss ich mal mit spielen. Ist etwas gewöhnungsbedürftig, besonders da man nicht weiß, was die Liste noch anbietet.
Zitat:

Zitat von himitsu
...[edit]merk grad, hab mir irgendwo 'nen Fehler bei der Positionierung der ListView eingebaut ... muß ich mal nachsehn wo der sich versteckt

Jau, denn ich blick jetzt nicht mehr durch :mrgreen:

himitsu 19. Dez 2008 07:29

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

Das ist in Ordnung, wie Du oben siehst, öffne ich im Memo eine ander Textdatei als im RichEdit.
oh man, das Gedächtnis :wall:
OK, wenn die Datei kleiner ist, dann wäre das ein guter Grund :lol:

Zitat:

Bei der Option, das AutoComplete nur "anspringt", wenn 3 Zeichen eingetippt sind, gibt es dieses Problem (fast) nicht. :wink:
bis man dann mal eine schön große Wortliste verwendet... :stupid:

Zitat:

Früher dachte ich, die Kinder gehören den Eltern :wall:
joar, da darf man wohl nicht wortwörtlich übersetzen :roll:
Parent = Arbeitsplatz
Owner = Mörder
oder so

Zitat:

Zitat von himitsu
hab jetzt auch mal mit 'ner Version einer "unsichtbaren" ListView gespielt (ListView ist zwar noch vorhanden, da über sie die Eingabe läuft, aber so klein, daß man sie nicht sieht)

Mhm, muss ich mal mit spielen. Ist etwas gewöhnungsbedürftig, besonders da man nicht weiß, was die Liste noch anbietet.
Zitat:

Zitat von himitsu
...[edit]merk grad, hab mir irgendwo 'nen Fehler bei der Positionierung der ListView eingebaut ... muß ich mal nachsehn wo der sich versteckt

Jau, denn ich blick jetzt nicht mehr durch :mrgreen:[/quote]

Zitat:

Mhm, muss ich mal mit spielen.
Ist etwas gewöhnungsbedürftig, besonders da man nicht weiß, was die Liste noch anbietet.
du könntest die ListView da eventuell sogar weglassen und was Schnelleres verwenden, da bei dir der Input ja über das Memo läuft (bei mir halt über die ListView)

und was die Auswahl betrifft > Cursor-Tasten (hoch und runter), halt alles wie in der ListView und Auswählen mit Enter ... am Ende der begrenzen Liste (500 Einträge in der Demo) mit Enter die Liste erweitern (halt auch wie in der ListView))

himitsu 20. Dez 2008 16:44

Re: AutoComplete für TMemo, TRichEdit uvm.
 
das mit'm automatischen Positionieren funktioniert jetzt erstmal (auch wenn es mir vom Code her noch nicht gefällt)

und dann gab's noch einige andere Änderungen ... aber k.A. was ich gestern noch alles verbrockt hab :oops:

Beitrag #17: AutoComplete.7z (744 KB) - Source+Exe

juergen 23. Dez 2009 10:31

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Hallo himitsu,

aus einem anderen Thread heraus hattest du mich auf diesen hier aufmerksam gemacht.
Die Idee finde ich sehr gut und wollte das AutoComplete nun auch in mein Projekt übernehmen.

Ich kann auf die Methoden der AutoComplete-Unit zugreifen, aber es wird anscheinend nicht auf mein Edit angewendet.

Meine vllt. dumme Frage: :oops:
Wie bekomme ich das "Edit-Hack" auf mein Edit "aktiviert"?

Schon mal Danke für deine Mühen!


Edit: ähhh, sorry, nachfolgend noch meine Bemühungen, damit du nicht orakeln musst...
Delphi-Quellcode:
interface

uses
...AutoComplete;
...
private
AutoComplete1: TAutoComplete;
...
procedure TSearchForm.FormCreate(Sender: TObject);
var
  SL: TStringList; //fuer AutoComplete
begin
  AutoComplete1 := TAutoComplete.Create(Edit1, 'Search_Words.txt');
  SL := TStringList.Create;
  SL.LoadFromFile('Search_Words.txt');
...

procedure TSearchForm.Listbox1DblClick(Sender: TObject);
var
  Edit1text: string;
begin
...
  AutoComplete1.SaveWordsToString(Edit1text);
end;
...
procedure TSearchForm.FormDestroy(Sender: TObject);
begin
  AutoComplete1.SaveWordsToFile('Search_Word.txt');
  AutoComplete1.Free;
end;

himitsu 23. Dez 2009 12:44

Re: AutoComplete für TMemo, TRichEdit uvm.
 
Eigentlich sollte dieses schon ausreichen, da das diese Komponente beim TAutoComplete.Create mit dem Edit verbunden wird. :gruebel:

Nur die TStringList (SL) kannst du weglassen, da du die Wörterliste ja schon beim TAutoComplete.Create direkt angibst, aber es sollte dennoch gehn, auch wenn die Datei nochmal in einer unabhängigen Stringliste geladen wurde.

Das Minimum wäre ja dieser Code und das ist soweit auch bei dir vorhanden.
Delphi-Quellcode:
{***** OnCreate *****}
AutoComplete1 := TAutoComplete.Create(Edit1, 'wordlist.txt');

{***** OnDestroy *****}
//If AutoComplete1.WordsChanged Then
//  AutoComplete1.SaveWordsToFile('wordlist.txt');
AutoComplete1.Free;

Änderst du eventuell nachträglich noch ein paar Events des Edits?
OnKeyDown, OnKeyUp, OnKeyPress und OnChange des Edits/Memors wird ja von der Komponente überschrieben, da hierrüber auf Tastatureingaben reagiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.
Seite 3 von 4     123 4      

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