Results 1 to 7 of 7

Thread: JvAppXMLFileStorage en ReadStringObjectList

  1. #1

    JvAppXMLFileStorage en ReadStringObjectList

    Hallo hallo,

    In mijn applicatie maak ik gebruik van de volgende code uit de JVCL om een stringlist + object weg te schrijven naar een XML.

    Code:
      JvAppXMLFileStorage.WriteStringObjectList('sl', FPatIdList as TStringList, 'TPatRec');
    Dit gaat goed alleen heb ik problemen met het teruglezen. Het volgende werkt helaas niet:
    Code:
      JvAppXMLFileStorage.ReadStringObjectList('sl', FPatIdList, True, 'TPatRec');
    Waarschijnlijk komt dit doordat niet bekend is welk type het object moet zijn dat ingelezen wordt. Iemand een suggestie hoe ik dit kan oplossen?

    Bij voorbaat dank!

  2. #2
    Heb je die TPatRec ook geregistreerd?
    Er wordt een GetClass(NewClassName).Create gedaan.

    Je kunt eventueel ook een CreateItem functie meegeven.

    Zoiets als dit voorbeeld:

    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3.   SL := TStringList.Create;
    4.   SL.AddObject('Button1', Button1);
    5.   SL.AddObject('Button2', Button2);
    6. end;
    7.  
    8. procedure TForm1.FormDestroy(Sender: TObject);
    9. begin
    10.   FreeAndNil(SL);
    11. end;
    12.  
    13. procedure TForm1.Button1Click(Sender: TObject);
    14. begin
    15.   JvAppXMLFileStorage1.WriteStringObjectList('AppStorageTest', SL);
    16.   JvAppXMLFileStorage1.Flush;
    17. end;
    18.  
    19. function TForm1.CreateItem(Sender: TJvCustomAppStorage; const Path: string; Index: Integer): TPersistent;
    20. begin
    21.   Result := TButton.Create(Self);
    22. end;
    23.  
    24. procedure TForm1.Button2Click(Sender: TObject);
    25. var
    26.   I: Integer;
    27.   B: TButton;
    28. begin
    29.   ShowMessage('Deleting Buttons...');
    30.   Button1.Free;
    31.   Button2.Free;
    32.   ShowMessage('Recreating Buttons now...');
    33.   JvAppXMLFileStorage1.ReadStringObjectList('AppStorageTest', SL, CreateItem);
    34.   for I := 0 to SL.Count - 1 do begin
    35.     TButton(SL.Objects[I]).Parent := Self;
    36.   end;
    37. end;

  3. #3
    Ik was helemaal niet op de hoogte dat je een CreateItem moest gebruiken Mijn dank is groot.

  4. #4
    Quote Originally Posted by luigi View Post
    Ik was helemaal niet op de hoogte dat je een CreateItem moest gebruiken Mijn dank is groot.
    Normaal probeert ie een GetClass(NewClassName).Create te doen. Maar dan moet je je class wel met RegisterClass geregistreerd hebben zodat Delphi weet dat die Class bestaat.

    Maar anders kun je inderdaad gewoon zelf de CreateItem meegeven.

  5. #5
    Nog even een vraagje. Ik probeer het nu met de ingebouwde factory method te doen i.p.v. CreateItem. Het lijkt alleen dat classname nergens in mijn XML wordt weggeschreven. Bij het ophalen krijg ik dan een access violation omdat de classname leeg is. Ik heb met register class de klasse wel geregistreerd. Ben ik iets vergeten?

  6. #6
    Ik zie dat RegisterClass alleen goed werkt voor Classes die inherited zijn van TPersistent.

    https://stackoverflow.com/a/7738033/1037511

    Ik weet niet hoe jouw TPatRec eruit ziet?

  7. #7
    PatRec erft van TPersistent. Het is me nu wel gelukt om de XML weer uit te lezen als ik handmatig de class name toevoeg aan het XML.
    Code:
    <Classname>TSomeObject</Classname>
    Ik snap alleen niet goed waarom dit niet automatisch gebeurd.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •