Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text an bestimmter Stelle splitten (https://www.delphipraxis.net/67698-text-bestimmter-stelle-splitten.html)

smartmod 18. Apr 2006 18:29


Text an bestimmter Stelle splitten
 
Hallo,

ich versuche, einen Text aus einem Memo an einer bestimmten Stelle zu splitten und dann den ersten Teil in die erste Spalte eines ListViews und den zweiten Teil in dessen zweite Spalte zu schreiben.

Der Text, mit dem es uA funktionieren soll ist folgender:

Zitat:

...
CDA102309/13 EMEA1
CDA102309/14 EMEA2
CDA102309/15 EMEA3
CDA102309/16 EMEA4
CDA102309/17 EMEA5
CDA102309/18 EMEA6
CDA102309/19 EMEA7
CDA102309/20 EMEA8
CDA102309/21 US1
CDA102309/22 US2
CDA102309/101 AL1
CDA102309/102 AL2
CDA102309/103 AL3
CDA102309/104 AL4
CDA102307/11 Generic Trade Taiwan
CDA102307/13 Generic Trade China
CDA102307/14 Generic Trade Hong Kong
CDA102307/31 Generic Trade Malaysia
CDA102307/32 Generic Trade Philippines
CDA102307/33 Generic Trade Netherlands
CDA102307/34 Generic Trade Italy
CDA102307/35 Generic Trade France
...
Der erste Teil (bis zum ersten Leerzeichen) soll in die erste Spalte, der Rest in die zweite.

Das funktioniert auch soweit ganz gut, allerdings trennt er bei den Werten ab "CDA102307/11 Generic Trade Taiwan" erst beim zweiten Leerzeichen.

Hier ist mein Quellcode:

Delphi-Quellcode:
var
  Form1: TForm1;
  i, j, Posi: Integer;
  S: String;
  found: Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Clear;
Posi := 1;

    for i := 0 to Memo1.Lines.Count-1 do

    begin
      found := false;
      S := Memo1.Lines.Strings[i];

      for j := 1 to length(S) do

      If not found then
      begin

        begin
          Posi := PosEx(Seperator.Text, S, Posi);
          If S[Posi] = Seperator.Text then
            begin
            found := true;
            end;
        end;

      ListView1.Items.Add;
      ListView1.Items[i].Caption := copy (S,1,Posi);
      ListView1.Items[i].SubItems.Add(copy (S,Posi+1,Length(S)-Posi));

      end;

    end;


end;
Kann mir jemand sagen, warum das so ist?

marabu 18. Apr 2006 19:21

Re: Text an bestimmter Stelle splitten
 
Hi.

Wenn du mit den einzelnen Zeilen eines Memos arbeitest, dann ist PosEx() wohl fehl am Platz.

Delphi-Quellcode:
var
  Form1: TForm1;

implementation

{$R *.dfm}

function After(const S, Pattern: String): String;
var
  i: Integer;
begin
  i := Pos(Pattern, S);
  if i = 0
    then Result := ''
    else Result := Copy(S, i + Length(Pattern), Length(S));
end;

function Before(const S, Pattern: String): String;
var
  i: Integer;
begin
  i := Pos(Pattern, S);
  if i = 0 
    then Result := S
    else Result := Copy(S, 1, Pred(i));
end;

procedure MakeItems(s: TStrings; li: TListItems);
var
  i: Integer;
begin
  li.BeginUpdate;
  li.Clear;
  for i := 0 to Pred(s.Count) do
    with li.Add do
    begin
      Caption := Before(s[i], ' ');
      SubItems.Add(After(s[i], ' '));
    end;
  li.EndUpdate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  try
    MakeItems(Memo.Lines, ListView1.Items);
  finally
    Screen.Cursor := crDefault;
  end;
end;
Grüße vom marabu

s-off 18. Apr 2006 19:26

Re: Text an bestimmter Stelle splitten
 
Hallo,

warum machst Du es Dir so schwer?

So geht's (nur mit 2 Memos anstelle der zwei Spalten im ListView):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   i, iPos: Integer;
begin
   for i := 0 to Memo1.Lines.Count - 1 do begin
      iPos := Pos(' ', Memo1.Lines.Strings[i]);
      Memo2.Lines.Add(Copy(Memo1.Lines.Strings[i], 0, iPos));
      Memo3.Lines.Add(Copy(Memo1.Lines.Strings[i], iPos, Length(Memo1.Lines.Strings[i])));
   end;
end;

smartmod 19. Apr 2006 20:11

Re: Text an bestimmter Stelle splitten
 
Vielen Dank! Jetzt läufts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 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