Results 1 to 13 of 13

Thread: with val

  1. #1

    with val

    Er zit een with-val in de EnumFiles:

    Delphi Code:
    1. procedure NLDGetFiles(Path: string; List: TStrings;
    2.                       Options: TFSOptions) {Arme options parameter die nooit wordt gebrukt};
    3. begin
    4.   List.Clear;
    5.   with TNLDStringsFileSearch.Create do
    6.   try
    7.     Strings := List;
    8.     EnumFiles(Path, Options);
    9.   finally
    10.     Free;
    11.   end;
    12. end;
    Marcel

  2. #2
    oh, en in 't path ook Ik zal later mijn aanpassingen uploaden...
    Marcel

  3. #3
    Ik heb 'm gecommit.

    Er staat nog een stiekeme wijziging in die nog een nettere oplossing verwacht. In Search wordt een EFOpenError garaised, maar die verwacht bij mij een hele andere parameter dan een string, dus dat compileerde bij mij niet.

    Is dat ergens gewijzigd in de historie van Delphi versies?
    Marcel

  4. #4
    Gesplitst van de hoofd thread. Alleen een mod kan posten in een gesloten thread.
    Marcel

  5. #5
    In D2005 en Turbo Delphi compileert het ook niet. In D7 blijkbaar ook al niet. Dit zou aangepast zijn sinds D7?
    Runtime library
    Classes unit
    • A new exception class, EFileStreamError, has been added.
    EFileStreamError and EFOpenError descend from this
    class. This new class may take a FileName parameter. As a
    result, the exception message ......
    Kan iemand met een oudere versie dit bevestigen?
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  6. #6
    Dat klopt volgens mij wel. Ik vermoed dat deze aanpassing een keer is gedaan door iemand met een nieuwere versie. En de huidige laatste versie heeft een 'gewone' Exception, wat natuurlijk ook wel werkt.

    @Marcel, ik heb nog wel een vraagje over je aanpassingen. Behalve deze exception en wat esthetische zaken zie ik geen verschillen. Klopt dat?
    Last edited by GolezTrol; 16-Aug-08 at 13:11.
    1+1=b

  7. #7
    Even gecheckt. Het compileert inderdaad niet met Delphi 7. EFOpenError is afgeleide van EFileStreamError die in zijn default constructor een PResStringRec en een filename wil.
    Het compileert wel in Delphi 5. Daar is EFOpenError afgeleid van EStreamError die gewoonweg een string als parameter wil. Blijkbaar zit de aanpassing daar dus tussenin, en zou het zomaar kunnen zijn dat ik oorspronkelijk verantwoordelijk ben voor het gebruik van deze Exception aangezien ik thuis tot vrij laat Delphi 5 heb gebruikt en de laatste tijd geen aanpassingen meer aan NLDelphi heb gedaan.
    1+1=b

  8. #8
    Quote Originally Posted by GolezTrol View Post
    @Marcel, ik heb nog wel een vraagje over je aanpassingen. Behalve deze exception en wat esthetische zaken zie ik geen verschillen. Klopt dat?
    Oh sorry, ik moet mijn term "with val" even uitleggen

    Als je naar de code hierboven kijkt dan zie je dat er een with wordt gebruikt (TNLDStringsFileSearch.Create). Binnen die with wordt EnumFiles aangeroepen (EnumFiles(Path, Options)) Op het eerste gezicht zou je denken dat daar het Path en de Options worden meegegeven die de routine als parameter meekrijgt. Maar de TNLDStringsFileSearch heeft een property Path en een property Options en die hebben een hogere prioriteit dan de parameters. Er wordt dus altijd een leeg path en een lege set options meegegeven.

    En dat was ook precies de bug waar ik tegenaan liep.
    Marcel

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Feature, not bug

  10. #10
    Ja, feature van Delphi maar hier toch een bug in het component.
    Marcel

  11. #11
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Quote Originally Posted by Marcel View Post
    een with-val
    Dat het soms fout gaat met een 'with' weet ik inmiddels, maar in een algemene 'with' waar en hoe gebeurt het dan en hoe kan je dat voorkomen.
    Consequent de 'With' vermijden of zijn er ook andere optie's ?

    Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Overigens, behalve gevaarlijke foutjes vind ik ook dat de IDE (codetools) slecht omgaan met het with statement.

    Ik gebruik with nu veel spaarzamer dan vroeger, maar meer vanwege de IDE dan vanwege fouten. Dat ik minder last heb van die fouten is misschien omdat ik redelijkschone OO hierarchien aanhoudt, en erf zelden van erg grote objecten als TComponent. (gebruik meer encapsulatie). Dan is je scope minder vaak vervuild.

  13. #13
    Quote Originally Posted by Wok View Post
    waar en hoe gebeurt het dan
    Wat with eigenlijk doet is een kleinere scope maken. Wanneer je een globale variabele A: TObject hebt en een functie-parameter A:TObject, dan zul je bij het aanspreken van een property van A terechtkomen bij het object in de parameter, en niet bij de global. Hetzelfde geldt wanneer A globaal en lokaal (in de functie) is gedeclareerd.
    Wanneer je with gebruikt, dan verklein je die scope nog een keer, en dat is wat hier gebeurde. Path en Options zijn (waren) parameters van de functie, maar tevens properties van het in de with gecreëerde object. Daardoor werden de properties gelezen in plaats van de parameters.

    Zoals Marco al aangeeft gaat de IDE hier ook niet goed mee om. De debugger herkent deze with statements niet goed en kijkt een scope hoger, waardoor je tijdens het debuggen waarschijnlijk wel de waarde van de parameter krijgt. Dat maakt het geheel alleen nog maar lastiger.

    Hoe je dit kunt voorkomen? Goed opletten, goed testen, en terughoudend zijn met het gebruik van with.

    Het probleem met with is vooral dat het weerslag kan hebben op een heel ander deel van je code dan dat je aanpast.
    In dit geval zie je dat ook. De NLDGetFiles kan heel goed gewerkt hebben, maar door het toevoegen van een property 'Path' aan de gebruikte class werkt het ineens niet meer. De reden is dat de with er dan voor zorgt dat de property van de class wordt gebruikt in plaats van de parameter van de functie. Dit noodzaakt je dus om grote delen van je code te hertesten, terwijl je deze ogenschijnlijk helemaal niet aangepast hebt. Ik denk dat je dit wel als één van de grootste gevaren van het gebruik van with mag beschouwen.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 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
  •