Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TGuid aus String erstellen (https://www.delphipraxis.net/203700-tguid-aus-string-erstellen.html)

t2000 14. Mär 2020 10:57

Delphi-Version: 5

TGuid aus String erstellen
 
Jetzt mal eine (hoffentlich) ganz einfache Frage.
Geht das auch einfacher bzw. eleganter?
Habe das an einigen Stellen im Programm

Delphi-Quellcode:
var
  MyJSONData : TJSONObject;
  LServiceID : TGuid;
begin
  // ServiceID aus Parameter lesen
  // GEHT DAS VIELLEICHT EINFACHER?
  LServiceID := StringToGuid('{'+copy(MyJSONData.Values['ServiceID'].ToString,2,36)+'}');
Ich bekomme über eine REST-Schnittstelle das TJSONObject. Die Übergabe sieht so aus: {"ServiceID":"00000000-0000-0000-0000-000000000001"} Andere Schreibweisen bringen einen Fehler.

MyJSONData.Values[].toString liefert dies: "00000000-0000-0000-0000-000000000001"

Funktionieren tut es so.

Danke

Uwe Raabe 14. Mär 2020 11:28

AW: TGuid aus String erstellen
 
Viel einfacher geht es nicht, da der String formell kein GUID-Format hat:
Delphi-Quellcode:
LServiceID := TGUID.Create('{' + MyJSONData.Values['ServiceID'].AsType<string> + '}');

venice2 14. Mär 2020 12:15

AW: TGuid aus String erstellen
 
Zitat:

Viel einfacher geht es nicht
Ich würde es in einer Funktion einlagern wenn es an mehreren stellen im Code vorkommt.
Ansonsten wie Uwe schon sagte.

t2000 18. Mär 2020 11:09

AW: TGuid aus String erstellen
 
Hier meine Funktion dafür.
Kannn jetzt fast jeden String übergeben und er such die erste vorkommende Guid raus.

Delphi-Quellcode:
function DirtyStringToGuid( DirtyString: String): TGuid;
// sucht das erste "-" ab der 8. Position
// testet damit eine mögliche Guid
// falls nicht ok, dann lösche alle Zeichen bis zum '-' (einschl.)
// rekursiver Aufruf
// liefert bei Fehler eine Empty-Guid
var
  s: String;
  p1: Integer;
begin
  // 00000000-0000-0000-0000-000000000000
  Result := TGuid.Empty;
  if Length( DirtyString) < 36 then
    exit;
  p1 := Pos('-', DirtyString, 8);
  s := copy( DirtyString, p1-8, 36);
  try
    Result := StringToGuid( '{'+s+'}');
  except
    Result := DirtyStringToGuid( copy( DirtyString, p1+1, 9999));
  end;
end;

t2000 18. Mär 2020 13:50

AW: TGuid aus String erstellen
 
Ups, hatte sich ein Fehler beim kopieren eingeschlichen. Hatte noch den Delete-Befehl drin, anstatt den copy-Befehl.
Habe es korrigiert.

t2000 18. Mär 2020 13:54

AW: TGuid aus String erstellen
 
Die Alternative im except Teil wäre ein Delete-Befehl:
Delphi-Quellcode:
  except
    begin
      //Result := DirtyStringToGuid( copy( DirtyString, p1+1, 9999));
      system.Delete( DirtyString, 1, p1);
      Result := DirtyStringToGuid( DirtyString);
    end;
  end;

venice2 19. Mär 2020 09:21

AW: TGuid aus String erstellen
 
Zitat:

Zitat von t2000 (Beitrag 1460060)
Die Alternative im except Teil wäre ein Delete-Befehl:
Delphi-Quellcode:
  except
    begin
      //Result := DirtyStringToGuid( copy( DirtyString, p1+1, 9999));
      system.Delete( DirtyString, 1, p1);
      Result := DirtyStringToGuid( DirtyString);
    end;
  end;

oder einfach
Delphi-Quellcode:
const
   GUID_NULL: TGUID = '{00000000-0000-0000-0000-000000000000}';
GUID_NULL zurückgeben.

t2000 19. Mär 2020 09:37

AW: TGuid aus String erstellen
 
Im except-Teil steht aber der rekusive Aufruf. Da kann ich keine NULL-Guid zurückgeben.

venice2 19. Mär 2020 11:56

AW: TGuid aus String erstellen
 
Zitat:

Zitat von t2000 (Beitrag 1460106)
Im except-Teil steht aber der rekusive Aufruf. Da kann ich keine NULL-Guid zurückgeben.

Ich mache dir keine vorschriften.

Aber persönlich würde ich den rekursiven Aufruf im Finally Block aufrufen und im except NULL-GUID zurück geben.
Denn so wie du es hast gehst du Gefahr im Fehler Block eine Endlos Schleife zu generieren. Von Speicherlecks mal ganz abgesehen.

himitsu 19. Mär 2020 11:59

AW: TGuid aus String erstellen
 
Warum überhaupt die Rekursion, ansttt einer Iteration? (Scheife in der Funktion)


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

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