Erstmal danke ich euch für eure Antworten.
Wie gesagt, bin ich Schüler (12. Klasse) und von WebBrowser, Indy-Clients, StringGrid und eigentlich allen Komponenten, mal von einigen aus der Registerkarte "Standard" sowie Timer und Image abgesehen, haben wir in der Schule nichts behandelt. Daher ist dies alles neu für mich, was ich auch überhaupt nicht als Entschuldigung vor mir hertragen möchte, aber dennoch verstehe ich sicherlich von Delphi nicht mal 1% dessen, was ihr so wisst.
Ich habe mich gestern und gerade eben etwas mit StringGrid beschäftigt und komme aber bei ein paar Sachen nicht weiter, weil ich nicht weiß, wie ich herausfinde, ob StringGrid bestimmte Sachen kann oder wie ich das herausfinden soll (Delphi-Hilfe und Google haben nur ein wenig geholfen).
Ich beschreibe am besten noch mal etwas genauer, was ich mir für das Programm vorgestellt habe.
Ich habe eine Excel-Datei nach folgendem Muster, die das Programm auf den neuesten Stand bringen soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ALTE TABELLE Name Wert1 Wert2 Wert3 ... A 10 20 30 ... B 500 250 500 ... C 100 90 80 ... D 4 4 4 ...
NEUE TABELLE Name Wert0 Wert1 Wert2 ... A 25 10 20 ... B 400 500 250 ... B1 13 27 86 ... D 5 4 4 ... |
Der aktuellste Wert soll also immer links von den anderen Werten hinkommen. Als "Schwierigkeit" kommt hinzu, dass ggf. neue Zeilen hinzukommen (wie B1), die alphabetisch eingeordnet werden müssen, oder dass ggf. alte Zeilen herauszunehmen sind (wie C).
Für diese Aktualisierung muss nicht nur eine HTML-Tabelle auf
einer Seite verarbeitet werden, sondern z.b. je eine HTML-Tabelle auf
50 Seiten.
Nun hatte vor, mir die Tabelle per IdHTTP.Get zu holen und habe ihn mit dem Tipp von Lannes in ein StringGrid gepackt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| var Quellcode: TStrings; i, j: Integer; myDocument, Tabelle, Zeile: OleVariant;
begin Quellcode := TStringList.Create; try
Quellcode.Text := IdHTTP.Get('www.lustige-URL.de'); WebBrowser.Navigate('about:blank'); myDocument := WebBrowser.Document; myDocument.Clear; myDocument.Write(Quellcode.Text); myDocument.Close;
Tabelle := WebBrowser.OleObject.Document.All.Tags('table').Item(3); StringGrid.RowCount := Tabelle.All.Tags('tr').Length; for i := 0 to (StringGrid.RowCount - 1) do begin Zeile := Tabelle.All.Tags('tr').Item(i); if (Zeile.All.Tags('th').Length > 0) then begin if (Zeile.All.Tags('th').Length > StringGrid.ColCount) then StringGrid.ColCount := Zeile.All.Tags('th').Length; if (Zeile.All.Tags('th').Item(2).InnerText <> '-') then begin for j := 0 to (Zeile.All.Tags('th').Length - 1) do StringGrid.Cells[j, i] := Zeile.All.Tags('th').Item(j).InnerText; end; end; end;
finally Quellcode.Free; end; end; |
Ist mein Weg sehr umständlich? Ich wollte eigentlich auf jeden Fall den idHTTP nehmen, weil ich so die ganzen Internetseiten nicht laden muss, was ja Zeit und Datendownload kostet. Doch habe ich nur den oben "gecodeten" Weg über WebBrowser->OleVariant->StringGrid. Geht das auch direkt idHTTP->StringGrid?
Jetzt habe ich Jannes' Tipp schon etwas modifizert. Es werden im StringGrid nur noch die Zellen mit Inhalt gefüllt, die ich auch brauche. Allerdings heißt das auch, dass ich im StringGrid nun viele leere Zeilen habe und keine einfache Variante zum Löschen dieser gefunden haben.
Kann ich den obigen StringGrid-Füll-Code so abändern, dass er folgendes macht?
Delphi-Quelltext
1: 2: 3:
| if (Spalte[die, in der sich z.b. Wert3 befindet]_dieser_Zeile <> '-') then schreibe_alle_Zellen_dieser_Zeile_voll else gehe_zur_nächsten_Zeile_über; |
Nur kann sich Wert3 in der einen Tabelle mal in Spalte 5 und in einer anderen mal in Spalte 3 oder ganz anders befinden.
Ich hoffe, ihr kommt noch mit, trotzdem um den Ablauf nochmal kurz zu schildern:
- Programm holt sich Tabelle von Internetseite1 und lädt die wichtigen Zeilen in StringGrid
- Programm holt sich Tabelle von Internetseite2 und lädt die wichtigen Zeilen in StringGrid hinzu
- Programm holt sich Tabelle von Internetseite3 und lädt die wichtigen Zeilen in StringGrid hinzu
- usw.
- Programm schreibt neue Spalte (im Beispiel Wert0) links von allen anderen Werten in Exceltabelle, sortiert alte Zeilen aus und neue alphabetisch hinzu
Nur ist mein bisheriger Ansatz dafür in Ordnung oder völlig falsch? Ich bitte euch nicht, mir mein Programm zu schreiben, aber es wäre nett, wenn ihr mir sagen könntet, welchen Weg (also welche Komponenten) ich verwenden sollte und welche Befehle ich mir angucken sollte. Weil es ist alles Neuland für mich und daher weiß ich auch nicht so recht, wonach ich suchen soll
[Edit by me]
Achja, zu MSHTML Parser oder wie ich den StringGrid zur Excel-Datei mache, habe ich nichts gefunden.
@Horst_H: Die Tabelle ist immer die 4. auf der Seite, die Überschrift ist immer anders.