XML in Stringgrid übertragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

XML in Stringgrid übertragen

Beitrag von Adenos »

tut mir leid, dass ich schon wieder frage, aber mir fehlen wesentliche Grundlagen. Mir wurde schon geholfen, eine XML-Datei in ein Memo einzulesen, aber mit dem Inhalt eines Memo kann ich nicht ordentlich arbeiten. Deshalb möchte ich jetzt die XML-Datei in ein Stringgrid einlesen. Die XML-Datei hat die folgende Struktur :
<?xml version="1.0" encoding="UTF-8"?>
...
<Cube>
<Cube time='2021-12-10'>
<Cube currency='USD' rate='1.1273'/>
<Cube currency='JPY' rate='128.20'/>
usw.
Wenn meine Fragen als lästig empfunden werden, können sie auch gelöscht werden.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML in Stringgrid übertragen

Beitrag von theo »

Gelöscht wird hier (fast) nichts. :wink:
Du stellst immer sehr allgemeine Fragen, so dass man gar nicht versteht, wo dein Problem eigentlich liegt.
Das mit dem XML wurde dir doch gezeigt.
Verstehst du jetzt nicht, wie man einen StringGrid befüllt?
Wo genau hakt es?

Möchtest du das überhaupt alles lernen, oder möchtest du nur das Resultat haben, wie so ein Fertiggericht? :wink:

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: XML in Stringgrid übertragen

Beitrag von Adenos »

die Sache mit dem XML einlesen, habe ich schon einigermaßen verstanden, und ein Memo mit den Daten zu befüllen, ist schon schwierig genug, aber jetzt will ich ja auch noch ein Stringgrid Zeile für Zeile ansprechen. Ich habe noch nie mit einem Stringgrid gearbeitet, mit XML-Dateien auch noch nie. In meinem Alter scheint mir auch mein Denkvermögen langsam nachzulassen. Trotzdem macht mir das Programmieren mit Lazarus unheimlich viel Spaß. Mir ist schon klar, dass ich Eure Zeit hier über Gebühr beanspruche.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML in Stringgrid übertragen

Beitrag von theo »

StringGrid Inhalte kann man über die Eigenschaft "Cells" verändern:

Code: Alles auswählen

  StringGrid1.RowCount:=20; //Anzahl Zeilen
  StringGrid1.ColCount:=5;  //Default
  StringGrid1.FixedRows:=1; //Default
  StringGrid1.FixedCols:=1; //Default
  StringGrid1.Cells[1,0]:='Demo'; //Fixed
  StringGrid1.Cells[1,1]:='1,1';
  StringGrid1.Cells[1,2]:='1,2';
  StringGrid1.Cells[2,1]:='2,1';
  StringGrid1.Cells[1,19]:='1,19';

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: XML in Stringgrid übertragen

Beitrag von Adenos »

vielen Dank. Das hat schon viel geholfen. Auf den ersten Blick scheint das auch gut zu funktionieren.

Adenos
Beiträge: 67
Registriert: So 17. Okt 2021, 17:18
OS, Lazarus, FPC: Windows 7
CPU-Target: X86
Wohnort: Allgäu

Re: XML in Stringgrid übertragen

Beitrag von Adenos »

ich habe das jetzt so geschrieben:
with Doc.DocumentElement.FindNode('Cube').FirstChild.ChildNodes do
begin
StringGridEZB.Clear;
StringGridEZB.RowCount:=count+1;
for i := 0 to (Count) do
begin
StringGridEZB.Cells[1,(i+1)] := Item.Attributes.GetNamedItem('currency').NodeValue;
StringGridEZB.Cells[2,(i+1)] := Item.Attributes.GetNamedItem('rate').NodeValue;
end;
end;
aber der Compiler meldet eine SIGSEV-Verletzung. Im Programm sind die richtigen Werte eingetragen, aber auch das Programm meldet eine Zugriffsverletzung. Was könnte der Grund sein?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML in Stringgrid übertragen

Beitrag von theo »

Überlege mal.

Code: Alles auswählen

StringGridEZB.RowCount:=count+1;
Reicht das, wenn du bei 1 (bzw. i+1) anfängst?
So müsste es gehen:

Code: Alles auswählen

StringGridEZB.RowCount:=count+2;

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: XML in Stringgrid übertragen

Beitrag von wp_xyz »

Ich meine eher, das Problem ist das Verständnis der 0-basierten Indices: Wenn "count" die Anzahl von irgendwelchen Elementen bedeutet und die Elemente mit i von 0 beginnend durchnummeriert werden, dann hat das letzte Element den index count-1. Beispiel zum Nachzählen: count = 3, also drei Elemente und die haben die Indices 0, 1, 2, aber nicht mehr 3, denn dann wären es 4! Daher: eine 0-basierte for-Schleife, die count Elemente durchläuft, endet immer mit count-1, also:

Code: Alles auswählen

var
  i: Integer;
begin
  for i := 0 to count-1 do 
    .. 
Den Code würde ich daher umschreiben zu

Code: Alles auswählen

with Doc.DocumentElement.FindNode('Cube').FirstChild.ChildNodes do
begin
  StringGridEZB.Clear;
  StringGridEZB.RowCount:=count+1;
  for i := 0 to Count-1 do  // <--- hier geändert
  begin
    StringGridEZB.Cells[1,(i+1)] := Item[i].Attributes.GetNamedItem('currency').NodeValue;
    StringGridEZB.Cells[2,(i+1)] := Item[i].Attributes.GetNamedItem('rate').NodeValue;
  end;
end; 
Hinweis:
Du solltest Code-Passage immer mit [ code ]...[ /code ] Tags einschließen (ohne die Leerzeichen, oder den Code markieren und in der Bearbeitungszeile den Button "</>" klicken). Damit wird zum einen der Code für uns lesbarer und die Forumsoftware interpretiert Indices [ i ] nicht mehr als Beginn von Kursiv-Formatierung ("italic").

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML in Stringgrid übertragen

Beitrag von theo »

Vor allem möchte ich mich entschuldigen, dass ich mit diesem "with" Schwachsinn hier viewtopic.php?p=124936#p124936 begonnen habe.

"WITH" ist giftig., weil es den Code schwer entzifferbar macht und unnötige, mühsam zu debuggende Fehler hervorruft.

Ich schäme mich dafür, dir einen Code mit "with" gezeigt zu haben. Sorry! :oops:

Antworten