Autor Beitrag
en!gma
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: So 31.07.05 10:21 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: So 31.07.05 11: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

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Clemens
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 22



BeitragVerfasst: So 31.07.05 11:53 
Hallo enigma,

habe versucht dein Problem zu lösen: Hier ist das Teilergebnis:

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  Wort:string;

  s:TStringList;

  Worte: array[0..1000of string;
  wortzahl:Integer;
  Vorschlag:Tstringlist;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var i,j,k,l:integer;    s1,s2:String;
begin

//Länge des Wortes herausfinden
repeat
i:=i+1;
until Richedit1.Text[RichEdit1.selstart-i]=' ';

//Wort ermitteln
for j:=0 to i-1 do begin
s1:=s1+Richedit1.Text[RichEdit1.selstart-i+j+1];
end;


//Vorschläge testen
if i>3 then begin  //nur wenn länger als 3 Zeichen
vorschlag.Clear;       //Liste löschen

for k:= 0 to wortzahl-1 do begin   //alle wörter testen
s2:='';
for l:=1 to i do begin
 s2:=s2+worte[k][l];      end;   //s2 ist das Teilwort aus der Liste



 if s2=s1 then begin

 Vorschlag.Add(worte[k]) ;
 end;


end;
vor.Caption:=Vorschlag.Text;  //z.B. Ausgabe im Label mit Namen "Vor"

end;


end;

procedure TForm1.FormCreate(Sender: TObject);
var k:integer;
begin
s:=TStringList.Create;  //Wortliste

s.loadfromfile('D:\Worte.txt');

vorschlag:=TStringList.create;   //die Liste der Vorschläge

wortzahl:=s.Count;    //Wortzahl in Liste

for k:=0 to Wortzahl-1 do begin  //Wörter übernehmen

worte[k]:=s.Strings[k];

timer1.enabled:=true; //Vorschlagsucher aktivieren

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


Zuletzt bearbeitet von Clemens am So 31.07.05 11:55, insgesamt 1-mal bearbeitet
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: So 31.07.05 11: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: So 31.07.05 12:03 
user profile iconen!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:

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems


Zuletzt bearbeitet von MrSaint am So 31.07.05 12:12, insgesamt 1-mal bearbeitet
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: So 31.07.05 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: So 31.07.05 12: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

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: So 31.07.05 12: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 :)