Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Passende Unit zur Funktion finden (https://www.delphipraxis.net/186252-passende-unit-zur-funktion-finden.html)

Harry Stahl 17. Aug 2015 22:22

Passende Unit zur Funktion finden
 
Mit der wachsenden Zahl der Funktionen und Units ist es manchmal gar nicht so einfach auf Anhieb die richtige Unit zu finden.

Man kennt vielleicht den Namen der Funktion oder den benötigten Datentyp, aber welche Unit muss ich dafür noch mal einbinden?

Auf Stack Overflow habe ich diese Ausführungen (noch zu Delphi 2010) gefunden:

http://stackoverflow.com/questions/9...or-delphi-2010

Gibt es heute (8 Delphi-Versionen weiter) immer noch keine in Delphi eingebaute Funktion, welche mir die Arbeit abnimmt? Oder habe ich hier etwas übersehen?

Sir Rufo 17. Aug 2015 22:31

AW: Passende Unit zur Funktion finden
 
Ja, hast du :)

SHIFT+STRG+A (und auf SO wird doch auch das Refactoring angesprochen, das ist jetzt nur der Shortcut für diese Funktion Refactor/Unit suchen...)

Harry Stahl 17. Aug 2015 22:41

AW: Passende Unit zur Funktion finden
 
OK, das ist ja nur ein anderer (kürzerer Weg) für rechte Maustaste, Refactoring, Unit suchen.

Das kannte ich natürlich schon. Aber das bringt nur manchmal hilfreiche Ergebnisse (wenn, dann eher noch bei Datentypen).

Diese Funktion versagt aber schon bei einem einfachen

ShellExecute (was ShellApi wäre)

oder

TDirectory.GetFiles (was System.ioutils wäre)

Ich würde mal sagen, zu 90% kommt dabei nichts raus, so dass ich immer über die F1-Hilfe-Taste gehen muss, aber das dauert halt manchmal recht lange und ich muss dann die Unit manuell einfügen.

Edit: Mit Deiner Ergänzung haben sich unsere postings überschnitten...

Perlsau 17. Aug 2015 23:43

AW: Passende Unit zur Funktion finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Harry Stahl (Beitrag 1312492)
Mit der wachsenden Zahl der Funktionen und Units ist es manchmal gar nicht so einfach auf Anhieb die richtige Unit zu finden.

Wenn ich dich aufgrund deines zweiten Postings richtig verstanden habe, meinst du in der Hauptsache nicht eigene Funktionen bzw. Methoden, sondern die mitglieferten. Im diesem Fall schreibst du einfach den Namen der Funktion irgendwo in deinen Quelltext und drückst F1. Alternativ kannst du den gesuchten Methodennamen auch dort eingeben, da sind dann sogar Platzhalter erlaubt.

Ansonsten behelfe ich mir meist mit einer Dateisuche in meinem Projektordner via DateiCommander (ich verwende FreeCommander): einfach nach *.pas suchen und im Feld für den Textinhalt den Methodenbezeichner eingeben. Ebenso gehe ich vor, wenn ich die einzubindende Unit von Zusatz-Komponenten oder -Klassen suche, die sich bei mir immer ausnahmslos im öffentlichen Userordner unter Dokumente befinden. Letzteres klappt natürlich nur, wenn du über die entsprechenden Quellcodes verfügst (was bei mir z.B. bei IbDac nicht der Fall ist, da ich nur über die Basis-Version verfüge, aber da brauche ich auch nicht wirklich eine Suche, die kenn ich inzwischen in- und auswendig). Bei visuellen Komponenten braucht man das nicht, denn da werden die benötigten Units ja automatisch eingebunden – sehr hilfreich, wenn man an einer eigenen Klassenunit bastelt und darin diverse Komponenten erst zur Laufzeit erzeugen will.

Eine weitere Alternative wäre natürlich eine geeignete Code-Verwaltung, wie ich sie bereits vor Jahren für mich selbst entwickelt habe (als Teil einer dantenbankgestützten Projektverwaltung):

Der schöne Günther 18. Aug 2015 07:34

AW: Passende Unit zur Funktion finden
 
Strg+Shift+A funktioniert nie auf Anhieb. Bei mir funktioniert es in 60% aller Fälle nach dem dritten mal, 30% nach dem fünften mal. Es ist komischerweise immer eine ungerade Zahl. :shock:

Union 18. Aug 2015 07:55

AW: Passende Unit zur Funktion finden
 
Wie wär's mit diesem Indexierungstool von Stevie?

Der schöne Günther 18. Aug 2015 08:09

AW: Passende Unit zur Funktion finden
 
Zitat:

Please don't bug me with any crash reports or feature requests, thanks!
:-(

Union 18. Aug 2015 08:23

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1312522)
Zitat:

Please don't bug me with any crash reports or feature requests, thanks!
:-(

Das ist doch noch eine Alpha.

dataspider 18. Aug 2015 08:57

AW: Passende Unit zur Funktion finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Hilfe zeigt es doch beim Schreiben schon an. Oder noch mal den Mauszeiger drüber...

Frank

bernau 18. Aug 2015 09:39

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von dataspider (Beitrag 1312536)
Die Hilfe zeigt es doch beim Schreiben schon an. Oder noch mal den Mauszeiger drüber...

Frank

Dazu musst du aber die betreffende Unit in der Uses aufgenommen haben. Sonst funktioniert das nicht. Ich gehe davon aus, das Harry die Procedure kennt und wissen will, in welcher Unit diese vorhanden ist, damit diese dann in Uses aufgenommen werden kann.

dataspider 18. Aug 2015 10:37

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von bernau (Beitrag 1312546)

Dazu musst du aber die betreffende Unit in der Uses aufgenommen haben. Sonst funktioniert das nicht. Ich gehe davon aus, das Harry die Procedure kennt und wissen will, in welcher Unit diese vorhanden ist, damit diese dann in Uses aufgenommen werden kann.

Ja, logisch...:oops:

Union 18. Aug 2015 11:08

AW: Passende Unit zur Funktion finden
 
Genau das macht doch Stevies Tool. Der Inidiziert alles und baut sich eine Suchliste auf.

Harry Stahl 18. Aug 2015 17:00

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Perlsau (Beitrag 1312497)
[Wenn ich dich aufgrund deines zweiten Postings richtig verstanden habe, meinst du in der Hauptsache nicht eigene Funktionen bzw. Methoden, sondern die mitglieferten. Im diesem Fall schreibst du einfach den Namen der Funktion irgendwo in deinen Quelltext und drückst F1. Alternativ kannst du den gesuchten Methodennamen auch dort eingeben, da sind dann sogar Platzhalter erlaubt.

Ja, hast Du richtig verstanden. Dein Link (Suche über Delphi-Praxis) ist gar nicht so übel. Brachte für ein paar schnell gemachte Tests gute Ergebnisse (allerdings für ShellExecute auch keinen Treffer, was aber kein Drama ist).

Harry Stahl 18. Aug 2015 17:21

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Union (Beitrag 1312518)
Wie wär's mit diesem Indexierungstool von Stevie?

Habe ich getestet, bzw. hätte ich gerne.

Ich habe es geschafft die Zip-Datei zu laden, alles zu entpacken und die Datei "CacheBuilder.exe" zu starten.

Ok, dann das Source-Verzeichnis von XE7 angegeben (C:\Program Files (x86)\Embarcadero\Studio\15.0\source) und etwas gewartet.

Aber dann?

Kann nicht erkennen, dass irgendwo eine typecache.dat erzeugt wurde (sollte angeblich im gleichen Verzeichnis wie die Exe sein). Jedenfalls, wenn ich die DelphiUsesHelper.bpl in Delphi hinzugefügt habe und Delphi neu gestartet habe, findet das Tool keine Units für die getesteten Funktionen.

Wird an der fehlenden typecache.dat Datei liegen.

Edit: OK, Die Exe-Datei musste beendet werden, dann wird die Typecache.dat erzeugt.

Edit2: Es werden hier keine Funktionen oder Prozeduren gescannt, sondern nur Typen. Aber auch da funktioniert die Suche nicht (was ich jetzt aber nicht weiter verfolgen werde, da ich ja neben den Typen auch Funktionen und Prozeduren haben wollte. Aber dennoch Danke für den Tipp).

Derzeit scheint die F1-Methode noch die Beste zu sein. :(:?

Stevie 18. Aug 2015 18:59

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1312522)
Zitat:

Please don't bug me with any crash reports or feature requests, thanks!
:-(

Ja, tut mir ja leid, aber zwischen DSharp, Spring4D, TestInsight und sonstigem Krams wollt ich mich nicht auch noch mit Support dafür belasten (zumals nur ebend so zusammen geklatscht war, da mir Ctrl+Shift+A auf die Nerven ging - sekundenlanges Warten, nee danke) :mrgreen:

Zitat:

Zitat von Harry Stahl (Beitrag 1312590)
Es werden hier keine Funktionen oder Prozeduren gescannt, sondern nur Typen.

Richtig, das war in der Version so (consts, global vars und Routinen gehen aber bei mir auch ;)).

Zitat:

Zitat von Harry Stahl (Beitrag 1312590)
Aber auch da funktioniert die Suche nicht

Cursor auf nen Identifier - hotkey drücken, Unit wird aufgelistet (sofern das ein Typ ist). Das sollte funktionieren.

Harry Stahl 18. Aug 2015 20:14

AW: Passende Unit zur Funktion finden
 
Stevie, danke für Deine Rückmeldung.

Wenn ich bei
Delphi-Quellcode:
var
  MS: TMemoryStream;
den Cursor auf TMemorystream stelle und Shift+Alt+F10 drücke, sollte er mir doch die System.classes benennen (der Eintrag ist jedenfalls in der typecache.dat drin ("tmemorystream=System.Classes")), die Meldung lautet aber nur "No Unit found for identifier TMemoryStream".

Oder mache ich da etwas falsch oder habe es nicht richtig verstanden?
[Getestet unter XE7, auf Windows 10, 64 Bit]

stoxx 18. Aug 2015 20:39

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Harry Stahl (Beitrag 1312492)
Mit der wachsenden Zahl der Funktionen und Units ist es manchmal gar nicht so einfach auf Anhieb die richtige Unit zu finden.

Man kennt vielleicht den Namen der Funktion oder den benötigten Datentyp, aber welche Unit muss ich dafür noch mal einbinden?


Schau Dir doch mal Agent Ransack an, ist generell ein schönes Suchtool zur Volltextsuche.
Kann ich nur empfehlen.

https://www.mythicsoft.com/agentransack

Stevie 19. Aug 2015 10:13

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Harry Stahl (Beitrag 1312602)
[...] die Meldung lautet aber nur "No Unit found for identifier TMemoryStream". [...]

Liegt die typecache.dat neben der DelphiUsesHelper.bpl? Nur dann wird sie auch verwendet.

nahpets 19. Aug 2015 11:14

AW: Passende Unit zur Funktion finden
 
Hallo,

habe mal ein bisserl rumgedaddelt, da ich so 'ne Funktionalität eigentlich auch schon immer gesucht habe.

Es ist ein kleines Programm (mit Delphi 7) dabei herausgekommen, dass ich mir unter Tools in die IDE aufgenommen habe.

Was macht das Programm:

Zuerst benötigt es einen Platz auf der Festplatte. Es muss dort Unterverzeichnisse anlegen dürfen und beliebige Dateien erstellen können (sonst wird's nix).

Beim ersten Start sorgt es dort für die erforderliche Verzeichnisstruktur. Der Anwender wähle dann bitte über den Schalter "Verzeichnis auswählen" (oder Taste F4) das Verzeichnis aus, in dem sich die Quelltextdateien befinden. Anschließend ist der Schalter "Daten aktuallisieren" (oder Taste F5) zu betätigen.

Nun werden alle Dateien mit der Dateiendung ".pas" gelesen. Zuerst wird geprüft, ob die Zeichenfolge "Unit" enthalten ist, fehlt diese, wird die Datei ignoriert.
Nun wird zeilenweise gelesen und geprüft, ob eine Zeile mit "Function" oder "Procedure" beginnt (Groß-/Kleinschreibung ist egal).
Die entsprechenden Zeilen werden aufgeteilt in:
"function" bzw. "procedure".
Sofern es eine "(" in der Zeile gibt, ist alles davor der Name und der Rest der Zeile wird als Parameter interpretiert. Mehrzeilige Parameterlisten werden nicht übernommen.
Fehlt die "(", wird nach 'nem ":" geschaut, alles bis dorthin ist dann der Name, der Rest wird als Parameter interpretiert.
Fehlen "(" und ":" wird nach einem ";" geschaut. Alles bis dorthin wird zum Namen, Parameter gibt's dann nicht.
Das ist so nicht perfekt, aber mehr gibts nicht und es sollte so für die meisten Sachen reichen.
Ist halt 'n Schnellschuß.

Wird die Zeichenfolge "implementation" gefunden, so endet die Verarbeitung der Datei.

In die "Datenbank" werden aufgenommen:
  1. Typ ("function" bzw. "procedure")
  2. Name
  3. Parameter
  4. die zugehörige Unit
  5. Dateiname der Unit mit Pfad
Durch die wiederholte Auswahl von Verzeichnissen und der anschließenden Aktuallisierung, lassen sich auch Daten aus unterschiedlichen Quellen in die "Datenbank" einfügen.
Dauert die Aktuallisierung zu lang, lässt sie sich über den Schalter "Aktuallisierung abbrechen" eben abbrechen. Die Tabelle kann auch über den Schalter "Tabelle leeren" geleert werden. Einer anschließenden Neubefüllung steht dann nichts entgegen.
Wird ein Verzeichnis mehrfach ausgewählt und in die Tabelle eingefügt, so sollten keine Dubletten entstehen, da bei der Befüllung zuerst geschaut wird, ob es die Kombination aus Name und Unit schon gibt. Diese wird dann aktuallisiert.
Es wird aber nicht erkannt, ob eine Unit eine Funktion bzw. Prozedur bei einer Aktuallisierung nicht mehr enthält.

Es gibt ein Eingabefeld, in dem man halt seine Suche durchführen kann, einfügen per Copy&Paste für die Suche funktioniert. Groß-/Kleinschreibung ist nicht von Bedeutung. Rechts neben dem Eingabefeld werden der Name der gefunden Funktion/Prozedur und die zugehörige Unit angezeigt. Ein Doppelklick auf den Namen kopiert die Namen der Unit in die Zwischenablage.

Über den schwarzen Pfeil oben links im Grid kann man die anzuzeigenden Spalten auswählen, die Spaltenreihenfolge kann durch verschieben verändert werden. Diese Konfiguration wird im Unterverzeichnis "Config" des Programmes gespeichert. Sollte sie mal zerschossen sein, einfach dort die Datei löschen.
Die übrige Konfiguration wird in der Registry gespeichert, wer das nicht mag, nutze das Programm nicht.
Die "Datenbank" befindet sich nach dem ersten Aufruf im Verzeichnis "Data".

Support gibts nicht, Änderungsanforderungen werden ignoriert. Das Programm ist wie es ist. Eventuell kann ja wer was damit anfangen, wenn nicht, dann nicht.

---
Habe noch einen Fehler bei der Befüllung der "Datenbank" gefunden, daher können dort Dubletten enthalten sein.
Neue Programmversion hängt an.
Bitte vorm Programmstart die Datei "Funktionsverzeichnis.kbmt" im Verzeichnis "Data" löschen und die Daten neu in die "Datenbank" aufnehmen.

Harry Stahl 19. Aug 2015 16:53

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Stevie (Beitrag 1312706)
Zitat:

Zitat von Harry Stahl (Beitrag 1312602)
[...] die Meldung lautet aber nur "No Unit found for identifier TMemoryStream". [...]

Liegt die typecache.dat neben der DelphiUsesHelper.bpl? Nur dann wird sie auch verwendet.

OK, das war es, jetzt funktioniert es.

Beim schnellen Lesen habe ich in Deiner Erläuterung das "besides it" noch auf "beside the exe" bezogen, aber genauer betrachtet, bezog es sich natürlich auf die DelphiUserHelper.bpl.

Was mir an dem Tool gut gefällt, ist, dass der Ergebnis-Dialog mir anbietet, die gefundene Unit direkt im interface oder implementation Abschnitt einzufügen. Das ist sehr komfortabel, da ich meine aktuelle Arbeitsposition nicht wechseln muss.

Ich verkneife mir hier (mühsam) jeglichen Feature-Request, aber falls Du irgendwann mal Langeweile haben solltest, dann wäre das sicher ein schönes Projekt, das man evtl. noch erweitern könnte... :-D

... und womit man sogar die ganze Delphi-Community weiter voran bringen würde, da wir dann noch mehr RAD könnten... :thumb:

Harry Stahl 19. Aug 2015 17:41

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von nahpets (Beitrag 1312716)

Es ist ein kleines Programm (mit Delphi 7) dabei herausgekommen, dass ich mir unter Tools in die IDE aufgenommen habe.

Support gibts nicht, Änderungsanforderungen werden ignoriert. Das Programm ist wie es ist. Eventuell kann ja wer was damit anfangen, wenn nicht, dann nicht.

Funktioniert soweit und wenn ich jetzt kurz Hinweise gebe, sehe es bitte nicht als Änderungsanforderung sondern als einfache Mitteilung über das, was mir auffiel::wink:

* Nach erneutem Start speichert das Programm die ganze Datenbank nach Beendigung, auch wenn man nur gesucht hat (also nichts hinzugefügt hat)
* Funktionen in Records bzw. "Class Procedures" bzw. "Class Functions" werden beim Parsen anscheinend übersehen?
* Die ganze Liste braucht man eigentlich nicht anzuzeigen, kostet nur Arbeitsspeicher und Ladezeit, Suchergebnisse sollten reichen.

Jedenfalls vielen Dank für Deinen Beitrag und die Zurverfügungstellung Deines Programms.:thumb:

Harry Stahl 19. Aug 2015 17:48

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von stoxx (Beitrag 1312605)
Zitat:

Zitat von Harry Stahl (Beitrag 1312492)
Mit der wachsenden Zahl der Funktionen und Units ist es manchmal gar nicht so einfach auf Anhieb die richtige Unit zu finden.

Man kennt vielleicht den Namen der Funktion oder den benötigten Datentyp, aber welche Unit muss ich dafür noch mal einbinden?


Schau Dir doch mal Agent Ransack an, ist generell ein schönes Suchtool zur Volltextsuche.
Kann ich nur empfehlen.

https://www.mythicsoft.com/agentransack

Nutzt Du das Tool auch selber für den hier diskutierten Zweck? Wenn ja, wie würde z.B. das Suchergebnis für "ShellExecute" aussehen oder "GetFiles"? Gibt es da dann eine Möglichkeit den Unit-Namen schnell in die Zwischenablage zu kopieren?

nahpets 19. Aug 2015 18:27

AW: Passende Unit zur Funktion finden
 
Zitat:

Zitat von Harry Stahl (Beitrag 1312762)
* Nach erneutem Start speichert das Programm die ganze Datenbank nach Beendigung, auch wenn man nur gesucht hat (also nichts hinzugefügt hat)

Ja, das hat die Speichertabelle, die ich da nutze, so an sich :-(
OK, hab' ich geändert, jetzt wird nach dem Aktuallisieren gespeichert, beim Beenden aber nicht mehr.
Zitat:

Zitat von Harry Stahl (Beitrag 1312762)
* Funktionen in Records bzw. "Class Procedures" bzw. "Class Functions" werden beim Parsen anscheinend übersehen?

Nö, da wird garnicht erst nach geguckt. Interessieren tuen nur Zeilen, die mit "function" oder "procedure" beginnen. ;-)
OK, jetzt werden auch Zeilen beachtet, die mit "class function" bzw. "class procedure" beginnen.
Damit's in der Tabelle keinen "Strubbel" gibt, bitte die Datei "Funktionsverzeichnis.kbmt" im Verzeichnis "Data" (unterhalb des Programmverzeichnisses") löschen und nach dem Programmstart neu befüllen lassen.
Zitat:

Zitat von Harry Stahl (Beitrag 1312762)
* Die ganze Liste braucht man eigentlich nicht anzuzeigen, kostet nur Arbeitsspeicher und Ladezeit, Suchergebnisse sollten reichen.

Nö, die "Datenbank" existiert nur im Arbeitsspeicher, ob sie nun im Grid angezeigt wird oder nicht, belegt keinen zusätzlichen Speicher.
OK mit F12 kann man sie jetzt anzeigen oder verstecken und das Programm merkt sich auch beim Beenden diese Einstellung.

Neue Version ist im vorherigen Post.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz