Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Interneteintrag in Listview auflisten (https://www.delphipraxis.net/141569-interneteintrag-listview-auflisten.html)

eistee 11. Okt 2009 17:12


Interneteintrag in Listview auflisten
 
Guten Tag,

ich will endlich mal wieder ein kleines Programm schreiben um wieder reinzukommen und wollte eine Methode wissen wie mann sowas

http://img5.imagebanana.com/img/btub4jm/http.JPG

In einer Listview so auflisten kann :

http://img5.imagebanana.com/img/kriqex6q/glckskeks.JPG

Codeschnipsel sind erwünscht. :-)

Mit freundlichen Grüßen,
Eistee

Edit :

Hier der HTTP Code

Delphi-Quellcode:
   <td>[B][Artikelname][/B]</td>
   <td>[B][Preis][/B]</td>
   <td>[B][Verfügbarkeit][/B]</td>

   <td>[B][In den Korb][/B]</td>
   </tr>
      <tr>
   <td>Glückskeks</td>
   <td><center>0.2</center></td>
   <td><center>
                        <div style="color: limeGreen;">Verfügbar</div>

                        </center></td>

jfheins 11. Okt 2009 17:17

Re: Interneteintrag in Listview auflisten
 
Eine Listview hat Items und jedes Item wiederum Subitems ;)

Code z.B. hier: http://www.delphipraxis.net/internal...tview+item+add

eistee 11. Okt 2009 17:29

Re: Interneteintrag in Listview auflisten
 
Das ist nicht das Problem.

Sondern das herrausschreiben aus der .php File und das richtige zu finden.

jfheins 11. Okt 2009 17:35

Re: Interneteintrag in Listview auflisten
 
Achso ^^

Ich nehme mal an, das ist nicht "dein" PHP-Skript (kannst also die Ausgabe nicht beeinflussen) ?

Also im einfachsten Fall kannste einfach nen XML-Parser drüberlaufen lassen und dir die Daten rauspicken.
Ansonsten halt "selber parsen" mit Stringfunktionen/regulären Ausdrücken.

Ist die Struktur immer gleich?

eistee 11. Okt 2009 17:45

Re: Interneteintrag in Listview auflisten
 
Die Struktur ist immer gleich allerdings war das jetzt nur ein Beispiel mit einem Eintrag es kann auch sein das es mehrere Seiten sind voller Einträge.

Hast du vielleicht mal einen Code Schnipsel für den XML-Parser weil damit habe ich noch nie gearbeitet.

Mit freundlichen Grüßen,
Eistee

eistee 11. Okt 2009 19:18

Re: Interneteintrag in Listview auflisten
 
Delphi-Quellcode:
 
s := idhttp1.GET('http://test/showcat-4');
Anfang := '<td>[B][In den Korb][/B]</td>';
Ende  := 'Anzeigen';
Pos0     := Pos(Anfang, s);
Ergebnis := Copy(s, Pos0 + length(Anfang), 100);
Pos1     := Pos(Ende, Ergebnis);
Delete(Ergebnis, Pos1, 100 + length(Anfang));
Delete(Ergebnis, 1, 20);

Showmessage(ergebnis);
Anzeigen klappt zwar aber es kann sein das der Eintrag verändert wird wie automatiesiere ich die Delete Funktion, und es kann ja sein das mehrere Einträge da sein könnten ich verzweifel noch dran :-(

Mfg,
Eistee

eistee 11. Okt 2009 20:47

Re: Interneteintrag in Listview auflisten
 
Delphi-Quellcode:
      Anfang := '<td>[B][In den Korb][/B]</td>';
Ende  := 'Anzeigen';
Pos0     := Pos(Anfang, s);
Ergebnis := Copy(s, Pos0 + length(Anfang), 129);
Pos1     := Pos(Ende, Ergebnis);
Delete(Ergebnis, Pos1, 129 + length(Anfang));
ergebnis := Stringreplace(ergebnis, '<center>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '</center>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '<td>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '</td>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '<div style=', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '<tr>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '</tr>', '', [rfReplaceAll]);
ergebnis := Stringreplace(ergebnis, '"color: limeGreen;">', '', [rfReplaceAll]);

Showmessage(ergebnis);
Damit bekomme ich jetzt

Glückskeks
0.2
Verfügbar

angezeigt wie bekomm ich es in das Listview bzw wie trenne ich die 3 Sachen?

Mfg

jfheins 11. Okt 2009 21:07

Re: Interneteintrag in Listview auflisten
 
Naja, trennen aich mit Pos, Copy und Delete (Zeilenumbruch ist #13#10) ;)

Wie man Items in ein Listview tut, habe ich ja oben schon verlinkt ;)

eistee 11. Okt 2009 22:00

Re: Interneteintrag in Listview auflisten
 
Naja es kann ja Morgen auch schon z.B Getränke dort stehen und was mach ich dann?
Dann muss ich alle Zahlen ändern das bringt doch nichts.

Auserdem wenn es mehrere sind bringt es auch nichts...

Gibt es da keine andere Methode?

Luckie 11. Okt 2009 23:08

Re: Interneteintrag in Listview auflisten
 
Zitat:

Zitat von eistee
Das ist nicht das Problem.

Sondern das herrausschreiben aus der .php File und das richtige zu finden.

Und was hat dein Problem denn dann mit der Überschrift zu tun? Dein Problem ist doch ein ganz anderes, nämlich das extrahieren der gewünschten Informationen aus einer HTML-Seite. Das hat doch primär mit dem Listview nichts zu tun.

stiftII 12. Okt 2009 02:18

Re: Interneteintrag in Listview auflisten
 
Du musst dich eben durch die gesamte datei hangeln um alle Einträge auszulesen ;). Wie das geht weißt du ja offenbar ( Siehe 3 posts vorher).

Zitat:

Naja es kann ja Morgen auch schon z.B Getränke dort stehen und was mach ich dann?
Dann muss ich alle Zahlen ändern das bringt doch nichts.

Auserdem wenn es mehrere sind bringt es auch nichts...

Gibt es da keine andere Methode?
Du könntest natürlich auch die Datenbank hacken und die Tabellen direk vom Server per sql anzapfen ;). Aber mit Strinfunktionen biste sicherlich besser beraten ;).


~stift

NickelM 12. Okt 2009 08:21

Re: Interneteintrag in Listview auflisten
 
So nach einer längen Beschäftigung :coder: mit diesem Problem hab ich nun folgende Lösung gefunden:
Delphi-Quellcode:
var ergebnis,s,Ende,Anfang,Eintrag : String;
    Pos0,Pos1,Count,ZeileIndex : Integer;
begin
s := Edit1.Text; //Dein Text ist halt ein zusammenhängender String ohne Leerzeichen und Zeilenumbruch...ich hoffe dass ich das richtig verstanden hab
Anfang := '<td>[B][In den Korb][/B]</td>';
Ende  := '</table>';
Pos0     := Pos(Anfang, s);
Pos1     := Pos(Ende, s);
Ergebnis := Copy(s, Pos0 + length(Anfang), Pos1-Pos0);
Ergebnis := Stringreplace(ergebnis, '<div>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '</div>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '<center>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '</center>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '<td>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '</td>', ' ', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '<div style=', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '<tr>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '</tr>', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '"color: limeGreen;">', '', [rfReplaceAll]);
Ergebnis := Stringreplace(ergebnis, '</table>', '', [rfReplaceAll]);
Pos0 := 1;
Count := 1;
ZeileIndex := 0;
while Pos0 > 0 do
begin
Pos1 := PosEx(' ', Ergebnis,Pos0);
Eintrag := Copy(Ergebnis, Pos0, Pos1-Pos0);
if (Count = 1) and (Eintrag > '') then
with ListView1.Items.Add do
Caption := Eintrag
else
ListView1.Items[ZeileIndex].SubItems.Add(Eintrag);
if Count = 3 then
ZeileIndex := ZeileIndex + 1;
if Count = 3 then
Count := 1
else
Count := Count + 1;

Pos0 := PosEx(' ', Ergebnis ,Pos1)+1;
if Pos0 = Length(Ergebnis)+1 then
Pos0 := 0;
end;

end;
Der HTTP-Code hab ich für nene Test erweitert...ich hoffe das es deinem Schema entspricht:

