AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Passende Unit zur Funktion finden

Ein Thema von Harry Stahl · begonnen am 17. Aug 2015 · letzter Beitrag vom 19. Aug 2015
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Passende Unit zur Funktion finden

  Alt 19. Aug 2015, 10:13
[...] 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Passende Unit zur Funktion finden

  Alt 19. Aug 2015, 11:14
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.

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#3

AW: Passende Unit zur Funktion finden

  Alt 19. Aug 2015, 17:41

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:

* 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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Passende Unit zur Funktion finden

  Alt 19. Aug 2015, 18:27
* 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.
* 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.
* 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.

Geändert von nahpets (19. Aug 2015 um 19:40 Uhr) Grund: Edit fand Schreib- und Programmfehler und hat versucht diese zu beheben ;-)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#5

AW: Passende Unit zur Funktion finden

  Alt 19. Aug 2015, 16:53
[...] 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...

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz