Results 1 to 12 of 12

Thread: Zoeken in strings in DFM's.

  1. #1

    Zoeken in strings in DFM's.

    In het kort
    Zoekfunctionaliteiten van Delphi, GExperts en andere tools zoeken niet handig in strings in .dfm files. Zeker als je queries opslaat in een datamodule loop je hier snel tegenaan (Zie kopje "Het probleem", onderaan deze post)

    Big DFM Search helpt daarbij.
    Download: https://github.com/GolezTrol/delphi-big-IDE-tools

    Disclaimer
    Dit is wederom een in elkaar geprakt pluizig tooltje. Ik schrijf ook weleens betere software hoor, maar er zijn van die dingen waar je eigenlijk geen tijd voor hebt en die dan maar even in elkaar gehackt worden.
    Niettemin is het voor mij een onmisbare tool, en de eerste vraag die ik van collega's kreeg na onze migratie naar Delphi XE5, is 'Waar is de Big DFM Search'. Daarom heb ik 'm nu -as is- toch ook maar publiek toegankelijk gemaakt nadat de code jarenlang is weggeroest in een lokaal gehoste SVN repository.

    In de repository staat ook nog een restje van een ander geval: BigSaveAll. Die is nog niet omgezet naar XE5. De code werkt in Delphi XE5, en moet ook werken in eerdere versies. Je krijgt nog wel een warning of twee bij het compileren in de Unicode-versies van Delphi.

    Gelukkig werkt het wel als het eenmaal geïnstalleerd is, en is het dan een praktische tool.

    "Installatie"
    De BigDFMSearch is afhankelijk van de JVCL omdat ik een TjvSelectDirectory gebruik. Dat is natuurlijk aan te passen als je geen JVCL wilt installeren.

    Download de source, open het project BigDFMSearchDXE5.dpk (niet de project group), of de D2007 versie voor Delphi 2007, of je moet zelf een package maken of aanpassen voor jouw Delphi-versie. Schroom in dat geval ook niet om jouw package weer te pushen, zodat de volgende er ook wat aan heeft.
    Compileer en installeer de package.

    Gebruik
    Vanwege luiheid van de programmeur is de zoekfunctie te vinden in het menu [Help], of met de sneltoets Alt+H, B.

    Name:  BigDFMSearch.png
Views: 908
Size:  23.6 KB

    Het zoekscherm lijkt op dat van de normale zoekfunctie. De opties zijn iets anders:
    • Wildcard search
      Laat je zoeken op wildcards
      * matcht een willekeurig aantal tekens.
      ? matcht precies één teken
    • Smart spaces
      Behandelt elke serie van whitespace tekens, inclusief tabs en enters, als een enkele spatie.
    • Starting with 'Text to find'
      Geeft alleen strings die beginnen met de zoekstring (normaliter kan de zoekstring overal in het resultaat voorkomen).
    • Treat stringlist as one string
      Behandel de items in een TStings-property als een enkele string. Daarmee kun je dus een meerregelige zoekactie in een memo doen, of zoeken in een query als het query-component een SQL property van het type TStrings heeft.


    To do
    • Serieus opschonen van code. Het is een vodje.
    • Packages maken voor verschillende versies.
    • Regular expressions toevoegen.
    • Afhankelijkheid naar JVCL eruit slopen, of afhankelijk maken van een define.


    Het probleem
    Het probleem zit namelijk in de manier waarop Delphi .dfm files opslaat. Afhankelijk van de property kan de stringwaarde worden opgeslagen als een lange string (TADOQuery.CommandText) of als een lijst van strings (TMemo.Lines). Bovendien worden de strings afgebroken op 80 tekens, en quotes en line breaks worden geëncodeerd.

    Dus een query als deze:

    Code:
    select 
      * 
    from 
      TBL_RANDOMTABLE 
    where
      MYFIELD = 'hello world'
    kan er in de .dfm als volgt uitzien:

    Code:
    'select'#13#10'  *'#13#10'from TBL_R' +
    'ANDOMTABLE '#13#10'where'#13#10'  M' +
    'YFIELD = '#39'hello world'#39
    Normale zoekfuncties houden daar geen rekening mee en kunnen 'TBL_RANDOMTABLE' dus niet vinden in deze file. Helaas zijn ook de zoekfuncties van Delphi zelf en van GExperts niet slim genoeg om hier rekening mee te houden. Big DFM Search gaat expliciet op zoek naar deze string waarden, parset ze, en zoekt vervolgens in de 'echte' string.

    Het is daarom een aanvulling op het gewone zoeken. Het zoekt niet in de namen van objecten of properties, en kan ook niet zoeken in .pas bestanden of andere bestanden.
    Last edited by GolezTrol; 26-Jun-14 at 12:50.
    1+1=b

  2. #2
    Aaah, ik heb je er al vaak over gehoord en het probleem klinkt inderdaad erg bekend . Mooi en bedankt!
    Marcel

  3. #3
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (overigens, soms worden texten in .dfm's ook weergegeven in #0066#0065#0072 achtige utf16 notatie)

  4. #4
    Ik ben dat nog niet tegengekomen, maar dat is misschien toeval. Wellicht dat WideString-properties op zo'n manier opgeslagen worden? Sowieso, als er een concrete beschrijving van het DFM format bestaat, dan zou ik die ook graag eens zien. Ik heb het nog niet kunnen vinden, en mijn parser is dan ook puur gebouwd op het lezen van de dfm's die ik ter beschikking had.
    1+1=b

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik heb daar last van gehad met die client app die ik naar Lazarus aan het porten was tijdens het etentje. (die met de server op de raspberry pi). En ja, dat was een Zeos app, en die gebruikt geloof ik veel twidestringfield etc.

  6. #6
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Het klinkt goed, alleen ik kan er op dit moment weinig mee. Omdat ik delphi2010 heb.
    En je maak gebruik van voor mij afwijkende componenten, dus even compileren en uitproberen is er niet bij.
    Is het aan een delphi versie verbonden, of maak je een universele exe die je binnen delphi gebruikt?
    In het laatste geval zou je een exe kunnen posten, dan kunnen we er allemaal van genieten.

    Gr. Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  7. #7
    Het is een package (bpl). Dat is dus in principe een dll, maar ik weet niet of die compatible zijn tussen Delphi-versies.
    Last edited by GolezTrol; 02-Jul-14 at 23:25.
    1+1=b

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dat is een goeie. In principe bevat de BPL alleen maar de code, die jij hebt gebruikt inclusief alle refferenties bij de uses. Maar als er bijvoorbeeld in 1 van die units generics gebruikt of unicode, terwijl dat niet hebt, dan zal het niet werken. Je zal dan op basis van de code zelf een package moeten maken.
    Dat is ook 1 van de rekenen waarom third party compagnies voor elke versie een aparte package leveren.

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by GolezTrol View Post
    Het is een package (bpl). Dat is dus in principe een dll, maar ik weet niet of die compatible zijn tussen Delphi-versies.
    D2006 en D2007 zijn misschien compatible met elkaar, de rest is incompatible.

  10. #10
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Quote Originally Posted by marcov View Post
    de rest is incompatible.
    [Offtopic on]
    Oja, er gaat me weer het e.a. dagen.
    Dat was de hoofdreden dat mijn vorige baas, een aantal delphiverie's oversloeg.
    Omdat al het spul wat er aanhangt en in de loop van de tijd gekomen is vaak niet zonder meer overgezet kan worden.
    En dat sommige thirth party componenten ook geupgrade moesten worden, wil je helemaal up to date zijn.
    En ik het huidige tempo van vernieuwing dan zal die problematiek zeker belangrijker gaan worden in het beslissingsmoment van upgraden.
    Het kost je menig uurtje voordat alles weer fatsoenlijk werkt.
    [Offtopic off]

    Sorry Goleztrol,
    Ik had je tooltje graag in Delphi2010 willen uitproberen, maar de tijd ontbreekt om daar diep in te duiken.

    Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  11. #11
    @Wok, ik heb het ook een beetje druk, maar als ik tijd heb, zal ik proberen om de versie op te schonen en recht te breien voor verschillende Delphi-versies. Ik heb in ieder geval 2007, XE en XE5 tot m'n beschikking. 2010 heb ik in ieder geval niet, maar aan de hand van de andere versies moet je dan een heel eind kunnen komen.
    1+1=b

  12. #12
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Dat is een prachtig "voor na de zomer vakantie als ik weinig te doen heb in de herfst" project.
    Ik zet 'm op mijn lijstje :-)

    Gr. Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

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
  •