Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Overload vraagje

  1. #1
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289

    Overload vraagje

    Hoi

    Wellicht een voor de hand liggend antwoord maar ik stel de vraag toch even.
    Hoe zorg ik ervoor dat zodra ik de function test aanroep met String als input/output dat hij de onderste functie gebruikt?
    Nu pakt hij de TFileName (wat ook een string is) ipv de onderste.

    Is dit misschien niet mogelijk of is er een truukje voor?
    Als (tijdelijke) workarround heb ik dan nu ook een TestStr aangemaakt maar persoonlijk vind ik dat minder mooi.

    Code:
    type
      TMylass = class
      private
      ..
      public
      ..
        function Test ( aInput, aOutput: TMemoryStream ) : boolean; overload;
        function Test ( aInput, aOutput: TFileName )     : boolean; overload;
        function Test ( aInput, aOutput: String)         : boolean; overload;
      ..
      end;

  2. #2
    Is TFileName niet gewoon een string?
    (volgens mij wel)

    Waarom heb je dus een aparte overload voor TFileName als die String overload ook gewoon werkt?

    Eigenlijk had je dus een waarschuwing moeten krijgen dat de overload niet mag omdat de parameter-types hetzelfde zijn.

  3. #3
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Ja dat stond er ook "Nu pakt hij de TFileName (wat ook een string is)"
    De reden dat ik het wil is omdat de ene een string verwerkt en de ander een file.
    Ik krijg overigens geen compiler warning

  4. #4
    Omdat het allebei een string is gaat een overload niet werken.

    Ps. Gaat het misschien met een var of const ervoor wel goed? (Kan nu zelf niet testen)

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    TFileName is een TYPE string.

    Dit is een van de grijze gebieden van het Delphi dialect. Aan de ene kant geeft de Delphi/FPC overloading construct meer gewicht aan TYPE(*), aan de andere kant is de TYPE implementatie van Borland en afgeleide dialecten relatief zwak.

    Strict genomen zou een TFilename declaratie de tfilename variant moeten nemen, en de rest de string variant. Maar ik heb door de jaren heen afgeleerd daar op te vertrouwen.

    (*) voor de duidelijkheid, dit is RHS TYPE.

  6. #6
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Ik heb de strings een var gegeven en de filename const en dan pakt hij in ieder geval de juiste

    Wederom bedankt

    gr
    Herby

  7. #7
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Dit werkt uiteindelijk

    Code:
    type
      TMylass = class
      private
      ..
      public
      ..
        function Test ( var    aInput, aOutput: TMemoryStream ) : boolean; overload;
        function Test ( const aInput, aOutput: TFileName )     : boolean; overload;
        function Test ( var    aInput, aOutput: String)         : boolean; overload;
      ..
      end;

  8. #8
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Beetje te voorbarig, zodra ik niet met een const als filename uit de voeten kan gaat het alsnog mis.
    Als ik het dus goed begrijp is hier dus geen simpele oplossing voor?

  9. #9
    Quote Originally Posted by marcov View Post
    TFileName is een TYPE string.
    Ja, daar had ik ook aan gedacht maar is dat in Delphi ook echt zo??
    http://docwiki.embarcadero.com/Libra...tils.TFileName
    (Daar staat het n.l. niet eens TYPE)

    (In FPC is het inderdaad een TYPE string. Ben benieuwd of de simpele overload daar dan wel werkt )

  10. #10
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    In SysUtils:

    { Generic filename type }

    TFileName = type string;

  11. #11
    Quote Originally Posted by Herby View Post
    In SysUtils:

    { Generic filename type }

    TFileName = type string;
    O warempel. Had eigenlijk wel verwacht dat dat ook wat duidelijker in de docs zou staan.

    PS. Is het niet mogelijk om in de normale string overload te controleren of je te maken hebt met een filenaam of met een normale string?
    Of andersom (afhankelijk van wat je functie doet) dat je controleert dat je met een correcte string te maken hebt en anders als filenaam beschouwt.

  12. #12
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by rvk View Post
    O warempel. Had eigenlijk wel verwacht dat dat ook wat duidelijker in de docs zou staan.

    PS. Is het niet mogelijk om in de normale string overload te controleren of je te maken hebt met een filenaam of met een normale string?
    Of andersom (afhankelijk van wat je functie doet) dat je controleert dat je met een correcte string te maken hebt en anders als filenaam beschouwt.
    Ja dat zou ik kunnen doen maar ben ik niet zo'n voorstander van.
    Als er geen andere mogelijkheid is kan ik nog altijd ze hernoemen als TestFile/TestMS/TestStr

  13. #13
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    [Just for completeness sake] Als alternatief kun je ook een default parameter IsFile: Boolean = True/False toevoegen.

    En misschien even een gekke vraag, maar als de parameter niet een bestand of een stream is, maar wel voor input/output dient, wat is die string dan wel? Oftewel: in welke geval zou je de String parameter gebruiken? (Zomaar voor mijn nieuwsgierigheid hoor... )
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  14. #14
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    289
    Quote Originally Posted by NGLN View Post
    [Just for completeness sake] Als alternatief kun je ook een default parameter IsFile: Boolean = True/False toevoegen.

    En misschien even een gekke vraag, maar als de parameter niet een bestand of een stream is, maar wel voor input/output dient, wat is die string dan wel? Oftewel: in welke geval zou je de String parameter gebruiken? (Zomaar voor mijn nieuwsgierigheid hoor... )
    Dit is een stukje wat ik eerder hier gepost had mbt RSA encryption.
    Wilde het wat optimaliseren en dingen aan toevoegen, ik heb daar twee encryption functions, de ene met files als input, de ander als stream.
    De file variant roept uiteindelijk de stream variant aan die het uitendelijke werk doet.
    Wilde nu ook een string in/uit mechanisme toevoegen die uiteindelijk ook weer de stream aanroept opm het werk te doen.

    Ik loop nu dus vast met de declaratie omdat er nu twee functies zijn die beide een string hebben (string vs TFileName), dat lukt dus niet

  15. #15
    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.)

Page 1 of 2 1 2 LastLast

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
  •