AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML schliessen

Ein Thema von TheMiller · begonnen am 19. Jul 2004 · letzter Beitrag vom 20. Jul 2004
Antwort Antwort
MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Re: XML schliessen

  Alt 19. Jul 2004, 18:53
Das benutzte XML-Objekt kannst du durch ein einfaches
xmldoc := nil; freigeben. Aber egal, ich persönlich würde die Idee von mirage vorziehen; sprich: ein XML-Objekt, das von allen Forms genutzt werden kann. Es wird allerdings noch einfacher, diese Idee umzusetzen, wenn du vor oder nach dem Aufruf der jeweiligen Form die Werte zuweist. Das hängt von der Situation ab.

Wenn ich mir aber dein Beispiel von ganz oben ansehe, dann ergibt das für mich nicht viel Sinn. Im "OnActivate" steht bei dir drin, dass er dem XML-Knoten einen neuen Wert zuweisen soll? Oder wolltest du das anders herum; dass er dem Editfeld den Wert aus dem Knoten zuweisen soll?

Wie dem auch sei, du hast Codeteile von Chakotays MovieOrganizer zitiert. Darum verstehe ich persönlich das Problem nicht ganz, denn du könntest einen Blick in das Original werfen und gucken wie Chris und ich das gelöst haben. In der aktuellen Version (1.8.3) gibt es nur noch ein einziges XML-Objekt. Und das liegt in der Hauptform. Wenn man bspw. den Bearbeiten-Dialog aufrufen will, dann sieht der Code so aus:
Delphi-Quellcode:
procedure TMO18Form.IDM_EDITMOVIEClick(Sender: TObject);
var
  curNode : IXMLDOMNodeList;
  idx : integer;
  i : integer;
  li : TListItem;
begin
  // nothing selected, or XML parser is blowin' in the wind ...
  if(MovieList.Selected = nil) or (xmldoc = nil) then exit;

  // get the node, using Movie's title
  idx := -1;
  curNode := xmldoc.selectNodes('/' + mainnode + '/' + movienode +
    '[name="' + MovieList.Selected.Caption + '" and ' +
    'format="' + MovieList.Selected.SubItems[0] + '"]');

  if(curNode.length > 1) then
  begin
    DoubleItems.ListView1.Items.Clear;
    DoubleItems.ListView1.Items.BeginUpdate;
    for i := 0 to curNode.length - 1 do
    begin
      li := DoubleItems.ListView1.Items.Add;
      li.Caption := inttostr(i);
      li.SubItems.Add(curNode.item[i].selectSingleNode(szMovieArray[1]).text);
      li.SubItems.Add(curNode.item[i].selectSingleNode(szMovieArray[2]).text);
    end;
    DoubleItems.ListView1.Items.EndUpdate;

    // show form
    if(DoubleItems.ShowModal = mrOk) then
      idx := DoubleItems.ListView1.Selected.Index;
  end
  // only 1 item
  else
  if(curNode.length = 1) then idx := 0
  // there's nothing
  else
    exit;

  // nothing's selected
  if(idx < 0) then exit;

  with AddingForm do begin

// Hier werden die Werte aus der Datei an die entsprechenden
// Eingabefelder der "AddingForm"-Form übergeben

    Caption := EDITMOVIE;
    Edit1.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[1]).text;
    ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(
      curNode.item[idx].selectSingleNode(szMovieArray[2]).text);
    ComboBox2.ItemIndex := ComboBox2.Items.IndexOf(
      curNode.item[idx].selectSingleNode(szMovieArray[3]).text);
    Edit2.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[4]).text;
    Edit3.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[5]).text;
    ComboBox3.ItemIndex := ComboBox3.Items.IndexOf(
      curNode.item[idx].selectSingleNode(szMovieArray[6]).text);
    ComboBox4.ItemIndex := ComboBox4.Items.IndexOf(
      curNode.item[idx].selectSingleNode(szMovieArray[7]).text);
    Edit4.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[8]).text;
    Memo1.Lines.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[9]).text;
    Edit5.Text :=
      curNode.item[idx].selectSingleNode(szMovieArray[10]).text;


// Wenn der User diese Form mit OK schließt, dann bedeutet
// das, er möchte die neuen Werte speichern; und das passiert
// dann hier

    if(AddingForm.ShowModal = mrOk) then begin
      curNode.item[idx].selectSingleNode(szMovieArray[1]).text := Edit1.Text;
      curNode.item[idx].selectSingleNode(szMovieArray[2]).text :=
        ComboBox1.Items[ComboBox1.ItemIndex];
      curNode.item[idx].selectSingleNode(szMovieArray[3]).text :=
        ComboBox2.Items[ComboBox2.ItemIndex];
      curNode.item[idx].selectSingleNode(szMovieArray[4]).text := Edit2.Text;
      curNode.item[idx].selectSingleNode(szMovieArray[5]).text := Edit3.Text;
      curNode.item[idx].selectSingleNode(szMovieArray[6]).text :=
        ComboBox3.Items[ComboBox3.ItemIndex];
      curNode.item[idx].selectSingleNode(szMovieArray[7]).text :=
        ComboBox4.Items[ComboBox4.ItemIndex];
      curNode.item[idx].selectSingleNode(szMovieArray[8]).text := Edit4.Text;
      curNode.item[idx].selectSingleNode(szMovieArray[9]).text :=
        Memo1.Lines.Text;
      curNode.item[idx].selectSingleNode(szMovieArray[10]).text := Edit5.Text;

      self.UpdateList(ColumnToSort);
    end;
  end;
end;
Ich gebe zu, der Code ist ein bisschen umfangreich. Aber wie du vllt. erkennen kannst, ist nur ein einziges XML-Objekt in der Hauptform notwendig. Auf die Weise vermeidet man Überschneidungen und evtl. Fehler, und nebenbei wird der Code auch kürzer und effizienter.

Das müsstest du mal ausprobieren.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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