XMLPropStorage eigene Werte hinzufügen

Rund um die LCL und andere Komponenten
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Hallo!

Ich hoffe, es hat schon einmal jemand mit XMLPropStorage oder einer ähnlichen Komponente gearbeitet. Damit kann man automatisch verschiedene Werte wie z.B. Form.Top speichern und bei Programmstart wiederherstellen. Geht alles ohne Zutun. Nun hab ich aber auf meiner Form auch weitere Variablen, die ich in diesem Designtime-Editor nicht hinzufügen kann. Die muss ich doch da auch irgendwie reinimpfen können. Hat jemand eine Idee wie das geht? Ich nehme an es geht irgendwie mit XMLPropStorage.StoredValues, aber damit komm ich ohne Hilfe nicht klar...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Hm, ich hab grad mal das ganze Lazarus-Verzeichnis nach Dateien durchsucht, die den String "StoredValues" enthalten. Hatte gehofft den Quellcode vom Designtime-Editor für StoredValues zu finden, aber leider Fehlanzeige. Wenn man diesen Quellcode findet und studiert, sollte die Handhabe ja klar werden, aber wieso hab ich den so nicht gefunden? Dachte immer es sind alles Sources dabei? Wo bekomm ich diesen Code her?

Alles, was ich bisher an Info zu TXMLPropStorage finden konnte, ist http://wiki.freepascal.org/TXMLPropStorage" onclick="window.open(this.href);return false;, aber dort steht halt nur, wie man den Designtime-Editor benutzt, den ich ja nicht verwenden kann, weil die zu speichernden Infos erst zur Runtime erzeugt werden...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von monta »

Hä?

Rechtsklick auf TXMLPropStorage > Suche Deklaration, dann vielleicht nochmal das selbe mit StoredValues und du landest über die Unit XMLPropStorage in die Unit StoredValues.

Und die liegen beide im Ordner LCL im Lazarusverzeichnis.
Johannes

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Ich habs herausbekommen: XMLPropStorage.StoredValues ist von TCollection abgeleitet. Zu TCollection hab ich jetzt gefunden, wie man die verwendet (war mir bisher unbekannt). Werd mich da jetzt mal reinfuchsen...

@monta: Das hatt ich schon gefunden, aber einzig daraus wurde ich auch nicht schlau. Was ich gesucht hatte, war die Implementation vom Designtime-Editor von (wie ich jetzt weiß) TCollection, die befindet sich in \ideintf\propedits.pp.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von Christian »

Du musst nur beachten das die Werte in der Komponente also zur Designzeit eingetragen sind. Also alle Werte die du verwenden willst in StoredValues eintragen.
Dann kannst du über StoredValue['MEINWERT'] lesend und schreibend darauf zugreifen. Funktioniert prima.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Naja, wie gesagt, mir geht´s vor allem drum, zur Runtime neue Werte einzutragen. Sonst wär es kein Problem ;-) Ich hab eine TList, die überschaubare kleine Objekte speichert, und die will ich von XMLPropStorage mit speichern lassen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von Christian »

Dazu ist das ding aber nie gedacht und macht sich auch nicht gerade toll da du dann alle Elemente in einen String quetschen musst und den selbst zusammenfügen und zerlegen. Da nimmst lieber normale DOM XML Files und die fpc xml klassen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Hm, ich dachte mir sowas:

Code: Alles auswählen

procedure TFMain.XMLPropStorageSavingProperties(Sender: TObject);
var
  i, j: Integer;
begin
  with TStoredValue(XMLPropStorage.StoredValues.Add) do begin
    Name := 'Aktionen';
    with TStoredValue(StoredValues.Add) do begin
      Name := 'SortedBy';
      Value := Aktionen.SortedBy;
    end;
    with TStoredValue(StoredValues.Add) do begin
      Name := 'SortedRev';
      Value := booltostr(Aktionen.SortedRev);
    end;
    for i := 0 to Aktionen.Count-1 do
      with TStoredValue(StoredValues.Add) do begin
        Name := 'Item'+inttostr(i);
        with TStoredValue(StoredValues.Add) do begin
          Name := 'Start';
          Value := floattostr(Aktionen[i].Start);
        end;
        with TStoredValue(StoredValues.Add) do begin
          Name := 'Ende';
          Value := floattostr(Aktionen[i].Ende);
        end;
        with TStoredValue(StoredValues.Add) do begin
          Name := 'Versand';
          Value := Aktionen[i].Versand;
        end;
        with TStoredValue(StoredValues.Add) do begin
          Name := 'Thema';
          Value := Aktionen[i].Thema;
        end;
        with TStoredValue(StoredValues.Add) do begin
          Name := 'Kommentar';
          for j := 0 to Aktionen[i].Kommentar.Count-1 do
            with TStoredValue(StoredValues.Add) do begin
              Name := 'Item'+inttostr(j);
              Value := Aktionen[i].Kommentar[j];
            end;
        end;
      end;
  end;
end;
Aber das gibt einen Pointerfehler im weiteren Programmverlauf (nicht in dieser Prozedur).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Christian hat geschrieben:Da nimmst lieber normale DOM XML Files und die fpc xml klassen.
Gib mir mal einen Kurzeinstieg (oder Links), kenn mich da überhaupt nicht aus.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von Christian »

W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Damnach ist wohl TXMLDocument die für mich interessante Klasse?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von Christian »

Code: Alles auswählen

Var
  S : TStringStream;
  XML : TXMLDocument;
 
begin
  S:= TStringStream.Create(MyXMLString);
  Try
    S.Position:=0;
    XML:=Nil;
    ReadXMLFile(XML,S); // Komplettes XML-Dokument
    // Alternativ:
    ReadXMLFragment(AParentNode,S); // Nur das XML-Fragment lesen.
  Finally
    S.Free;
  end;
end;
 
So, Beispiel für ganz hilflose aus der Wiki die als erstes unter Google verlinkt war rauskopiert.

http://www.thomas-zastrow.de/texte/fpcx ... riting.php

^Url des 2. Links unter Google eingefügt darin wird schön beschrieben wie man schreibt
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: XMLPropStorage eigene Werte hinzufügen

Beitrag von RSE »

Danke. Ich wollte eigentlich nur sicher gehen, dass ich mich nicht wieder mit der falschen Klasse für meine Aufgabe auseinandersetze.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten