Page 2 of 2 FirstFirst 1 2
Results 16 to 21 of 21

Thread: Overload vraagje

  1. #16
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by rvk View Post
    Waarom sla je een filename op in TFileName en een RSA in een string?

    Ik gebruik voor filenames eigenlijk altijd strings.
    Maar als je dan toch onderscheid gaat maken met TFileName waarom gebruik je dan voor RSA geen TBytes (ipv string)?

    (Wel specialiseren betreffende type met TFileName maar voor data gewoon string gebruiken is een beetje onlogisch, als je begrijpt wat ik bedoel.)
    Ik had ergens gelezen dat TFileName de preferred methode was ipv strings (zie oude docs pagina)

    "Use TFileName to represent strings that are only used for file names. "

    ik wilde een mogelijkheid toevoegen om ook een string te encrypten en decrypten middels RSA, uiteindelijk wordt de string daadwerkelijk encrypt in de functie met Memorystream.

    Mijn oplossing voor nu (niet wat ik gehoopt had), geen overload meer gebruiken.

    Code:
        function    EncryptStream   ( aInput, aOutput : TMemoryStream) : boolean;
        function    EncryptFile     ( aInput, aOutput : TFileName ) : boolean;
        function    EncryptString   ( aInput, aOutput : string ): boolean;
    
        function    DecryptStream   ( aInput, aOutput : TMemoryStream) : boolean;
        function    DecryptFile     ( aInput, aOutput : TFileName ) : boolean;
        function    DecryptString   ( aInput, aOutput : string ): boolean;
    Toch bedankt voor jullie hulp.

    Gr
    Herby

  2. #17
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Herby View Post
    Ik had ergens gelezen dat TFileName de preferred methode was ipv strings
    Ik gebruik TFileName ook wel eens, maar alleen als ik zeker weet dat het een bestandsnaam is en niet bijvoorbeeld alleen een pad.
    Waarom ik het doe? Geed idee, ook ooit eens ergens gelezen en het is gewoon blijven hangen, denk ik.

    Quote Originally Posted by Herby View Post
    Mijn oplossing voor nu (niet wat ik gehoopt had), geen overload meer gebruiken.
    Je moet ook eigenlijk niet overloads willen gebruiken omdat het kan, maar omdat het dan voordelen biedt t.o.v. je method een naam geven die aangeeft wat hij kan en doet.

    Delphi Code:
    1. // Handig, want dan hoef je niet na te denken van welk type je de waarde wilt hebben:
    2. function GetValue(const AName: string; out AValue: string): Boolean;
    3. function GetValue(const AName: string; out AValue: Integer): Boolean;
    4. function GetValue(const AName: string; out AValue: Boolean): Boolean;
    5.  
    6. // Gespecialiseerde methods voor bepaalde types:
    7. function LoadFromFile(const AFileName: TFilename): Boolean;
    8. function LoadFromStream(const AStream: TStream): Boolean;
    9. function LoadFromString(const AString: string): Boolean;

    Quote Originally Posted by Herby View Post
    Code:
        function    EncryptFile     ( aInput, aOutput : TFileName ) : boolean;
        function    EncryptString   ( aInput, aOutput : string ): boolean;
    
        function    DecryptFile     ( aInput, aOutput : TFileName ) : boolean;
        function    DecryptString   ( aInput, aOutput : string ): boolean;
    Weet je zeker dat bovenstaande correct is en werkt?
    Je geeft een input (kun je eventueel als const declareren, hoeft niet per se), maar je output is geen out (voorkeur) of var (minder goed, maar kan ook, afhandkelijk van de context), dus zal niet (zeker) de waarde bevatten die jij er in die functies aan toegekend hebt.
    TMemoryLeak.Create(Nil);

  3. #18
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by VideoRipper View Post
    Ik gebruik TFileName ook wel eens, maar alleen als ik zeker weet dat het een bestandsnaam is en niet bijvoorbeeld alleen een pad.
    Waarom ik het doe? Geed idee, ook ooit eens ergens gelezen en het is gewoon blijven hangen, denk ik.


    Je moet ook eigenlijk niet overloads willen gebruiken omdat het kan, maar omdat het dan voordelen biedt t.o.v. je method een naam geven die aangeeft wat hij kan en doet.

    Delphi Code:
    1. // Handig, want dan hoef je niet na te denken van welk type je de waarde wilt hebben:
    2. function GetValue(const AName: string; out AValue: string): Boolean;
    3. function GetValue(const AName: string; out AValue: Integer): Boolean;
    4. function GetValue(const AName: string; out AValue: Boolean): Boolean;
    5.  
    6. // Gespecialiseerde methods voor bepaalde types:
    7. function LoadFromFile(const AFileName: TFilename): Boolean;
    8. function LoadFromStream(const AStream: TStream): Boolean;
    9. function LoadFromString(const AString: string): Boolean;


    Weet je zeker dat bovenstaande correct is en werkt?
    Je geeft een input (kun je eventueel als const declareren, hoeft niet per se), maar je output is geen out (voorkeur) of var (minder goed, maar kan ook, afhandkelijk van de context), dus zal niet (zeker) de waarde bevatten die jij er in die functies aan toegekend hebt.
    Hoi

    Ja dat stukje code werkt in Delphi 10.3.3 CE prima, zonder enige melding, probeer onderstaande code maar eens, wellicht dat de compiler slim genoeg is dit als VAR te zien.

    De tweede set functies zoals je beschrijft had ik al gemaakt, de reden dat ik het met overload gemaakt had is omdat ik het wel makkelijk vind, was zeker geen must, daarom nu ook aangepast.

    Alle onderstaande drie de methodes werken prima overigens.

    Code:
    program Project2;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      System.Classes;
    
    function test (aInput, aOutput : TMemoryStream) : boolean;
    //function test (const aInput, aOutput : TMemoryStream) : boolean;
    //function test (aInput : TMemoryStream; out aOutput : TMemoryStream) : boolean;
    
    begin
      result := false;
      if assigned (aInput) and assigned (aOutput) then
        begin
          aOutput.CopyFrom(aInput, aInput.Size);
          result := aOutput.Size = aInput.Size;
        end;
    end;
    
    
    var
      MSin, MSout : TMemoryStream;
    begin
      try
        MSin := TMemoryStream.Create;
        try
          MSin.LoadFromFile('testfile.in');
    
          MSout := TMemoryStream.Create;
          try
    
            Test (Msin, MSout);
    
            MSout.SaveToFile('testfile.out');
    
          finally
            MSout.Free;
          end;
    
        finally
          MSin.Free;
        end;
    
    
    
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    
      readln;
    end.
    Last edited by Herby; 22-Feb-21 at 21:37. Reason: code toegevoegd

  4. #19
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ja klassen gaan goed omdat het pointers naar instances zijn, het ging mij om die andere twee (string en TFilename) die niet kloppen.

  5. #20
    Quote Originally Posted by Herby View Post
    Ja dat stukje code werkt in Delphi 10.3.3 CE prima, zonder enige melding, probeer onderstaande code maar eens, wellicht dat de compiler slim genoeg is dit als VAR te zien.
    Deze dus... die kan geen tekst teruggeven in de aOutput omdat dat geen var is.

    function DecryptString ( aInput, aOutput : string ): boolean;

    Voor de aOutput moet dus een var of beter out.

  6. #21
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by rvk View Post
    Deze dus... die kan geen tekst teruggeven in de aOutput omdat dat geen var is.

    function DecryptString ( aInput, aOutput : string ): boolean;

    Voor de aOutput moet dus een var of beter out.
    Zowel TFileName als string geven beide middels out netjes een output terug, zonder out inderdaad geen output
    Met onderstaande code heb ik overigens nu ook de overload werkend :-)

    Code:
    program Project2;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils,
      System.Classes;
    
    
    function test (aInput : TFileName; out aOutput : TFileName) : boolean; overload;
    begin
      aOutput := 'TFileName: ' + aInput;
    end;
    
    function test (aInput : String; out aOutput : String) : boolean; overload;
    begin
      aOutput := 'string: ' + aInput;
    
    end;
    
    function test (aInput : TMemoryStream; out aOutput : TMemoryStream) : boolean; overload;
    begin
      result := false;
      if assigned (aInput) and assigned (aOutput) then
        begin
          aOutput.CopyFrom(aInput, aInput.Size);
          result := aOutput.Size = aInput.Size;
        end;
    end;
    
    
    var
      MSin, MSout : TMemoryStream;
      FNin, FNout : TFileName;
      Sin,  Sout  : String;
    
    begin
      try
        MSin := TMemoryStream.Create;
        try
          MSin.LoadFromFile('testfile.in');
    
          MSout := TMemoryStream.Create;
          try
    
            Test (Msin, MSout);
    
            MSout.SaveToFile('testfile.out');
    
          finally
            MSout.Free;
          end;
    
        finally
          MSin.Free;
        end;
        //=====================================
        FNin  := 'Test met TFileName';
        FNout := '';
    
        test (FNin, FNout);
        WriteLn (FNout);
    
        Sin  := 'Test met string';
        Sout := '';
    
        test (Sin, Sout);
        WriteLn (Sout);
    
    
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    
    
    
      readln;
    end.

Page 2 of 2 FirstFirst 1 2

Thread Information

Users Browsing this Thread

There are currently 2 users browsing this thread. (0 members and 2 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •