Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Parse Funktion? (https://www.delphipraxis.net/57091-parse-funktion.html)

lucius 15. Nov 2005 18:12


Parse Funktion?
 
Hallo Leute,

Ich hab ne kurze Frage, ich habe einen String(S) mit folgendem Inhalt untereinander.
Zitat:


Category: Diversen
Size: 22.17 MB
Status: no seeders and no leecher
Speed: 0.56 kB/s
Added: 2005-10-14 22:11:15
Download: http://www.hansi.org/download.php/7385/115 Scripts From PopScript.com

Jetzt moechte ich die TeilStrings(Category:),(Size:),(Status:),(Speed:), (Added:),(Download:)
loeschen damit die Werte dahinter ueber Strings weiter gegeben werden koennen.
Delphi-Quellcode:
var
A, B, C, D, E, F: String;

begin
 A := 'Diversen';
 B := '22.17 MB';
 C := 'no seeders and no leecher';

unsw...
end;
Kann mir da einer helfen bitte?
Ich weiss nicht ob das wichtig ist aber nochmals gesagt der Text im String steht untereinander.

Schonmal Danke.

sh17 15. Nov 2005 18:41

Re: Parse Funktion?
 
Wenn der Aufbau immer der gleiche ist, dann so:

alles in eine StringList

Delphi-Quellcode:
var
  hstr : String;
  list : TStringList;
begin
  list := TStringList.Create;
  list.text := meintext;

  for i := 0 to list.count-1 do
  begin
    hstr := list[i];
    Delete(hstr,1,Pos(':',hstr)+1);
    list[i] := hstr;
  end;

  list.Free;
end;

marabu 15. Nov 2005 18:49

Re: Parse Funktion?
 
Hallo Lucius,

noch eine Lösung: Wenn die untereinander stehenden Zeilen so in einem string stehen:

Delphi-Quellcode:
const
  muster
    = ' Category: Diversen'#13#10
    + 'Size: 22.17 MB'#13#10
    + ' Status: no seeders and no leecher'#13#10
    + 'Speed: 0.56 kB/s'#13#10
    + ' Added: 2005-10-14 22:11:15'#13#10
    + 'Download  : [url]http://www.hansi.org/download.php/7385/115[/url] Scripts From PopScript.com'
    ;
Dann kannst du diesen String so analysieren:

Delphi-Quellcode:
function TDemoForm.CreateStrings(s: string): TStrings;
var
  name, value: string;
  i: integer;
begin
  Result := TStringList.Create;
  Result.NameValueSeparator := ':';
  Result.Text := s;
  for i := 0 to Pred(Result.Count) do
  begin
    name := Trim(Result.Names[i]);
    value := Trim(Result.Values[name]);
    Result[i] := name + Result.NameValueSeparator + value;
  end;
end;
Auf das Ergebnis kannst du dann so zugreifen:

Delphi-Quellcode:
var
  s: TStrings;
begin
  s := CreateStrings(muster);
  ShowMessage(s.Values['Category']);
  s.Free;
end;
Grüße vom marabu

sh17 15. Nov 2005 18:54

Re: Parse Funktion?
 
man lernt nie aus!!!

lucius 15. Nov 2005 19:06

Re: Parse Funktion?
 
Hi marabu :thumb:

Deine Funktion klapt, nun bin ich mal wieder mit meinem guten Freund Listview am basteln.
Delphi-Quellcode:
For Counter := 0 to SimpleRSS.Items.Count - 1 do
   Begin
      z := CreateStrings(SimpleRSS.Items.Items[Counter].Description);
      lstbxheadlines.Items.Add(inttostr(counter) + '-' + SimpleRSS.Items.Items[Counter].Title);
              listitem := listview1.Items.add; // Neues Item erzeugen
              listitem.Caption := inttostr(counter);
              listitem.SubItems.add(SimpleRSS.Items.Items[Counter].Title); // Caption des Items setzen
              listitem.SubItems.add(z.Values['Category']);
              listitem.SubItems.add(z.Values['Size']);
              listitem.SubItems.add(z.Values['Status']); <---- ab hier fuegt er nix mehr in die Listview
              .......
   end;
     z.Free;
...

marabu 15. Nov 2005 19:30

Re: Parse Funktion?
 
Nur am Rande: z.Free muss mit in den BEGIN END Block. Hast du genügend Spalten für deine ListView definiert? Oder werden nur Leerstrings in den letzten Spalten hinzugefügt? Schau dir mal den String an, den du in diesem Fall an CreateStrings übergibst.

marabu

lucius 15. Nov 2005 19:37

Re: Parse Funktion?
 
Nabend marabu,

Das mit dem z.Free war mein Fehler stimmt aber er fuegt noch immer Leerstrings ein.
Delphi-Quellcode:
For Counter := 0 to SimpleRSS.Items.Count-1 do
   Begin
        z := CreateStrings(SimpleRSS.Items.Items[Counter].Description);
        lstbxheadlines.Items.Add(inttostr(counter) + '-' + SimpleRSS.Items.Items[Counter].Title);
        listitem := listview1.Items.add; // Neues Item erzeugen
        listitem.Caption := inttostr(counter);
        listitem.SubItems.add(SimpleRSS.Items.Items[Counter].Title); // Caption des Items setzen
        listitem.SubItems.add(z.Values['Category']);
        listitem.SubItems.add(z.Values['Size']); <---- Ab hier Leersstrings
        z.Free;
        end;
Genuegend Spalten habe ich gemacht, 7 Stueck.

marabu 15. Nov 2005 19:49

Re: Parse Funktion?
 
Dann prüfe doch mal, was in deinem Eingabestring steht. Füge nach dem Aufruf von CreateStrings folgendes ein:

Delphi-Quellcode:
ShowMessage(IntToStr(z.Count));
Da müsste dann ja eine 6 ausgegeben werden, wenn ich nicht irre. Setze einen break point in CreateStrings und schau dir den string an, den du dort analysierst.

marabu

lucius 15. Nov 2005 20:05

Re: Parse Funktion?
 
Hi marabu,

Zitat:

Da müsste dann ja eine 6 ausgegeben werden, wenn ich nicht irre.
Es wird eine 7 ausgegeben.

marabu 15. Nov 2005 20:19

Re: Parse Funktion?
 
Lucius, die beiden Zeilen mit dem Trim() sind wichtig gewesen - hast du sie etwa eliminiert?

Delphi-Quellcode:
// ...
  for i := 0 to Pred(Result.Count) do
  begin
    name := Trim(Result.Names[i]);
    value := Trim(Result.Values[name]);
    Result[i] := name + Result.NameValueSeparator + value;
  end;
end;
marabu

lucius 15. Nov 2005 20:45

Re: Parse Funktion?
 
Nein marabu, ich habe die Zeilen nicht eleminiert.
So stehts in meinem Code

Delphi-Quellcode:
function TForm1.CreateStrings(s: string): TStrings;
var
  name, value: string;
  i: integer;
begin
  Result := TStringList.Create;
  Result.NameValueSeparator := ':';
  Result.Text := s;
  for i := 0 to Pred(Result.Count) do
  begin
    name := Trim(Result.Names[i]);
    value := Trim(Result.Values[name]);
    Result[i] := name + Result.NameValueSeparator + value;
  end;
end;
Dan rufe ich ueber einen Button.click die Function auf.
Delphi-Quellcode:
For Counter := 0 to SimpleRSS.Items.Count-1 do
Begin
  z := CreateStrings(SimpleRSS.Items.Items[Counter].Description); <-----
Oder muss der code irgendwo anders stehen? ListviewData?

marabu 15. Nov 2005 21:12

Re: Parse Funktion?
 
So ist es - weil du mit einer virtuellen ListView arbeitest, musst du die Spaltenwerte im OnData-Ereignis der ListView übergeben.

Delphi-Quellcode:
procedure TDemoForm.ListView1Data(Sender: TObject; Item: TListItem);
var
  i: integer;
begin
  i := Item.Index;
  z := CreateStrings(SimpleRSS.Items[i].Description);
  lstbxheadlines.Items.Add(inttostr(i) + '-' + SimpleRSS.Items.Items[i].Title);
  // Neues Item erzeugen
  listitem := listview1.Items.add;
  // Caption des Items setzen:
  listitem.Caption := IntToStr(Succ(i));
  listitem.SubItems.add(SimpleRSS.Items[i].Title);
  listitem.SubItems.add(z.Values['Category']);
  // ...
  z.Free;
end;
Sobald du SimpleRSS geladen hast, musst du ListView1.Items.Count auf SimpleRSS.Items.Count setzen.

marabu

lucius 15. Nov 2005 21:35

Re: Parse Funktion?
 
Zitat:

Sobald du SimpleRSS geladen hast, musst du ListView1.Items.Count auf SimpleRSS.Items.Count setzen.
Uuuuu hab mal kurz nen blackout, was muss jetzt in Button.click rein sodas die ListviewDaten angezeigt werden?
Habe den Code in ListVIew1Data eingefuegt.

marabu 16. Nov 2005 06:05

Re: Parse Funktion?
 
Moin Lucius,

bei einer virtuellen ListView ist das so, dass nur der item count direkt manipuliert wird - alles andere fragt die ListView selbst über ihre event handler ab. Nachdem die Komponente SimpleRSS den Feed geladen hat, musst du noch eine Zeile einfügen:

Delphi-Quellcode:
...
ListView.Items.Count := SimpleRSS.Items.Count;
...
Danach fragt die ListView über das Ereignis OnData() bei dir an, welche Daten sie für ein bestimmtes Item annehmen soll. Die einzige verlässliche Eigenschaft des Item ist zu diesem Zeitpunkt Index und über diesen Index musst du die richtigen Daten in SimpleRSS finden und an das Item übergeben.

Grüße vom marabu

stoxx 24. Nov 2005 16:37

Re: Parse Funktion?
 
folgendes übernimmt TListview und ist falsch und muss raus:

Delphi-Quellcode:
// Neues Item erzeugen
  listitem := listview1.Items.add;
und dann: (Item: jenes welches benutzen, dass Dir die Procedure selber übergibt)

Delphi-Quellcode:
  // Caption des Items setzen:
  item.Caption := IntToStr(Succ(i));
  item.SubItems.add(SimpleRSS.Items[i].Title);
  item.SubItems.add(z.Values['Category']);


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