Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TStringList => Anordnung der Einträge (https://www.delphipraxis.net/103524-tstringlist-%3D-anordnung-der-eintraege.html)

Tommy1988 16. Nov 2007 21:41


TStringList => Anordnung der Einträge
 
Ich habe folgenden Code:

Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
AllTypedKeys.Add(Key);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to AllTypedKeys.Count-1 do
   showmessage(AllTypedKeys[i]);
end;
So.. jetzt gelingt es mir nicht z.B. die letzten, sagen wir, 5 Eingaben zu überprüfen, also
mir etwas anderem zu vergleichen.

Wie gehe ich da vor?

Progman 16. Nov 2007 21:47

Re: TStringList => Anordnung der Einträge
 
Möglicherweise löst der Enterdruck beim Schließen von ShowMessage auch beim Edit ein OnKeyPress aus.
So was ähnliches hatte ich auch mal. Pack dir doch mal eine TListBox aufs Form und lass die Eingaben da rein Adden, da siehst du vielleicht mehr?

Tommy1988 16. Nov 2007 21:51

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
ListBox1.Items.AddStrings(AllTypedKeys);
Ok.. sie sind nun alle in der ListBox. Testeingabe im Memo war: 123

In der ListBox sind sie so
1
2
3. In einer MessageBox wären sie auch untereinander.

Wie "schneidet" man denn bei TStringList die letzten 5, oder 6 .. ab?

Also ich meine: In der SringList suchen bringt nicht viel.
Das habe ich schon alles angetestet. Weil die Einträge j alle Untereinander sind bringt dss nix.

Progman 16. Nov 2007 21:53

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
while StringList.Count > irgendnezahl do StringList.Delete(StringList.Count-1);
müsste gehen.

Tommy1988 16. Nov 2007 21:57

Re: TStringList => Anordnung der Einträge
 
Ahh.. ne ich habe mich glaube ich falsch ausgedrückt :wall:
Ich meinte eigentlich, wie man die letzten paar Eingaben, z.B. die letzten 5 Eingaben,
aus der Stringlist bekommt und als Zeichenkette in einen String packt .

Progman 16. Nov 2007 22:00

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
if StringList.Count > 5 then
  for i:=StringList.Count-1 downto 1 do Str:=Str+StringList[i];
müsste gehen ;)

Tommy1988 16. Nov 2007 22:20

Re: TStringList => Anordnung der Einträge
 
Mhh.. ich habs jetzt mal so versucht:
Delphi-Quellcode:
  for i := AllTypedKeys.Count downto AllTypedKeys.Count-3 do
  begin
   Str := AllTypedKeys[i]+Str;
   Label1.Caption := Str;
  end;
Nur leider überschreitet da etwas das Listenindex.

Mit der for-Zeile dachte vom letzten eintrag 3 runter zählen zu können (-3) :idea:

Tommy1988 16. Nov 2007 22:25

Re: TStringList => Anordnung der Einträge
 
Hier mal mein ganzer Code und worum es geht:

Delphi-Quellcode:
  for i := AllTypedKeys.Count-1 downto 0 do
  begin
   Str := AllTypedKeys[i]+Str;
   Label1.Caption := Str;
  end;

  if Str = 'ABC' then
  begin
   Ln := SynMemo1.CaretY;
   CurPosition := SendMessage(SynMemo1.handle,EM_LineIndex,Ln,0);
   CurPosition := SynMemo1.SelStart-CurPosition;
   SynMemo1.SelStart := CurPosition+1;
   SynMemo1.SelText := 'DEF';
  end;
Angenommen ich tippe ABC ein, dann sollte dem Code nach, dachte ich, DEF HINTER ABC gesetzt werden aber der macht etwas murks. Heraus kommt: AB DEFC

Progman 16. Nov 2007 22:26

Re: TStringList => Anordnung der Einträge
 
Count - 1 !!
Die Zählung beginnt doch bei null und endet daher bei Count-1

Progman 16. Nov 2007 22:28

Re: TStringList => Anordnung der Einträge
 
hm, beim SynMemo muss ich passen, das kenne ich nicht, steht denn wenigstens im Label das Richtige?

