AGB  ·  Datenschutz  ·  Impressum  







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

Dynamisches Array verschachteln und speichern

Ein Thema von flosoft · begonnen am 4. Jul 2012 · letzter Beitrag vom 6. Jul 2012
 
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Dynamisches Array verschachteln und speichern

  Alt 5. Jul 2012, 00:07
Das Ding ist du kannst nicht einfach eine dynamischen Array in einem Stream aller
Stream.WriteBuffer(FzzV[0],SizeOf(TFzzV)); speichern, da :
- Dynamischer Array ist nur ein Pointer(Adresse), die eine Größe von 4 Bytes hat.
- Delphi setzt vor dem Pointer vom dynamischen Array, ist die Größe bei SetLength initalisiert Delphi den Speicher für den Pointer vom Dynamischen Array. Ein Dynamischer Array ist nichts anderes als ein Statischer Array auf den du eine Pointer machst. Du kannst deshalb auch auf einen Dynamsichen Array auf Positionen zugreifen, die auserhalb des gesetzen Wertes liegen, ohne das der Compiler zumindest meckert, weil dahinter ein Statischer Array steckt. Nur beim zugriff, greifst du auf einen Speicher zu, der nicht für den Pointer (Dynamischen Array) resaviert ist.

Also du musst das Konzept in folgende Richtig ändern.
- Du musst die ID, die du im TFTerm hast dazuverwenden, den TFTerm den TFzzV zuordnen zukönnen.

Das würde dan etwa so Aussehen:
Delphi-Quellcode:
type
  TFTerm = record
    id: Integer;
    FVid: Integer;
    Typ: Integer; // 0 = Dreieck, 1 = Trapez ...
    Name: String;
    RangeMin: Double;
    RangeMax: Double;
    Param1: Double;
    Param2: Double;
    Einheit: String;
  end;

  TTermArray = array of TFTerm; //Damit der Compiler nicht meckert

  TFzzV = record
    id: Integer;
    Typ: Integer; // 0 = Eingabe und 1 = Ausgabe
    Name: String;
    RangeXLow: Double;
    RangeXHigh: Double;
    Einheit: String;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  FzzV: Array of TFzzV;
  TermArray : TTermArray;

implementation

{$R *.dfm}

//Hilfsfunktion, die dir den Count und ganz leicht eine Array zurückbekommst.
function FindTermsZuID(AId : Integer; out ATermArray : TTermArray) : Integer;
var I,NewIndex : Integer;
begin
  Result := 0;
  for I := Low(TermArray) to High(TermArray) do //So hast du direkt den gesammten Array zum druchsuchen
  if TermArray[I].FVid = AId then //Wenn ID übereinstimmt
  begin
    NewIndex := Result; //Zurzeit ist der Count noch 0, da der Erste Eintrag den Index 0 hat nehmen.
    Inc(Result); //Wollen ja den Count haben
    SetLength(ATermArray,Result); //Länge festlegen
    ATermArray[NewIndex] := TermArray[I]; //Zuweisen, bischen unsicher wegen Speicher aber dazukomme ich noch.
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var FoundTerms : TTermArray;
    TermsCount,I : Integer;
begin
   TermsCount := FindTermsZuID(5000,FoundTerms);
   if TermsCount > 0 then //Falls wir welche gefunden haben, in diem Fall solten es 2 sein
   begin
     for I := 0 to TermsCount -1 do
     begin
       ShowMessage(IntToStr(FoundTerms[I].id));
     end;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(FzzV,1); //Test array
  FzzV[0].id := 5000; //Als Test
  SetLength(TermArray,2); //Terms als test Festlegen, um den Prinzip zuzeigen.
  TermArray[0].id := 15130; //Term ID, NICHT DIE FzzV ID!!
  TermArray[0].FVid := 5000; //Hier kommt die ID, zu wem der Term gehört.

  TermArray[1].id := 15200; //Term ID, NICHT DIE FzzV ID!!
  TermArray[1].FVid := 5000; //Hier kommt die ID, zu wem der Term gehört.
end;
EDIT : Jemand schneller, egal bin müde und hoffe dass es dafür reicht, was er machen möchte.
JETZT ABER WIRKLICH PENEN MAN MAN MAN!!!!....

Gruß NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
 


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 10:01 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 by Thomas Breitkreuz