Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - auto vervollständigung wie bei delphi
en!gma - So 31.07.05 09:21
Titel: auto vervollständigung wie bei delphi
hi.
also ich versuche mich grade an einem text editor.
nun möchte ich erst alle txt dateien nach bestimmten wörtern durchsuchen die dann in einer string list gespeichert werden.
naja ich denke das krieg ich noch selber hin, hoffe ich mal.
danach im texteditor soll halt ne autovervollständigung sein wie in delphi.
also nicht wie bei findnearest, dass er nur das nächste wort anzeigt.
sondern eine kleine box mit allen wörtern, die noch kommen könnten.
und wenn man da auf eins klickt soll er es halt vervollständigen.
ist das wohl noch zu schaffen für einen eher durchschnitts-schlechten programmierer? =)
mfg
en!gma
MrSaint - So 31.07.05 10:47
Sollte kein größeres Problem sein. Erstmal brauchst du natürlich all die Worte, die du zur Vervollständigung angezeigt haben willst in ner liste (oder machst du das irgendwie überdie suche? na egal, du brauchst sie halt irgendwoher). Dann brauchst du ne listbox oder was auch immer, von der du willst, dass sie aufpoppt. der gibst du visible = false. Dann nimmst du nen Time r(ich weiß der is net so beliebt, aber für den Zwekc ist er doch praktisch prädestniert ;) ) und machst ins OnTimer ereignisdd eben rein, dass die Listbox gefüllt wird, an die aktuelle Position des Cursors in deinem Memo (oder RichEdi oder was auch immer) positioniert wird und machst ein Visible = true. Jetzt musst du den Timer nur bei jeden KeyDown auf dein Memo eben neu aktivieren (sprich deaktivieren und wieder aktivieren, dass er praktisch "neu startet") und dann ist gut :) Dann musst du dir nur noch überlegen bei was die listbox wieder ausgeblendet werden soll und fertig :D
MrSaint
Clemens - So 31.07.05 10:53
Hallo enigma,
habe versucht dein Problem zu lösen: Hier ist das Teilergebnis:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type TForm1 = class(TForm) RichEdit1: TRichEdit; Timer1: TTimer; vor: TLabel;
procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject);
private public end;
var Form1: TForm1;
Wort:string;
s:TStringList;
Worte: array[0..1000] of string; wortzahl:Integer; Vorschlag:Tstringlist;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject); var i,j,k,l:integer; s1,s2:String; begin
repeat i:=i+1; until Richedit1.Text[RichEdit1.selstart-i]=' ';
for j:=0 to i-1 do begin s1:=s1+Richedit1.Text[RichEdit1.selstart-i+j+1]; end;
if i>3 then begin vorschlag.Clear; for k:= 0 to wortzahl-1 do begin s2:=''; for l:=1 to i do begin s2:=s2+worte[k][l]; end;
if s2=s1 then begin
Vorschlag.Add(worte[k]) ; end;
end; vor.Caption:=Vorschlag.Text; end;
end;
procedure TForm1.FormCreate(Sender: TObject); var k:integer; begin s:=TStringList.Create; s.loadfromfile('D:\Worte.txt');
vorschlag:=TStringList.create; wortzahl:=s.Count; for k:=0 to Wortzahl-1 do begin worte[k]:=s.Strings[k];
timer1.enabled:=true; end;
end;
end. |
Sind allerdings noch mindestens 2 Fehler drin:
1. wenn im Richedit überhaupt kein Text ist kommt eine Fehlermeldung, da Ende des Wortes nicht gefunden werden kann
2. am Anfang einer Zeile klappt es irgendwie auch nicht! aber sonst funzt.
MFG
en!gma - So 31.07.05 10:55
oh das ist super.
grosses thx erstmal.
ich werd mir gleich erstmal alles genau anschauen.
//edit
aber ich seh grad mal, könnte man das nicht auch mit einem edit1.onchange machen?
MrSaint - So 31.07.05 11:03
en!gma hat folgendes geschrieben: |
//edit
aber ich seh grad mal, könnte man das nicht auch mit einem edit1.onchange machen? |
Genau so hab ich das ja vorgeschlagen :) Mach nciht beim OnCreate den Timer.Enabled = true sondern immer wenn eine Taste im Memo grdrückt wird (von mitr aus auch im OnCHnage) schaltest du den Timer erst aus (er könnte ja noch an sein) und dann wieder an!
MrSaint
EDIT: 600. Beitrag :D :dance:
en!gma - So 31.07.05 11:12
aber ich versteh irgendwie den ganzen sinn nicht vom timer.
ich kann doch bei onkey down die liste füllen und dann bei jeder taste die ich drücke das ganze nochmal.
denn wenn ich eh keine taste drücke, brauch der timer die liste das ganze doch auch nicht aktualisieren.
oder hab ich jex nen denkfehler drin?
MrSaint - So 31.07.05 11:14
Dann kommt die listbox ja wirklich immer, auch bei schnellem Tippen. das würde wahrscheinlich zu langsam, aber selbst wenn nicht, mich würde das extremst stören. In Delphi ist es ja auch so, die Vervollständigung kommt erst nach kurzer Zeit in der du nichts getippt hast. Und genau das bewerkstelligt der timer :) (zimundest in meiner angedachten version)
MrSaint
en!gma - So 31.07.05 11:22
stimmt.
ich werd beides mal ausprobieren.
die frage ist nur ob delphi die pause macht, weil wirklich ein timer eingabaut ist, oder ob er erst alles einlesen muss.
irgendwie tippe ich eher auf zweiteres :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!