Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList, Pos, PosEx usw.311 (https://www.delphipraxis.net/160932-tstringlist-pos-posex-usw-311-a.html)

Jumpy 8. Jun 2011 14:40

AW: TStringList, Pos, PosEx usw.311
 
Ginge es nicht sinngemäß auch so mit einer Verwaltung der RichEdits?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function IsSameText(const str1, str2: string): Boolean;
  begin
    Result := AnsiStrIComp(PChar(str1), PChar(Str2)) = 0;
  end;

var
  load: tstringlist;
  switch, i: integer;
  RE : Array of TRichEdit;
begin
  load := tstringlist.create;
  try
    load.loadfromfile('C:\1.txt');
    switch := 0;
    Re[0]:=RichEdit1;
    Re[1]:=RichEdit2;
    For i=0 To load.count-1 do
      begin
      If IsSameText('hallo eins:', load[i]) Then switch:=0;
      If IsSameText('hallo zwei:', load[i]) Then switch:=1;
      Re[switch].Lines.Add(load[i])
      end
  finally
    load.Free;
  end;
end;

DeddyH 8. Jun 2011 14:44

AW: TStringList, Pos, PosEx usw.311
 
Damit würdest Du aber auch alle Zeilen vor "hallo eins" ins erste RichEdit kopieren, wenn ich das richtig sehe (switch steht ja initial auf 0).

Jumpy 8. Jun 2011 15:34

AW: TStringList, Pos, PosEx usw.311
 
Überarbeitete Version:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function IsSameText(const str1, str2: string): Boolean;
  begin
    Result := AnsiStrIComp(PChar(str1), PChar(Str2)) = 0;
  end;

var
  load: tstringlist;
  switch, i: integer;
  RE : Array of TRichEdit;
begin
  load := tstringlist.create;
  try
    load.loadfromfile('C:\1.txt');
    switch := -1;
    Re[0]:=RichEdit1;
    Re[1]:=RichEdit2;
    For i=0 To load.count-1 do
      begin
      If IsSameText('hallo eins:', load[i]) Then switch:=0;
      If IsSameText('hallo zwei:', load[i]) Then switch:=1;
      If switch >= 0 then Re[switch].Lines.Add(load[i])
      end
  finally
    load.Free;
  end;
end;
Aber geht das so tatsächlich, mit einem Array für Controls? Und muss ich das nicht irgendwo noch createn oder mit SetLenght dimensionieren?

DeddyH 8. Jun 2011 15:40

AW: TStringList, Pos, PosEx usw.311
 
Wenn Du weißt, dass es 2 Elemente sind, dann ist ein dynamisches Array ja witzlos, Du könntest also auch bei einem statischen bleiben. Außerdem müsstest Du nach dem Befüllen des 2. RichEdits aus der Schleife springen, sonst kopierst Du die anschließenden Abschnitte ja mit ("hallo eins" kommt in dem Beispiel ja mehrfach vor).

[edit] Rein akademische Überlegung (würde ich persönlich nicht so machen):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function IsSameText(const str1, str2: string): Boolean;
  begin
    Result := AnsiStrIComp(PChar(str1), PChar(Str2)) = 0;
  end;

var
  load: tstringlist;
  switch, i: integer;
  RE : Array[0..1] of TRichEdit;
begin
  load := tstringlist.create;
  try
    load.loadfromfile('C:\1.txt');
    switch := -1;
    Re[0]:=RichEdit1;
    Re[1]:=RichEdit2;
    For i=0 To load.count-1 do
      begin
      If IsSameText('hallo eins:', load[i]) Then inc(switch);
      If IsSameText('hallo zwei:', load[i]) Then inc(switch);
      If switch in [0..1] then Re[switch].Lines.Add(load[i])
      end
  finally
    load.Free;
  end;
end;
Ich weiß allerdings nicht, ob das wirklich so funktioniert, das müsste man mal ausprobieren. [/edit]

[edit2] Nee, würde nicht klappen, wenn die Reihenfolge in der Datei nicht stimmt. [/edit2]

Jumpy 8. Jun 2011 15:44

AW: TStringList, Pos, PosEx usw.311
 
Zitat:

Zitat von DeddyH (Beitrag 1105297)
Wenn Du weißt, dass es 2 Elemente sind, dann ist ein dynamisches Array ja witzlos, Du könntest also auch bei einem statischen bleiben.
Außerdem müsstest Du nach dem Befüllen des 2. RichEdits aus der Schleife springen, sonst kopierst Du die anschließenden Abschnitte ja mit ("hallo eins" kommt in dem Beispiel ja mehrfach vor).

Zu Punkt 1 dachte ich, das dass so leicht erweiterbar wäre, d.h. man könnte leicht mehr RichEdits für mehr Hallo sager einbauen und dann ggf. auch den Vergleich dynamisch realisieren.

Zu Punkt 2: Ich dachte das wäre so gewollt, dass immer hin und her gewechselt wird.:gruebel:

DeddyH 8. Jun 2011 15:49

AW: TStringList, Pos, PosEx usw.311
 
Ich habe mir den Ausgangspost noch einmal genau durchgelesen und Du könntest Recht haben. Dann wäre Deine Vorgehensweise zumindest nicht falsch, wenn auch etwas umständlich ;). Man könnte ja auch das Array weglassen und stattdessen eine einfache RichEdit-Variable deklarieren und mit nil initialisieren. Bei Treffer dann auf das passende RichEdit switchen, weiter unten auf Assigned abfragen und schreiben.

Jumpy 8. Jun 2011 15:57

AW: TStringList, Pos, PosEx usw.311
 
JaJa. Am einfach arbeite ich ja noch:-D.
Statt immer ein Array zu switchen, einfach immer das Objekt auf das die Variable zeigt switchen. Klingt einfacher.

PredatorMask 8. Jun 2011 22:51

AW: TStringList, Pos, PosEx usw.311
 
@Jumpy #13:

Zitat:

[Error] Unit1.pas(51): For loop control variable must be simple local variable
[Error] Unit1.pas(51): Incompatible types: 'Boolean' and 'Integer'
[Error] Unit1.pas(52): Expression expected but 'BEGIN' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

DeddyH 9. Jun 2011 07:18

AW: TStringList, Pos, PosEx usw.311
 
Die Fehlermeldungen verstehe ich nicht, rein syntaktisch ist der Code IMO in Ordnung. Hast Du ihn denn auch exakt kopiert? Achja, mach aber aus dem dynamischen Array lieber wieder ein statisches. Und es wäre nett, wenn Du noch aufklären könntest, was nach dem Schreiben in das 2. RichEdit passieren soll (siehe die Posts vor Deinem).

PredatorMask 9. Jun 2011 07:38

AW: TStringList, Pos, PosEx usw.311
 
ja, habe alles richtig kopiert. sollte das nicht auch

Delphi-Quellcode:
For i := 0 To load.count-1 do
und nich

Delphi-Quellcode:
For i=0 To load.count-1 do
heissen? ich mein, ich weiss eh nich viel, aber das scheint mir logischer. genau da setzt der cursor auch an, wenn ich f9 drücke.
und wie ein statisches array aus einem dynamischen machen? ^^

und das programm soll einfach ALLES, was in 1.txt unter "hallo 1" steht (kommt mehrmals vor, hintereinander abwechselnd!), in richedit1 hineinschreiben (also schleifenmäßig) und das gleiche, nur mit "hallo 2" und richedit2


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.
Seite 2 von 4     12 34      

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