Progman 16. Nov 2007 22:29

Re: TStringList => Anordnung der Einträge
 
'DEF' noch eine Position später einfügen?

Tommy1988 16. Nov 2007 22:29

Re: TStringList => Anordnung der Einträge
 
Steht doch da ;) (Ein Post hoch)

Klappen tuts aber irgentwie nicht, ich weis nicht ws falsch ist. ..

Aber ich glaube TStringList ist auch nicht dafür geeignet.

Denn wenn ich ein paar Leerzeichen eingebe, und dann erst ABC, passiert nix.

Zum SynMemo:
Ist alles gleich zum Memo. Also wenn es ums Eingeben geht .. alles identisch

Tommy1988 16. Nov 2007 22:31

Re: TStringList => Anordnung der Einträge
 
Zitat:

Zitat von Progman
'DEF' noch eine Position später einfügen?

klappt alles nicht..

Progman 16. Nov 2007 22:32

Re: TStringList => Anordnung der Einträge
 
Warum nicht gleich die Key-Chars in einen String?
Macht vielleicht vieles einfacher? Aus einem String kann man genauso easy Zeichen löschen, hinzufügen, rauskopieren etc.

Tommy1988 16. Nov 2007 22:34

Re: TStringList => Anordnung der Einträge
 
Sind ja nicht immer nur Buchstaben. Manchmal auch Zahlen und so..

Ich probiere grade mal etwas mit Copy, hab da eine Idee melde mich sofort wieder.

Ne klappt nicht..

Ok.. abgesehen von allem anderen:
Das mit der StringList klappt alleine deswegen nicht, weil, wie oben scon gesagt, wenn ich
ein paar Leerzeichen zuerst eingebe, und dann erst ABC, reagiert der nicht mehr auf die IF-Abfrage.

Da stimmt nämlich was nicht mit der for-schleife..
Ich dachte eigentlich, dass man sich die anzahl der zeichen in der StringList holen kann, und dann die letzten X in einen string steckt.

aber, wie ich ab label sehen kann, macht AllTypedKeys[i]+Str; etwas anderes

Progman 16. Nov 2007 22:40

Re: TStringList => Anordnung der Einträge
 
hm, also ich würde die ganzen Eingabezeichen in einen String adden, den dann vor dem Weiterverarbeiten von evtl. Leerzeichen befreien und dann das ausführen, was notwendig ist.

Tommy1988 16. Nov 2007 22:42

Re: TStringList => Anordnung der Einträge
 
mh, jetzt mal eine andere frage(hätte ich vielleicht am anfang machen sollen)

ist das überhaupt der richtige ansatz ?

also ich mein, wie könnte man soetwas einfacher lösen..

es geht ja nur drum, dass
- wenn z.b. ABC eingegeben wurde, DEF hinten dran gehangen wird -

Progman 16. Nov 2007 22:46

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
p:=Pos('ABC', InputStr);
if p > 0 then Insert('DEF',InputStr,p+3);
So müsste es in etwa gehen.

Progman 16. Nov 2007 22:50

Re: TStringList => Anordnung der Einträge
 
Wenn ins Memo eingegeben wird, könnte man den KeyUp-Event des Memos nutzen und die letzten drei Zeichen vorm Cursor prüfen, wenn es die gesuchte Zeichenkette ist, einfach die dazugehörigen Zeichen an der Cursorposition einfügen.

Tommy1988 16. Nov 2007 23:06

Re: TStringList => Anordnung der Einträge
 
ich bekomms einfach nicht hin.

Delphi-Quellcode:
procedure TForm1.SynMemo1KeyPress(Sender: TObject; var Key: WideChar);
begin
text := SynMemo1.Text;

   Ln := SynMemo1.CaretY;
   CurPosition := SendMessage(SynMemo1.handle,EM_LineIndex,Ln,0);
   CurPosition := SynMemo1.SelStart-CurPosition;
end;

procedure TForm1.SynMemo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
Caption := '('+IntToStr(CurPosition)+') "'
+Copy(SynMemo1.Text, CurPosition-3, 3)+'"'; // nur zum gucken
if Copy(SynMemo1.Text, CurPosition-3, 3) = 'ABC' then // ****
Insert('CDE', text, CurPosition+3);
end;
wenn dann denn mal ABC da wo die ****'s sind zutrifft passiert einfach nix

Progman 16. Nov 2007 23:11

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
Insert('CDE', text, CurPosition)
, denn +3 ist doch schon im Nirvana :)

Tommy1988 16. Nov 2007 23:16

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
if Copy(SynMemo1.Text, CurPosition-2, 3) = 'ABC' then // ****
Insert('CDE', text, CurPosition);
Ich hab den total falschen Ansatz :cry:

Das klappt alles nicht ..

Progman 16. Nov 2007 23:19

Re: TStringList => Anordnung der Einträge
 
Lass dir doch mal
Delphi-Quellcode:
Copy(SynMemo1.Text, CurPosition-2, 3)
in ein Label oder Caption schreiben, was da genau drinsteht, und mal anstelle von Insert einfach nur Memo.Text := Memo.Text+'DEF'.
Und vielleicht noch Memo.Refresh aufrufen, falls nix zu sehen ist.

Tommy1988 16. Nov 2007 23:25

Re: TStringList => Anordnung der Einträge
 
Wenn ich jetzt diesen Code nehme:

Delphi-Quellcode:
procedure TForm1.SynMemo1KeyPress(Sender: TObject; var Key: WideChar);
begin
text := SynMemo1.Text;

   Ln := SynMemo1.CaretY;
   CurPosition := SendMessage(SynMemo1.handle,EM_LineIndex,Ln,0);
   CurPosition := SynMemo1.SelStart-CurPosition;

Caption := '('+IntToStr(CurPosition)+') "'
+Copy(SynMemo1.Text, CurPosition-2, 3)+'"'; // nur zum gucken
if Copy(SynMemo1.Text, CurPosition-2, 3) = 'ABC' then // ****
SynMemo1.Text := SynMemo1.Text+'DEF';
SynMemo1.Refresh;
end;
und direkt am Anfang "ABC" eintippe, passiert nix, gebe ich ein zusätzliches Leerzeichen ein, so kommt DEF.

Aber das ist es ja auch nicht :?

Progman 16. Nov 2007 23:35

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if copy(Memo1.Text,Memo1.SelStart-2,3)='ABC' then begin
    Memo1.Text:=Memo1.Text+'DEF';
    Memo1.SelStart:=Length(Memo1.Text);
  end;
end;
Das funzt bei mir mit nem normalen TMemo.

Tommy1988 17. Nov 2007 00:56

Re: TStringList => Anordnung der Einträge
 
Delphi-Quellcode:
Caption := '('+IntToStr(CurPosition)+') "'
+Copy(SynMemo1.Text, CurPosition-2, 3)+'"';

 if Copy(SynMemo1.Text, CurPosition-2, 3) = '[b]' then
 begin
  SynMemo1.SelText := '[/b]';
 end;
Ds ist es soweit.

Es steht aber in einem unschönen TIMER .. von daher.. das Problem, ist, wenn es im KeyUp/Down steht, kommt es doppelt

DP-Maintenance 17. Nov 2007 07:17

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Ist ja eine Delphifrage

Progman 17. Nov 2007 09:56

Re: TStringList => Anordnung der Einträge
 
Dass es doppelt kommt, hat seine Ursache darin, dass bei Loslassen der Shift-Taste auch KeyUp ausgelöste wir, und das TMemo, brav wie es ist, hängt eben noch mal 'DEF' dran. Deshalb hab ich ja nach anhängen von 'DEF' auch gleich den Cursor dahinter gesetzt. Dann trifft die Bedingung nicht mehr zu und es passiert nix.
SelStart repräsentiert immer die Cursor-Position, wenn kein Text selectiert ist, daher
Delphi-Quellcode:
Memo1.SelStart:=Length(Memo1.Text);
. Dann sind die drei Zeichen davor ja nicht 'ABC' ;)
Also nach dem Anhängen gleich Cursor dahinter setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz