Delphi-PRAXiS
Seite 6 von 10   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Record zu TStringlist hinzufügen (https://www.delphipraxis.net/193030-record-zu-tstringlist-hinzufuegen.html)

Union 13. Jun 2017 09:40

AW: Record zu TStringlist hinzufügen
 
So würde ich das ansatzweise machen. Minimale Implementation:

Delphi-Quellcode:
type
  // Du nimmst natürlich Deinen Record
  TDataRecord = record
    Name : string[20];
    Zahl : Integer;
  end;

  PDataRecord = ^TDataRecord;


  TDataRecordList = class(TList)
  protected
    function GetItem(AIndex: Integer): PDataRecord;
    procedure SetItem(AIndex: Integer; const Value: PDataRecord);
  public
    function Add(AData: TDataRecord): Integer;
    procedure Clear; override;
    property Items[AIndex : Integer] : PDataRecord read GetItem write SetItem; default;
  end;

implementation

{ TDataRecordList }

function TDataRecordList.Add(AData: TDataRecord): Integer;
var
  PData : PDataRecord;
begin
  New(PData);
  // Record-Inhalt kopieren (evtl. auch mit move). So bleibt Erzeugung und Freigabe in der Klasse.
  // Natürlich könnte man ein Overload von Add mit PData machen.
  PData.Name := AData.Name;
  PData.Zahl := AData.Zahl;
  Result := inherited Add(PData);
end;

procedure TDataRecordList.Clear;
var
  PData : PDataRecord;
  I    : Integer;
begin
  for I := 0 to Count - 1 do
  begin
    PData := Items[I];
    Dispose(PData);
  end;
  inherited;
end;

// Setter und Getter geben jeweils wieder den Pointer zurück, um sich Kopiervorgänge zu ersparen
function TDataRecordList.GetItem(AIndex: Integer): PDataRecord;
begin
  Result := inherited Items[AIndex];
end;

procedure TDataRecordList.SetItem(AIndex: Integer; const Value: PDataRecord);
begin
  inherited Items[AIndex] := Value;
end;

EWeiss 13. Jun 2017 10:04

AW: Record zu TStringlist hinzufügen
 
Danke für das Beispiel.. Im Moment scheint es zu gehen obwohl in der Liste 2 Einträge mehr addiert werden als ich initialisiert habe.
Macht Probleme wenn ich den Count überprüfe.

Siehe Pic!
Warum werden mehr Einträge addiert?

gruss

Daniel 13. Jun 2017 10:06

AW: Record zu TStringlist hinzufügen
 
Dem Screenshot nach steht Count auf "6", was den Einträgen #0 bis #5 entspricht. Alles korrekt.
Wie die Liste sich intern verwaltet, manchmal dimensioniert sie das interne Array eine Idee größer (Stichwort Eigenschaft "Grow"), ist nur für sie selbst von Bedeutung.

EWeiss 13. Jun 2017 10:09

AW: Record zu TStringlist hinzufügen
 
Zitat:

Zitat von Daniel (Beitrag 1374384)
Dem Screenshot nach steht Count auf "6", was den Einträgen #0 bis #5 entspricht. Alles korrekt.
Wie die Liste sich intern verwaltet, manchmal dimensioniert sie das interne Array eine Idee größer (Stichwort Eigenschaft "Grow"), ist nur für sie selbst von Bedeutung.

Hmmmm bekomme aber einen falschen Count das führt zum Absturz.
Habe ja noch 6 und 7 auch wenn sie NIL sind.

Werden diese mitgezählt beim Sprites.Count ?.
Sorry habe mich mit dem Kram noch nie beschäftigt.

gruss

DeddyH 13. Jun 2017 10:11

AW: Record zu TStringlist hinzufügen
 
Nein, Count sollte in Deinem Fall 6 ergeben (man darf Count nicht mit Capacity verwechseln).

EWeiss 13. Jun 2017 10:22

AW: Record zu TStringlist hinzufügen
 
Zitat:

Zitat von DeddyH (Beitrag 1374386)
Nein, Count sollte in Deinem Fall 6 ergeben (man darf Count nicht mit Capacity verwechseln).

Ok Danke ;)

gruss

EWeiss 13. Jun 2017 11:26

AW: Record zu TStringlist hinzufügen
 
Habe da jetzt ein kleines Problem ;)
Wie kann ich die Einträge in der Liste verschieben ?

Delphi-Quellcode:
                  if (Item + ID_MAIN) <> FlagFound then
                  begin
                    if Prop.ShortCutfound > 0 then
                      NewLen := Sprites.Count + Prop.ShortCutfound
                    else
                      NewLen := Sprites.Count;

                    Sprites.Add(TSprite.Create);
                    CreateRecycleBin(MainHandle, NewLen);
                    for x := ID_FIRST to NewLen do
                    begin
                      Sprites[x] := Sprites[x + 1];
                      if x = (NewLen - Prop.ShortCutfound) then
                      begin
                        for X1 := (NewLen - 1) downto (NewLen - Prop.ShortCutfound) do
                          Sprites.Delete(X1);
                      end;
                    end;
                    FlagFound := count;
                  end;
vorher mit dem Array war das kein Problem.

Delphi-Quellcode:
                  if (Item + ID_MAIN) <> FlagFound then
                  begin
                    if Prop.ShortCutfound > 0 then
                      NewLen := High(Sprite) + Prop.ShortCutfound
                    else
                      NewLen := High(Sprite) + 1;

                    Setlength(Sprite, NewLen);
                    CreateRecycleBin(MainHandle, NewLen);
                    for x := ID_FIRST to NewLen do
                    begin
                      Sprite[x] := Sprite[x + 1];
                      if x = (NewLen - Prop.ShortCutfound) then
                      begin
                        for X1 := (NewLen - 1) downto (NewLen - Prop.ShortCutfound) do
                          Delete(Sprite, X1);
                      end;
                    end;
                    FlagFound := count;
                  end;
gruss

Daniel 13. Jun 2017 11:30

AW: Record zu TStringlist hinzufügen
 
Delphi-Quellcode:
TList<>.Move
bzw.
Delphi-Quellcode:
TList<>.Exchange
.
http://docwiki.embarcadero.com/Libra...TList.Exchange

EWeiss 13. Jun 2017 11:34

AW: Record zu TStringlist hinzufügen
 
Zitat:

Zitat von Daniel (Beitrag 1374395)
Delphi-Quellcode:
TList<>.Move
bzw.
Delphi-Quellcode:
TList<>.Exchange
.
http://docwiki.embarcadero.com/Libra...TList.Exchange

Danke werde es mal versuchen ;)

gruss

EWeiss 13. Jun 2017 17:13

AW: Record zu TStringlist hinzufügen
 
Noch ein einfache frage.. reicht ein einfaches Free damit alle Classen freigegeben werden oder muss ich da
noch etwas besonderes beachten?

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr.
Seite 6 von 10   « Erste     456 78     Letzte »    

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