Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klasse TGUIDList: Liste von TGUID (https://www.delphipraxis.net/87524-klasse-tguidlist-liste-von-tguid.html)

Phil73 1. Mär 2007 19:22


Klasse TGUIDList: Liste von TGUID
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

da ich gerade viel mit GUID arbeiten muß, habe ich eine (sehr) einfache Listenklasse dafür geschrieben. Ist im Grunde nur ein Array von TGUID mit ein paar Helper-Funktionen drumherum. Das Schreiben war auch nicht sonderlich aufwendig, aber vielleicht kann sich mal jemand damit etwas Arbeit sparen, darum poste ich es hier:



Delphi-Quellcode:

unit UTGUIDList;

interface

type

  TGUIDList = class
  private
    FGUIDList: Array of TGUID;
    FCount: Integer;
    function GetItem(Index: Integer): TGUID;
    procedure SetItem(Index: Integer; const Value: TGUID);
    function GetItemString(Index: Integer): string;
    procedure SetItemString(Index: Integer; const Value: string);
  public
    constructor Create; virtual;
    destructor Destroy; override;
    property Item[Index: Integer]: TGUID read GetItem write SetItem; default;
    property ItemString[Index: Integer]: string read GetItemString write SetItemString;
    procedure Clear;
    function Add(aGUID: TGUID): Integer;
    function AddFromString(aGUIDString: string): Integer;
    procedure Delete(Index: Integer); overload;
    function Delete(aGUID: TGUID): boolean; overload;
    function IndexOf(aGUID: TGUID): Integer; overload;
    function IndexOf(aGUIDString: string): Integer; overload;
    function IsInList(aGUID: TGUID): boolean; overload;
    function IsInList(aGUIDString: string): boolean; overload;
    property Count: Integer read FCount;
  end;

implementation

uses
  SysUtils;

{ TGUIDList }

function TGUIDList.Add(aGUID: TGUID): Integer;
begin
  inc(FCount);
  setlength(FGUIDList, FCount);
  FGUIDList[FCount-1] := aGUID;
  result := FCount-1;
end;

function TGUIDList.AddFromString(aGUIDString: string): Integer;
begin
  result := Add(StringToGUID(aGUIDString));
end;

procedure TGUIDList.Clear;
begin
  FCount := 0;
  setlength(FGUIDList, FCount);
end;

constructor TGUIDList.Create;
begin
  inherited;
  Clear;
end;

procedure TGUIDList.Delete(Index: Integer);
var
  i: Integer;
begin
  for i := Index to FCount-2 do begin
    FGUIDList[i] := FGUIDList[i+1];
  end;
  dec(FCount);
  setlength(FGUIDList, FCount);
end;

function TGUIDList.Delete(aGUID: TGUID): boolean;
//true if aGUID was found and deleted
var
  i: Integer;
begin
  result := false;
  i := IndexOf(aGUID);
  if i<0 then exit;
  Delete(i);
  result := true;
end;

destructor TGUIDList.Destroy;
begin
  Clear;
  inherited;
end;

function TGUIDList.GetItem(Index: Integer): TGUID;
begin
  result := FGUIDList[Index];
end;

function TGUIDList.GetItemString(Index: Integer): string;
begin
  result := GUIDToString(FGuidList[Index]);
end;

function TGUIDList.IndexOf(aGUID: TGUID): Integer;
//result := -1 if aGUID was not found
var
  i: integer;
begin
  result := -1;
  for i := 0 to FCount-1 do begin
    if IsEqualGUID(aGUID, FGUIDList[i]) then begin
      result := i;
      break;
    end;
  end;
end;

function TGUIDList.IndexOf(aGUIDString: string): Integer;
//result := -1 if aGUIDString was not found
begin
  result := IndexOf(StringToGUID(aGUIDString));
end;

function TGUIDList.IsInList(aGUID: TGUID): boolean;
begin
  result := IndexOf(aGUID) >= 0;
end;

function TGUIDList.IsInList(aGUIDString: string): boolean;
begin
  result := IsInList(StringToGUID(aGUIDString));
end;

procedure TGUIDList.SetItem(Index: Integer; const Value: TGUID);
begin
  FGUIDList[Index] := Value;
end;

procedure TGUIDList.SetItemString(Index: Integer; const Value: string);
begin
  FGUIDList[Index] := StringToGUID(Value);
end;

end.
Ich hoffe, es sind keine Flüchtigkeitsfehler drin. Feedback ist jederzeit gerne willkommen.
Beste Grüße, Philipp

PS: Ich selbst benutze D7, aber vermutlich funktioniert dieser Code auch bei viel älteren Versionen. Welche Angabe sollte ich denn hier unter "Ab Delphi Version" eintragen?

thkerkmann 1. Mär 2007 19:38

Re: Klasse TGUIDList: Liste von TGUID
 
Hi,

kann man nicht einfach eine tStringlist dafür benutzen ? :gruebel:

Was ist an deiner Klasse so besonderes ?
Und das dynamische Array ist ja wohl besonders langsam.

Gruss

Phil73 1. Mär 2007 20:40

Re: Klasse TGUIDList: Liste von TGUID
 
Zitat:

Zitat von thkerkmann
Hi,

kann man nicht einfach eine tStringlist dafür benutzen ? :gruebel:

Schon, aber dann muß man jedesmal TGUID in string umwandeln und zurück. Wenn ich mir die Source zu bspw. StringToGUID in den SysUtils ansehe, scheint mir das doch relativ aufwendig zu sein.
Zitat:

Was ist an deiner Klasse so besonderes ?
Besonders? Nichts. Sowas ist wirklich schnell geschrieben. Ich finde Sie ja auch nur praktisch, und wollte anderen die Tipparbeit ersparen, falls jemand schnell was zum GUID speichern sucht. Aber wenn sie keinen interessiert, könnt ihr den Post auch gerne löschen...
Zitat:

Und das dynamische Array ist ja wohl besonders langsam.

Gruss
Hmm, wieso? Langsamer als eine TStringList?

Grüße,

Philipp


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.

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