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.
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:
kan er in de .dfm als volgt uitzien:Code:select * from TBL_RANDOMTABLE where MYFIELD = 'hello world'
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.Code:'select'#13#10' *'#13#10'from TBL_R' + 'ANDOMTABLE '#13#10'where'#13#10' M' + 'YFIELD = '#39'hello world'#39
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.
Bookmarks