AGB  ·  Datenschutz  ·  Impressum  







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

Guid erzeugen

Ein Thema von Delbor · begonnen am 14. Mär 2016 · letzter Beitrag vom 17. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Guid erzeugen

  Alt 14. Mär 2016, 13:10
Delphi-Version: XE8
Hi zusammen

Folgende Funktion soll mir eine GUID erzeugen, ein File anlegen, da die Guid speichern und diese dann als Bytearray zurüchgeben:
Delphi-Quellcode:
function TOpenFileFrame.CreateIDFile(LPath : String): TByteArray;
  var IdFile : TFileStream; ID_GUID: TGUID; IdStr: String;
      UniqueName: TEndian; Len: Longint;
begin
  if CreateGUID(ID_GUID) <> 0 then
     ShowMessage('Creating GUID failed!')
  else
  begin
    Showmessage('Size of UniqueName := ' + IntToStr(SizeOf(UniqueName)));
    IdFile := TFileStream.Create(LPath,fmCreate);
    try
     Len := Length(GUIDToString(ID_GUID));
     IdFile.Write(Len, SizeOf(Len));
     IdStr := GUIDToString(ID_GUID);
     IdFile.Write(IdStr, Len);
    finally
      IdFile.Free;
    end;
    Result := ID_Guid.ToByteArray(ID_GUID);
  end;
end;
Aufgrufen wird diese Funktion, wenn die Pfade vorhandener Bilddateien eingelesen werden:

Delphi-Quellcode:
    if not FileExists(LPath+'IdentFile.cgf') then
    begin // ist in dem Ordner kein IdentifikationsFile
      ByteID := CreateIDFile(LPath);
    end;
Einen Compilierungsversuch quittiert Delphi wie folgt:
Zitat:
[dcc32 Fehler] FileOpenFrameUnit.pas(196): E2010 Inkompatible Typen: 'TEndian' und 'TGUID'
Der Rückgabewert soll in einer DB gespeichert werden.
Was mache ich falsch?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Guid erzeugen

  Alt 14. Mär 2016, 13:15
UniqueName: TEndian; wird im Code außer bei der Showmessage nirgendwo verwendet. Wozu ist das da?
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Guid erzeugen

  Alt 14. Mär 2016, 13:25
Hi bra

Zitat:
UniqueName: TEndian; wird im Code außer bei der Showmessage nirgendwo verwendet. Wozu ist das da?
Das war einer meiner Versuche - gelöscht hab ichs noch nicht, weil ich noch nicht weiss, ob das wirklich falsch war. Anrerseits - als Rückgabewert ist das sicher falsch, da letzterer Biär in die DB geschrieben werden soll.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Guid erzeugen

  Alt 14. Mär 2016, 13:38
Warum machst du dir das Leben so schwer?

Erstelle dir eine Klasse, die einen Stellvertreter für so ein Archiv-Verzeichnis darstellt.

Der gibst du alle nötigen Methoden/Eigenschaften mit, die du dort brauchst. Eine Eigenschaft wäre z.B. die GUID und eine Methode wäre z.B. Init.

Ist Verzeichnis noch nicht initialisiert, dann liefert die GUID-Eigenschaft ein TGUID.Empty zurück.

Das würde den Umgang mit diesen Verzeichnissen auf jeden Fall erleichtern.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Guid erzeugen

  Alt 14. Mär 2016, 16:53
Hi Sir Rufo

Da hast du sicher recht - zukünftig das Zeugs nur noch auslesen anstat die ganze Sache neu zu schreiben, macht wirklich Sinn. Nur habe ichh eben mit dem Umgang der Datentypen noch Probleme. Bei meiner obigen Zuweisung an Result sind alle beteilligtten Bezeichner vom Typ TGuid, mit Ausnahme von ToByteArray - die ist vom Typ TEndian.
Aber ich seh grad in der Help:
Zitat:
function ToByteArray(DataEndian: TEndian = TEndian.Little): TBytes;
Nachdem ich die Deklatrationen nun angepasst habe:
Zitat:
[dcc32 Fehler] FileOpenFrameUnit.pas(196): E2010 Inkompatible Typen: 'TEndian' und 'TGUID'
Die selbe Fehlermeldung wie gehabt, nur dass der "fremde" Datentyp jetzt TGuid und nicht mehr TEndian ist.
Da TEndian lediglich ein Aufzählungstyp mit 2 Werten ist, wars vorher wohl richtiger.

Deinen Vorschlag einer Klasse hab ich mal begonnen, umzusetzen:
Zitat:
type
TIdentifierClass = Class(TPersistent)
private
FGuid: TGuid;
FByteArray : TByteArray;
FUniqquename: String;
FPath: String;
FFileStream: TFileStream;
FFileName : String;
function GetGuid: Boolean;
procedure SetBinaryGuid(Value: TGuid);
function GetBinaryGuid: TGuid;
public
procedure SaveToFile(Value: String);
property Guid: Boolean read GetGuid;
property BinaryGuid: TGuid read GetBinaryGuid write SetBinaryGuid;
property StringGuid: TGuid read GetStringGuide write SetStringGuide;
property FileName: String read FFileName write FFilename;
end;
Aber die eigentliche Schwierigkeit schien mir: solange ich den richtigen Umgang in meiner Funktion nicht schaffe, krieg ich auch keine anständige Klasse hin.
Aber manchmal scheint Wahnwitz testen zum Erfolg zu führen =>> Parameter TGuid durch Little ersetzt, und schon hat mir Delphi meinen Code ... nicht um die Ohren gehauen....

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (14. Mär 2016 um 17:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Guid erzeugen

  Alt 14. Mär 2016, 18:08
Du kannst ja mal das hier ausprobieren
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.IOUtils,
  System.SysUtils;

type
  TArchiveFolder = class
  private
    FID : TGUID;
    FFullName : string;
    FFirstLoad: Boolean;
    function GetID: TGUID;
    function GetName: string;
    function GetIdFileName: string;
    function GetIsInitialized: Boolean;
    procedure EnsureFirstLoad;
  public
    property FullName : string read FFullName;
    property ID : TGUID read GetID;
    property IsInitialized: Boolean read GetIsInitialized;
    property name : string read GetName;
  public
    constructor Create( const Name: string );
  public
    procedure Init( CreateIfNotExists: Boolean = False );
    procedure Reload;
  end;

  { TArchiveFolder }

constructor TArchiveFolder.Create( const Name: string );
begin
  if TFile.Exists( name )
  then
    raise Exception.Create( 'Fehlermeldung' );

  inherited Create;
  FFullName := TPath.GetFullPath( name );
end;

procedure TArchiveFolder.EnsureFirstLoad;
begin
  if not FFirstLoad
  then
    begin
      Reload;
      FFirstLoad := True;
    end;
end;

function TArchiveFolder.GetID: TGUID;
begin
  EnsureFirstLoad;
  Result := FID;
end;

function TArchiveFolder.GetIdFileName: string;
begin
  Result := TPath.Combine( FFullName, '.folderid' );
end;

function TArchiveFolder.GetIsInitialized: Boolean;
begin
  EnsureFirstLoad;
  Result := FID <> TGUID.Empty;
end;

function TArchiveFolder.GetName: string;
begin
  Result := TPath.GetFileName( FFullName );
end;

procedure TArchiveFolder.Init( CreateIfNotExists: Boolean = False );
begin
  Reload;

  if IsInitialized
  then
    raise Exception.Create( 'Fehlermeldung' );

  if not TDirectory.Exists( FFullName )
  then
    begin
      if CreateIfNotExists
      then
        TDirectory.CreateDirectory( FFullName )
      else
        raise Exception.Create( 'Fehlermeldung' );
    end;

  TFile.WriteAllText( GetIdFileName( ), TGUID.NewGuid.ToString );

  Reload;
end;

procedure TArchiveFolder.Reload;
var
  lIdFileName: string;
begin
  lIdFileName := GetIdFileName( );
  if not TFile.Exists( lIdFileName )
  then
    FID := TGUID.Empty
  else
    FID := TGUID.Create( TFile.ReadAllText( lIdFileName ) );
end;

procedure Main;
var
  fld: TArchiveFolder;
begin
  fld := TArchiveFolder.Create( '.' );
  try
    if not fld.IsInitialized
    then
      begin
        WriteLn( 'Init ',fld.FullName );
        fld.Init( );
      end;

    WriteLn( fld.ID.ToString( ) );
  finally
    fld.Free;
  end;

  fld := TArchiveFolder.Create( '.' );
  try
    if not fld.IsInitialized
    then
      begin
        WriteLn( 'Init ',fld.FullName );
        fld.Init( );
      end;

    WriteLn( fld.ID.ToString( ) );
  finally
    fld.Free;
  end;

end;

begin
  try
    Main( );
  except
    on E: Exception do
      WriteLn( E.ClassName, ': ', E.Message );
  end;

  ReadLn;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Guid erzeugen

  Alt 14. Mär 2016, 19:11
...Aufgrufen wird diese Funktion, wenn die Pfade vorhandener Bilddateien eingelesen werden...
Hmmmm...Diese Vorgehensweise funktioniert dann wohl auch nur auf Laufwerken bzw. deren Verzeichnissen, auf die du Vollzugriff hast, also Dateien anlegen darfst. Möchte mich da nicht einmischen, aber ist das wirklich eine gute Lösung?
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Guid erzeugen

  Alt 17. Mär 2016, 12:32
Hi zusammen

Erstmal muss ich eine Frage stellen, für die ich nach längerem suchen keine Antwort finde. Wieso funktioniert das problemlos wird hier der Parameter 'Little' richtig erkannt:
Delphi-Quellcode:
function TOpenFileFrame.CreateIDFile(LPath : String): TBytes;
  var IdFile : TFileStream; ID_GUID: TGUID; IdStr: String;
      UniqueName: TEndian; Len: Longint;
begin
  if CreateGUID(ID_GUID) <> 0 then
     ShowMessage('Creating GUID failed!')
  else
  begin
    IdFile := TFileStream.Create(LPath,fmCreate);
    try
     Len := Length(GUIDToString(ID_GUID));
     IdFile.Write(Len, SizeOf(Len));
     IdStr := GUIDToString(ID_GUID);
     IdFile.Write(IdStr, Len);
    finally
      IdFile.Free;
    end;
    Result := ID_Guid.ToByteArray(Little);
  end;
end;
während das hier nicht tut:
Delphi-Quellcode:
function TIdentifierClass.GetBinaryGuid: TGuid;
begin
  FGuid := FGuid.NewGuid;
  Result := FGuid.ToByteArray(Little); // SysUtils ist in uses enthalten
end;
Korpus Delicti ist der Parameter Little => unbekannter Bezeichner.
FGuid ist ein Feld vom Typ TGuid.

@Sir Rufo: Sehe ich das richtig: du erzeugst ein Konsolenprogramm, das im zu idsentifizierenden Ordner zu liegen kommt, den GUID erzeugt und den aktuellen Pfad zurückgibt?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (17. Mär 2016 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Guid erzeugen

  Alt 17. Mär 2016, 13:24
Hi mm1256

Zitat:
Hmmmm...Diese Vorgehensweise funktioniert dann wohl auch nur auf Laufwerken bzw. deren Verzeichnissen, auf die du Vollzugriff hast, also Dateien anlegen darfst. Möchte mich da nicht einmischen, aber ist das wirklich eine gute Lösung?
Welche andere Lösung gäbe es denn sonst noch?
Die Bilder sind für (m)eine Website bestimmt. Wegen der Grösse der Bilder sollen die nicht in die DB geschrieben werden - jedenfalls nicht in die hier zur Debatte stehende Server-Datenbank. Die Bildgrösse bewegt sich von ca. 10MB bei mir auf aktuell 24MB (10- bzw. 24 Megapixel je nach Kameramodell).
Hintergrund ist eigentlich: die Bilder liegen auf einer externen Festplatte, und deren Laufwerksbuchstabe kann sich unter Windows ändern.
Das aber heisst ja: Wenn ich den Pfad zu so einem Bild in der DB abspeichere, muss er nicht in jedem Fall auch später noch stimmen. Ist in dem Ordner/auf dem Laufwerk/der Partition ein IDFile, lässt sich so ein Ordner auch dann noch identifizieren, wenn sich sein Speicherort geändert hat.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Guid erzeugen

  Alt 17. Mär 2016, 13:40
@Sir Rufo: Sehe ich das richtig: du erzeugst ein Konsolenprogramm, das im zu idsentifizierenden Ordner zu liegen kommt, den GUID erzeugt und den aktuellen Pfad zurückgibt?
Nein, ich erzeuge eine Instanz einer Klasse und gebe der Klasse den Pfad mit. Dann kann ich abfragen, ob dieser Ordner schon initialisiert ist und entweder initialisieren und die ID abfragen oder eben direkt abfragen, wenn schon (irgendwann mal) initialisiert wurde.

Wo die Anwendung liegt ist also egal.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:59 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