[Erledigt] Delphi Conversion TGUID

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Erledigt] Delphi Conversion TGUID

Beitrag von charlytango »

Hi,

ich versuche gerade eine angeblich lazaruskonforme Bibliothek (MP4TagLibrary von 3delite.hu) zu nutzen und konvertiere mal ein Tutorial(Delphi, denn für Laz gibt es nix). Komme bei TGUID.Empty nicht weiter.

MP4TagLibrary.pas(5474,5) Error: identifier idents no member "Empty"

Code: Alles auswählen

function TMP4Xtra.GetAsGUID(out Value: TGUID): Boolean;
begin
    Result := False;
    //[KN]   Versuch einer Anpassung
    {$IFNDEF FPC}
    Value := TGUID.Empty;
    {$ELSE}
     Value := TGUID.Empty;  //<-- hier bräuchte ich ein Lazarus Äquivalent
    {$ENDIF}

    if Properties.Count = 0 then begin
        Exit;
    end;
    Properties[0].GetAsGUID(Value);
    Result := True;
    AlreadyParsed := True;
end;      
Irgend eine elegante Idee?

THX
Zuletzt geändert von charlytango am Mo 8. Mär 2021, 10:40, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Delphi Conversion TGUID

Beitrag von Winni »

Hi!

Lies doch erstmal den fpc Teil der Sourcen!

Und zweitens die Definition von TGuid:

https://www.freepascal.org/docs-html/rt ... tguid.html

Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Delphi Conversion TGUID

Beitrag von fliegermichl »

Das kann man seit FPC 3.0 über Type Helper lösen:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}
{$modeswitch advancedrecords}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private

  public

  end;

{ TGUIDHelper }

TGUIDHelper = record helper for TGUID
 function Empty : TGUID;
end;



var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TGUIDHelper }

function TGUIDHelper.Empty: TGUID;
begin
  FillChar(Result, SizeOf(Result), 0);
end;

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
var aGUID : TGUID;
begin
  showmessage(GUIDToString(aGUID.Empty));
end;

end.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Delphi Conversion TGUID

Beitrag von charlytango »

@Winni
Winni hat geschrieben:
Sa 6. Mär 2021, 17:44
Lies doch erstmal den fpc Teil der Sourcen!
Und zweitens die Definition von TGuid:
https://www.freepascal.org/docs-html/rt ... tguid.html
Die Defines stammen von mir als Versuch einer Anpassung.
Im {$else} Zweig hab ich da einfach erstmal die Originalzeile kopiert.
Den Link mit der TGUID Definition hab ich auch vorher schon gefunden.
Bloss sind mir packed records mit varianten Teilen nicht geläufig.

Und Delphi hab ich im moment auch keines instaliert um herauszubekommen was TGUID.empty macht.

@fliegermichl
wenn ich das quasi nur einmal in einer Unit brauche, kann ich da

Code: Alles auswählen

FillChar(Result, SizeOf(Result), 0);
irgendwie direkt verwenden? (Bin gerade unterwegs und nicht vor dem Rechner)

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Delphi Conversion TGUID

Beitrag von PascalDragon »

charlytango hat geschrieben:
So 7. Mär 2021, 13:22
@fliegermichl
wenn ich das quasi nur einmal in einer Unit brauche, kann ich da

Code: Alles auswählen

FillChar(Result, SizeOf(Result), 0);
irgendwie direkt verwenden? (Bin gerade unterwegs und nicht vor dem Rechner)
Du kannst auch Value := Default(TGUID) verwenden, das sollte auch in Delphi funktionieren.
FPC Compiler Entwickler

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Delphi Conversion TGUID

Beitrag von fliegermichl »

Ja, man kann jede Variable mit

Code: Alles auswählen

FillChar(Variable, SizeOf(Variable), 0);
initialisieren.
Bei langen Strings bewirkt das aber dasselble wie stringvar := nil weil die eigentlch Pointer sind.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Delphi Conversion TGUID

Beitrag von charlytango »

Danke sehr .. case closed

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Delphi Conversion TGUID

Beitrag von Socke »

fliegermichl hat geschrieben:
Mo 8. Mär 2021, 10:09
Ja, man kann jede Variable mit

Code: Alles auswählen

FillChar(Variable, SizeOf(Variable), 0);
initialisieren.
Bei langen Strings bewirkt das aber dasselble wie stringvar := nil weil die eigentlch Pointer sind.
Bitte nicht bei Strings oder anderen managed Types (COM-Interfaces, dynamische Arrays) verwenden!
Hier gibt stringvar := nil; auch den String selbst frei (Compiler Magic), während FillChar(stringvar, SizeOf(stringvar), 0); nur den Zeiger auf die Zeichenkette überschreibt. Somit ist ein Speicherleck geschaffen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von fliegermichl »

Aja. Das war mir neu, daß eine Zuweisung der Form stringvar := nil den Speicher des strings freigibt.
Man lernt doch nie aus :-)

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von PascalDragon »

fliegermichl hat geschrieben:
Mo 8. Mär 2021, 11:38
Aja. Das war mir neu, daß eine Zuweisung der Form stringvar := nil den Speicher des strings freigibt.
Man lernt doch nie aus :-)
Korrekterweise erniedrigt diese Zuweisung den Referenzzähler der Stringdaten und wenn der 0 wird, dann werden die Daten eben freigegeben (gilt auch ebenso für Arrays).

Außerdem ist es stringvar := '' und nicht stringvar := Nil. Nil ist es nur bei arrays und interfaces.
FPC Compiler Entwickler

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von Winni »

Hi!

Und wenn

stringvar := '' ;

zu viel Mäuse-Pixel sind, der darf auch benutzen

SetLength(stringvar,0);

Winni

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von six1 »

:D hat das jemals jemand anders gelöst als StringVar:=''; ? :lol:
Gruß, Michael

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von fliegermichl »

six1 hat geschrieben:
Mo 8. Mär 2021, 18:39
:D hat das jemals jemand anders gelöst als StringVar:=''; ? :lol:
Wobei noch nicht mal das notwendig ist. Wenn man eine globale Variable stringvar : string anlegt, diese dann auch verwendet und nicht explizit auf '' setzt, gibt auch heaptrc keinen Memory Leack aus.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [Erledigt] Delphi Conversion TGUID

Beitrag von PascalDragon »

fliegermichl hat geschrieben:
Di 9. Mär 2021, 09:15
six1 hat geschrieben:
Mo 8. Mär 2021, 18:39
:D hat das jemals jemand anders gelöst als StringVar:=''; ? :lol:
Wobei noch nicht mal das notwendig ist. Wenn man eine globale Variable stringvar : string anlegt, diese dann auch verwendet und nicht explizit auf '' setzt, gibt auch heaptrc keinen Memory Leack aus.
Weil das eben ein Managed Datentyp ist. Der Compiler/die RTL kümmern sich darum, dass der Referenzzähler gepflegt wird und solange man selbst da nicht drin rumpfuscht wird da auch alles ordentlich freigegeben. Dies trifft neben den verschiedenen Stringtypen auch auf dynamische Arrays und COM Interfaces zu (solange die Implementierung eine korrekte Referenzzählung mittels IInterface._AddRef und IInterface._Release bereitstellt, was zum Beispiel der Fall ist, wenn man von TInterfacedObject erbt).
FPC Compiler Entwickler

Antworten