Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Nuclear-Ping 16. Apr 2008 10:59

Re: Suche Alternative zu Array
 
Zitat:

Zitat von Yheeky
Wenn ich drei verschiedene Daten speichern möchte wie z.B. Automarke, Modell und Anzahl Türen. Normalerweise wäre das in einem Array: [...]

Also wenn man sowas in C "normalerweise" in (so-)einem Array ablegt, dann muss ich sagen, dass ich sehr froh bin, mit Delphi zu arbeiten. :mrgreen:
In den Kinderschuhen von Pascal und Delphi lernt man doch bereits, Records zu verwenden und mit Arrays umzugehen (für die Lernwilligen). Wo lernt man bitte sowas in C? :shock:

Hador 16. Apr 2008 15:06

Re: Suche Alternative zu Array
 
Zitat:

Zitat von Nuclear-Ping
Also wenn man sowas in C "normalerweise" in (so-)einem Array ablegt, dann muss ich sagen, dass ich sehr froh bin, mit Delphi zu arbeiten. :mrgreen:
In den Kinderschuhen von Pascal und Delphi lernt man doch bereits, Records zu verwenden und mit Arrays umzugehen (für die Lernwilligen). Wo lernt man bitte sowas in C? :shock:

Vorsicht! C# != C

Zitat:

Zitat von Yheeky
Aber bei einem Array muss ich ja immer die Größe mit angeben und das ist bei C# beim Typ list<> z.B. nicht so.

Du kannst wenn du willst auch ein Array dynamisch in der Länge verändern:

Delphi-Quellcode:
...
var
  a: array of String;
begin
  SetLenth(a, 5); // Nun hast du schonmal 5 Speicherstellen
  a[0] := 'blubb';
  ...
  SetLength(a, 25); //Un nun hast du 25 Speicherstellen
end;
Schöner ist es aber wie schon gesagt mit einer Liste. Ich bevorzuge dabei die TObjectList von Delphi bzw. bei nonVCL-Projekten neme ich meine eigene TObjList.

Yheeky 16. Apr 2008 15:20

Re: Suche Alternative zu Array
 
Zitat:

Zitat von M. Hassmann
dann erstellst du dir ein record:

Delphi-Quellcode:
type
  TAuto = record
    Marke: string;
    Modell: string;
    Tueren: Integer;
  end;
  PAuto = ^TAuto;
Und mit einer TList oder einem Array kannst Du dann Deine Records bzw. Pointer auf Reocrds verwalten.


Delphi-Quellcode:
var
  AList: TList;
  Auto1: PAuto;
  Auto2: PAuto;
begin
  ...
  AList := TList.Create();
  try
    Alist.Add(Auto);
    ...
    Auto2 := AList[0];
  finally
    AList.Free();
  end;

Okay, aber wie kann ich die Daten füllen? Wenn ich auf Auto.Marke zugreife kommt bei mir ne Fehlermeldung (Speicherzugriffverletzung).

semo 16. Apr 2008 15:26

Re: Suche Alternative zu Array
 
Delphi-Quellcode:
type
  TAuto = record
    Marke: string;
    Modell: string;
    Tueren: Integer;
  end;
  PAuto = ^TAuto;

procedure TForm4.FormCreate(Sender: TObject);
var
  AList: TList;
  Auto1: PAuto;
  Auto2: PAuto;
begin
  AList := TList.Create();
  try
    Auto1 := New(PAuto);
    Auto1.Marke := 'blubb';
    Alist.Add(Auto1);
    Auto2 := AList[0];
    ShowMessage(Auto2^.Marke);
  finally
    AList.Free();
  end;
end;
mal eben zusammengehackt.
Speicher sollte nach new() auch wieder freigegeben werden mit dispose

Yheeky 16. Apr 2008 15:37

Re: Suche Alternative zu Array
 
Ah, cool...funktioniert auch! :-)

Warum das ^ in der Zeile:
Delphi-Quellcode:
ShowMessage(Auto2^.Marke);
Funktioniert doch auch ohne?!

Danke!!!

DeddyH 16. Apr 2008 15:40

Re: Suche Alternative zu Array
 
Dass es auch ohne funktioniert, liegt an der Compiler-Magic, richtig ist es auf jeden Fall mit ^.

Yheeky 17. Apr 2008 20:07

Re: Suche Alternative zu Array
 
Hab doch noch mal ne Frage, weil bei mir was nicht funktioniert.
Ich habe folgenden Code, mit dem ich XML Daten auslese. Diese sollen dann in eine TList:

Delphi-Quellcode:
type
  TDaten = record
    ID : Cardinal;
    Key : String;
    Value : String;
  end;

  PDaten = ^TDaten;

//...

var I, J : integer;
    neuerDatensatz : PDaten;
begin
  XML := newXMLDocument;
  XML.XML.Text := XMLString;
  XML.Active := True;

  // Datensatzlist (result) erstellen
  result := TList.Create;

  // Werte zählen
  for I := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
    begin
      for J := 0 to XML.DocumentElement.ChildNodes[XMLNode].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;

        result.Add(neuerDatensatz);
      end;

    end;

end;
Das result ist aber leider immer leer, egal was ich mache :-(
Kann mir jemand sagen, wieso ich keine Daten erhalte? Wenn ich statt result eine lokale Variable erstelle und sie am Ende result zuweise, funktioniert es übrigens auch nicht.

Wäre cool, wenn mir jemand helfen könnte.

semo 17. Apr 2008 20:27

Re: Suche Alternative zu Array
 
das ist doch ein neues thema bzw eine neue frage die du hier stellst. fange also bitte einen neuen thread dazu an, danke.

Yheeky 17. Apr 2008 20:37

Re: Suche Alternative zu Array
 
Naja, es handelt sich ja immer noch um die Alternative von einem Array, klar könnte man da ein neuen Thread aufmachen, aber ich glaube, dass das Problem relativ schnell abgehandelt sein wird, weil vermutlich nur ein kleiner Fehler drin ist...deswegen versuche ich´s nochmal in dem Thread.

semo 17. Apr 2008 20:40

Re: Suche Alternative zu Array
 
Zitat:

Delphi-Quellcode:
var I, J : integer;
    neuerDatensatz : PDaten;
begin
  XML := newXMLDocument;
  XML.XML.Text := XMLString;
  XML.Active := True;

  // Datensatzlist (result) erstellen
  result := TList.Create;

  // Werte zählen
  for I := 0 to XML.DocumentElement.ChildNodes.Count - 1 do
    begin
      for J := 0 to XML.DocumentElement.ChildNodes[XMLNode].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;

        result.Add(neuerDatensatz);
      end;

    end;

end;

kannst du auch bitte den funktionkopf posten?
und vorab: es ist unschön eine tlist in einer funktion zu erzeugen und diese als ergebnis der funktion zurückzugeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.
Seite 2 von 3     12 3      

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