Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suche Alternative zu Array (https://www.delphipraxis.net/112150-suche-alternative-zu-array.html)

marabu 17. Apr 2008 20:46

Re: Suche Alternative zu Array
 
Hallo Christian,

aufregender Code. Schau dir aber mal deinen Index an:

Delphi-Quellcode:
for J := 0 to XML.DocumentElement.ChildNodes[I {XMLNode}].ChildNodes.Count - 1 do
Gute Nacht

Yheeky 17. Apr 2008 20:53

Re: Suche Alternative zu Array
 
Zitat:

Zitat von marabu
Hallo Christian,

aufregender Code. Schau dir aber mal deinen Index an:

Delphi-Quellcode:
for J := 0 to XML.DocumentElement.ChildNodes[I {XMLNode}].ChildNodes.Count - 1 do
Gute Nacht

Ohje!! :shock:

Das soll natürlich so heissen:

Delphi-Quellcode:
function TForm1.LeseDaten(XMLString : String) : TList;
var I, J : integer;
    neuerDatensatz : PDaten;
    tempList : TList;
begin
  XML := newXMLDocument;
  XML.XML.Text := XMLString;
  XML.Active := True;

  // Datensatzlist erstellen
  tempList := TList.Create;

  // Werte zählen
  for I := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
    begin
      for J := 0 to XML.DocumentElement.ChildNodes[I].ChildNodes.Count - 1 do
      begin
        // neuen Datensatz erstellen
        neuerDatensatz := new(PDaten);

        neuerDatensatz.ID := i;
        neuerDatensatz.Key := XML.DocumentElement.ChildNodes[I].ChildNodes[J].NodeName;
        neuerDatensatz.Value := XML.DocumentElement.ChildNodes[I].ChildNodes[J].NodeValue;

        tempList.Add(neuerDatensatz);

        // Lösche Datensatz
        Dispose(neuerDatensatz);
      end;

    end;

    result := tempList;

end;
PS: War das gute Nacht auf den Code bezogen? ;-)

Wenn nicht, dir auch ne gute Nacht! :-D

marabu 18. Apr 2008 07:46

Re: Suche Alternative zu Array
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Christian,

Zitat:

Zitat von Yheeky
... War das gute Nacht auf den Code bezogen? ...

natürlich nicht - ich wollte mich lediglich Richtung Bett abmelden.

Du machst da einige nicht so schöne Sachen, aber richtig mies wird es, wenn du einen Zeiger auf einen dynamisch angeforderten Speicherplatz in deine Liste aufnimmst, den Speicher aber sofort wieder freigibst. Das geht auch besser:

Delphi-Quellcode:
const
  RECORDNAME = 'computerdaten';

procedure ExtractValues(doc: IDOMDocument; recNo: Cardinal; s: TStrings);
var
  dlRecs: IDOMNodeList;
  dnRec: IDOMNode;
  dnFld: IDOMNodeEx;
begin
  with doc.documentElement as IDOMNodeSelect do
  begin
    dlRecs := selectNodes(RECORDNAME);
    dnRec := dlRecs.item[Pred(recNo)];
    s.Clear;
    dnFld := dnRec.firstChild as IDOMNodeEx;
    while Assigned(dnFld) do
    begin
      s.Values[dnFld.nodeName] := dnFld.Text;
      dnFld := dnFld.nextSibling as IDOMNodeEx;
    end;
  end;
end;
Freundliche Grüße

Yheeky 23. Apr 2008 22:13

Re: Suche Alternative zu Array
 
Zitat:

Zitat von marabu
Du machst da einige nicht so schöne Sachen, aber richtig mies wird es, wenn du einen Zeiger auf einen dynamisch angeforderten Speicherplatz in deine Liste aufnimmst, den Speicher aber sofort wieder freigibst.

Mache ich das denn mit dem dynamischen Speicher?

Delphi-Quellcode:
type
  TDaten = class(TObject)
    ID : Cardinal;
    Key, Value : String;
  end;

  TDatenliste = class(TObjectList)
  protected
    function getItem(Index: Cardinal): TDaten; virtual;
    procedure setItem(Index: Cardinal; Objekt: TDaten); virtual;
  public
    function Add(Objekt: TDaten): Cardinal; virtual;
    function Remove(Objekt: TDaten): Cardinal; virtual;
    function IndexOf(Objekt: TDaten): Cardinal; virtual;
    procedure Insert(Index: Cardinal; Objekt: TDaten); virtual;
    property Items[index: Cardinal]: TDaten read getItem write setItem; default;
  end;

//...

function TDatenliste.getItem(Index: Cardinal): TDaten;
  begin
    Result := TDaten(inherited Items[Index]);
  end;

  procedure TDatenliste.setItem(Index: Cardinal; Objekt: TDaten);
  begin
    inherited Items[Index] := Objekt;
  end;

  function TDatenliste.Add(Objekt: TDaten): Cardinal;
  begin
    Result := inherited Add(Objekt);
  end;

  function TDatenliste.IndexOf(Objekt: TDaten): Cardinal;
  begin
    Result := inherited IndexOf(Objekt);
  end;

  procedure TDatenliste.Insert(Index: Cardinal; Objekt: TDaten);
  begin
    inherited Insert(Index, Objekt);
  end;

  function TDatenliste.Remove(Objekt: TDaten): Cardinal;
  begin
    Result := inherited Remove(Objekt);
  end;

//...

function TForm1.LeseDaten(Dateitext : String) : TDatenliste;
var newEntry : TDaten;
    tempDatenliste : TDatenliste;
    i, j : Cardinal;
begin
  XML := newXMLDocument;
  XML.XML.Text := Dateitext;
  XML.Active := True;

  tempDatenliste := TDatenliste.Create;

  for i := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
    begin
    for j := 0 to XML.DocumentElement.ChildNodes[i].ChildNodes.Count - 1 do
      begin
        newEntry := TDaten.Create;

        newEntry.ID := i;
        newEntry.Key := XML.DocumentElement.ChildNodes[i].ChildNodes[j].NodeName;
        newEntry.Value := XML.DocumentElement.ChildNodes[i].ChildNodes[j].NodeValue;

        tempDatenliste.Add(newEntry);
      end;
    end;

  result := tempDatenliste;

end;
Was mit aufgefallen ist: wenn ich den Debugger laufen lasse und nach jedem Durchlauf der for-Schleife in tempDatenliste schaue, steht da irgendwie nichts drin. Es wird mit () angezeigt...was mich wundert ist, dass am Ende trotzdem die richtige Liste ausgegeben wird. Vielleicht hängt das ja noch mit einigen Schwachpunkten zusammen.

Wie kann ich denn den Code hier noch verbessern?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz