Thema: Delphi XML schliessen

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: XML schliessen

  Alt 19. Jul 2004, 19: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