Code:
<table><td>[B][Artikelname][/B]</td><td>[B][Preis][/B]</td><td>[B][Verfügbarkeit][/B]</td><td>[B][In den Korb][/B]</td><tr><td>Glückskeks</td><td><center>0.2</center></td><td><center><div style="color: limeGreen;">Verfügbar</div></center></td></tr><tr><div><center>Gertränke<center></div></td><div><center>0.5</center></div></td><td><div style="color: limeGreen;">Verfügbar</div></td></tr></table>

eistee 12. Okt 2009 10:50

Re: Interneteintrag in Listview auflisten
 
Danke schonmal hat mich sehr viel weitergebracht allerdings kommt bei

Delphi-Quellcode:
ListView1.Items[ZeileIndex].SubItems.Add(Eintrag);
Immer dieser Fehler :

http://saved.im/mtq4nju5dhvn/error.jpg


Und dann wird er so in der Listview angezeigt :

http://saved.im/mtq4nju4dzzm/error2.jpg

Mfg

hugo1990 12. Okt 2009 10:58

Re: Interneteintrag in Listview auflisten
 
Ich würde dir empfehlen, für das ganze einen XML-Parser zu verwenden oder dich mal mit regulären Ausdrücken zu beschäftigen, dann brauchst du nicht solche Verränkungen mit Pos, Copy, etc. zu machen.

Zu dem Problem mit der Zugriffsverletzung: ZeilenIndex wird wohl größer sein als die Anzahl der Elemente in der ListView - 1.
Notfalls einfach mal das ganze debuggen.

Luckie 12. Okt 2009 11:28

Re: Interneteintrag in Listview auflisten
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von eistee
Das ist nicht das Problem.

Sondern das herrausschreiben aus der .php File und das richtige zu finden.

Und was hat dein Problem denn dann mit der Überschrift zu tun? Dein Problem ist doch ein ganz anderes, nämlich das extrahieren der gewünschten Informationen aus einer HTML-Seite. Das hat doch primär mit dem Listview nichts zu tun.

Hach :angel2: . Ich hatte ja irgendwie die Hoffnung, dass der Threadersteller seinen Beitragstitel entsprechend anpassen würde... :?

NickelM 13. Okt 2009 00:52

Re: Interneteintrag in Listview auflisten
 
Ja eistee,

Schön wenn ich dir weiter helfen konnte, aber ein bischen musst du selbst denken. Versuch doch mal zu verstehen wie ich das gemeint habe.
Stimmt ich hätte noch Kommentare dazuschreiben sollen.
Gut nun kommt die Erklärung nachträglich :mrgreen: :
ZeileIndex soll den Zeilen Count-1 der Tabelle des HTTP-Codes darstellen. D.h. 0 für die erste Zeile und 1 für die 2te und so weiter.

Count soll die Anzahl der Spalten im Grid darstellen, ich bin davon ausgangen das es nur 3 Spalten sind also nur bis 3 aber du hast ja 5 also musst du es auf 5 erhöhen bei der If Anweisung. Er erhöht ZeileIndex, wenn sie den angegeben Wert hat. Count wird durch jeden Aufruf der while Schleife erhöht, bis sie die Zahl erreicht und fängt dan wieder bei 1 an.

Pos0 ist in diesem Fall der Anfang für Copy und Pos1 das Ende. Ich bin davon ausgangen wenn ich alle HTTP-Code Sachen wie <div> lösche das ich dan nur die Strings also Glückskeks usw bekomme. Eine Zelle im HTTP Code wird doch durch ein </td> beendet ,oder? Deshalb hab ich dort nen Leerzeichen eingefügt, damit ich sie irgendwie einzeln auslesen kann.

TIPP:Da du ja die 2 letzten weglässt musst du logischer weise noch eine Anweisung schreiben, die sagt, wenn Count größter ist als 3 mach nichts ansonsten füge ein xD
Vllt verstehst du ja wie du das hinbekommst. Das mit href=.... ist noch ein HTTP Code den ich nicht wusste das er noch darin existiert deshalb ging es net so.
Das Prinzip von deinem angegeben Code war doch alles zulöschen um die Einträge zubekommen oder? Also mach das auch mit den restlichen xD


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