AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi AutoComplete für TMemo, TRichEdit uvm.
Thema durchsuchen
Ansicht
Themen-Optionen

AutoComplete für TMemo, TRichEdit uvm.

Ein Thema von Woodman · begonnen am 12. Dez 2008 · letzter Beitrag vom 24. Dez 2009
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Woodman
Woodman

Registriert seit: 17. Mär 2007
74 Beiträge
 
Delphi 10.1 Berlin Starter
 
#11

Re: AutoComplete für TMemo, TRichEdit uvm.

  Alt 15. Dez 2008, 10:13
Zitat von sx2008:
Zitat von Woodman:
Verzeih' einem Anfänger, das ich Dir nicht ganz folgen kann
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!?
Aber Spaß beiseite. Es liegt ja in der Verantwortung des Programmieres, welchem Formular er das AutoComplete zuweist.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.
Keep
Horst
Delphi 10.1 Berlin Starter unter Windows 10 - 1803
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

Re: AutoComplete für TMemo, TRichEdit uvm.

  Alt 15. Dez 2008, 10:29
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Woodman
Woodman

Registriert seit: 17. Mär 2007
74 Beiträge
 
Delphi 10.1 Berlin Starter
 
#13

Re: AutoComplete für TMemo, TRichEdit uvm.

  Alt 15. Dez 2008, 11:53
Wow, ich erkenne meine Komponente nicht wieder (Das soll jetzt keine Bewertung sein)
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 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 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 ), aber Du hast recht.

Zitat von himitsu:
kannst dich ja gern mal etwas umschauen:
  • Strg + Leertaste = Autovervollständigung sofort anzeigen
  • Gute Idee
    Zitat von himitsu:
  • bei Eingabe eine Wortes, ab 3 Zeichen (Standard) Autovervollständigung anzeigen
Funktioniert bei meiner Komponente
Zitat von himitsu:
  • Links/Rechts = Markierung (im Wort) ändern
  • Ok, das funktioniert bei mir nicht.
    Zitat von himitsu:
  • Hoch/Runter/Bild Hoch/Bild Runter = in Liste Auswahl ändern
  • Funktioniert bei mir nur mit Hoch/Runter
    Zitat von himitsu:
  • irgendwo hinklicken/ESC/Tab = abbrechen
  • Funktioniert bei mir mit ESC bzw. non-matching Character
    Zitat von himitsu:
  • Enter/Item anklicken = auswählen
  • Funktioniert bei mir.
    Zitat von himitsu:
  • Backspace/Zeichen eintippen = Wort/Auswahl ändern
  • Funktioniert bei mir.
    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
    Zitat von himitsu:
  • via PopupMenü im Edit Wort hinzufügen
  • Funktioniert bei mir.
    Zitat von himitsu:
  • und über's PopupMenü der ListView Wort löschen
  • Funktioniert bei mir nicht.
    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 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...
    Keep
    Horst
    Delphi 10.1 Berlin Starter unter Windows 10 - 1803
      Mit Zitat antworten Zitat
    Benutzerbild von sx2008
    sx2008

    Registriert seit: 16. Feb 2008
    Ort: Baden-Württemberg
    2.332 Beiträge
     
    Delphi 2007 Professional
     
    #14

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 11:56
    Zitat von Woodman:
    ...Es liegt ja in der Verantwortung des Programmieres, welchem Formular er das AutoComplete zuweist.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 )
    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.
      Mit Zitat antworten Zitat
    Benutzerbild von Woodman
    Woodman

    Registriert seit: 17. Mär 2007
    74 Beiträge
     
    Delphi 10.1 Berlin Starter
     
    #15

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 12:17
    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 )
    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 . Ok, das war jetzt mein Fehler im Hauptprogramm und hat nichts mit der Komponente AutoComplete zu tun. Richtig?
    Keep
    Horst
    Delphi 10.1 Berlin Starter unter Windows 10 - 1803
      Mit Zitat antworten Zitat
    Benutzerbild von sx2008
    sx2008

    Registriert seit: 16. Feb 2008
    Ort: Baden-Württemberg
    2.332 Beiträge
     
    Delphi 2007 Professional
     
    #16

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 12:23
    Zitat von Woodman:
    Ok, das war jetzt mein Fehler im Hauptprogramm und hat nichts mit der Komponente AutoComplete zu tun. Richtig?
    Exaktamente. Und weil der Fehler so schwer zu erkennen ist, war mein Rat, den Owner ganz wegzulassen und vom Steuerelement abzugreifen.
      Mit Zitat antworten Zitat
    Benutzerbild von himitsu
    himitsu

    Registriert seit: 11. Okt 2003
    Ort: Elbflorenz
    44.184 Beiträge
     
    Delphi 12 Athens
     
    #17

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 12:53
    joar, vielleicht sollte man alle Zeichen (auch die in WordSeparator definierten) an das Edit weiterleiten


    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 (Das soll jetzt keine Bewertung sein)
    ok, dann dann bedank ich mich auch nicht für das Lob

    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
    hab ich mit von Delphi abgeguckt

    Zitat:
    Da hab' ich's mir einfach gemacht, ist immer unter dem Wort bzw. Edit
    Hauptsache es ist da
    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 )

    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 "
    sonst passieren komische Dinge
    kleine Ändrung bei Case-Else in ListViewKeyPress
    Angehängte Dateien
    Dateityp: 7z autocomplete_119.7z (744,1 KB, 194x aufgerufen)
    $2B or not $2B
      Mit Zitat antworten Zitat
    Benutzerbild von sirius
    sirius

    Registriert seit: 3. Jan 2007
    Ort: Dresden
    3.443 Beiträge
     
    Delphi 7 Enterprise
     
    #18

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 16:45
    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.
    Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
      Mit Zitat antworten Zitat
    Benutzerbild von Woodman
    Woodman

    Registriert seit: 17. Mär 2007
    74 Beiträge
     
    Delphi 10.1 Berlin Starter
     
    #19

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 19:11
    @himitsu: Ich hab' mir erst jetzt Dein AutoComplete richtig angesehen . Da sieht man den professionellen Komponenten-Entwickler - alles ist konfigurierbar und sogar die eventuell bestehenden Events hast Du berücksichtigt .
    Zitat von himitsu:
    ...
    sonst passieren komische Dinge
    Das stimmt , 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?
    Keep
    Horst
    Delphi 10.1 Berlin Starter unter Windows 10 - 1803
      Mit Zitat antworten Zitat
    Benutzerbild von himitsu
    himitsu

    Registriert seit: 11. Okt 2003
    Ort: Elbflorenz
    44.184 Beiträge
     
    Delphi 12 Athens
     
    #20

    Re: AutoComplete für TMemo, TRichEdit uvm.

      Alt 15. Dez 2008, 19:24
    Also, mit der letzen Version hab ich bei mir keine Probleme

    [edit]Anhang entfernt (man darf ja mal die DP entlasten)
    $2B or not $2B
      Mit Zitat antworten Zitat
    Antwort Antwort
    Seite 2 von 4     12 34      


    Forumregeln

    Es ist dir nicht erlaubt, neue Themen zu verfassen.
    Es ist dir nicht erlaubt, auf Beiträge zu antworten.
    Es ist dir nicht erlaubt, Anhänge hochzuladen.
    Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

    BB-Code ist an.
    Smileys sind an.
    [IMG] Code ist an.
    HTML-Code ist aus.
    Trackbacks are an
    Pingbacks are an
    Refbacks are aus

    Gehe zu:

    Impressum · AGB · Datenschutz · Nach oben
    Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
    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