AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions
Thema durchsuchen
Ansicht
Themen-Optionen

Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

Ein Thema von Axti · begonnen am 13. Jun 2018 · letzter Beitrag vom 19. Jun 2018
Antwort Antwort
Axti

Registriert seit: 13. Jun 2018
5 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 16:50
Hallo zusammen,
ich stehe vor folgendem Problem:

Ich soll ein Programm schreiben, welches die Formulardateien(*.dfm) eines Delphiprojektes durchsucht.
Dort sollen folgende Dinge gefunden und später in einer Datenbank abgelegt werden: Formularname, TActions,
Caption-Eigenschaft der TActions und die Menüstruktur in der die Actions hinterlegt sind.

Kein allzu großes Problem dachte ich mir am anfang. Irgendwann, als ich dann die Routine für das durchsuchen
der Menüstruktur geschrieben habe bin ich dann aber zu dem Problem gekommen, dass Actions, die in im
3. Untermenü liegen, nicht mehr erfasst werden.

Delphi unterscheidet leider nicht zwischen Menü und den entsprechenden MenüItems. Es gibt lediglich 'TMainMenu' und 'TMenuItem'.
Die Menüstruktur sieht also folgendermaßen aus:

MainMenu:
Datei-----------------------------Bearbeiten----------Hilfe------------
-MenuItem1----------------------MenuItem1---------MenuItem1-
-MenuItem2->MenuItem1-----MenuItem2---------MenuItem2-
-MenuItem3---MenuItem2-----MenuItem3---------MenuItem3-
------------------MenuItem3--------------------------------------------


Wenn ich also eine den Menüpfad zu einer Action haben möchte, die bei MainMenü->Datei->MenuItem2->MenuItem1 hinterlegt habe,
ist der Übergang im Code von Datei zu MenuItem2 genau der gleiche wie von MenuItem2 zu MenuItem1 im Untermenü. Mir fehlt
also ein spezifischer Anhaltspunkt der mir sagt: "Hier hat ist einer der Menüpunkte noch ein Menü". Mein bisheriger Ansatz
scheiterte genau an dem Fehlen eines solchen speziellen Anhaltspunkt. Die Variable, in der der erste Menüpunkt gespeichert wurde,
wurde jedesmal überschrieben da die Abfrage ob ein Menüpunkt vorhanden in beiden Fällen identisch sein muss, andernfalls speichert
er die Menüpunkte gar nicht ab.

Fällt jemanden eine anderer Lösungsansatz ein oder bei mir ein Denkfehler auf? Habe heute schon den ganzen Tag geknobelt und komme
nicht drauf
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#2

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 17:09
Im DFM sieht das doch so aus:

Code:
object frmUserMgmt: TfrmUserMgmt
  ...
  Menu = mmMain
  ...
  object mmMain: TMainMenu
    Left = 344
    Top = 56
    object Extras1: TMenuItem
      Caption = 'Extras'
      object Datenimportierenexportieren2: TMenuItem
        Action = acDataTrans
      end
      object BenutzerEinstellungen2: TMenuItem
        Action = acUserSettings
      end
    end
  end
  ...
Du musst beim Scannen die Verschachtelung berücksichtigen.

Oder verstehe ich dich falsch?
  Mit Zitat antworten Zitat
Axti

Registriert seit: 13. Jun 2018
5 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 17:23
Nein du verstehst mich wohl richtig.

Was genau meinst du mit berücksichtigen der Verschachtelung? Kannst du mir ein Beispiel geben?
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#4

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 18:55
Naja, schau dir das DFM an. Du siehst, dass die eingerückten TMenuItems innerhalb eines anderen TMenuItems sind. Also verschachtelt. Das gibt deine Menüstruktur wieder.

Wie soll die Menüstruktur denn in der Datenbank abgelegt werden? Ein Parent würde sich anbieten, also der Name des übergeordneten Menüitems.
Dann hättest du in etwa so eine Tabelle:

- Formular
- Menüeintrag
- Action
- übergeordneter Menüeintrag

Am Beispiel:
frmUserMgmt, Extras1, null, null
frmUserMgmt, Datenimportierenexportieren2, acDataTrans, Extras1
frmUserMgmt, BenutzerEinstellungen2, acUserSettings, Extras1
etc
  Mit Zitat antworten Zitat
Axti

Registriert seit: 13. Jun 2018
5 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 20:10
Die Tabelle soll so aussehen:

Form | Action | Caption | Menüpfad
frmBsp| acBsp | DoStuff | Bearbeiten->BeispielMenü->BeispielKnopf

Den Pfad am Ende bekomme ich soweit raus, dass er mir bei nur 2 Menüpunkten(Bearbeiten->Beispiel) den richtigen Pfad zurückgibt.
Sobald aber das Menü 3 fach verschachtelt ist, nimmt er den 3 Punkt nicht(Bearbeiten->BeispielMenü->BeispielKnopf.

Die verschachtelung in Delphi wäre dann so:
Code:
object frmUserMgmt: TfrmUserMgmt
  ...
  Menu = mmMain
  ...
  object mmMain: TMainMenu
    Left = 344
    Top = 56
    object Extras1: TMenuItem
      Caption = 'Extras'
      object Datenimportierenexportieren2: TMenuItem
        Caption = 'Dateien Importieren/Exportieren'
        object DatenImportieren: TMenuItem
          Action = acImport
        object DatenExportieren: TMenuItem
         Action = acExport
      end
      object BenutzerEinstellungen2: TMenuItem
        Action = acUserSettings
      end
    end
  end
Um genau den Punkt, die dritte Verschachtelung, um den geht es mir. Wie ich von der zweiten Verschachtelung in die dritte übergehe und das speichern kann. In diesem Falle eben "DatenImportieren" bzw. "DatenExportieren". Da hakt es leider bei mir
Alexander
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 13. Jun 2018, 23:12
Zum Glück gibt es dafür ja mehr als genügend Möglichkeiten in Delphi, ohne groß Code schreiben zu müssen. Was wohl daran liegt, dass Delphi selbst ja in Delphi geschrieben ist und sowohl die ganze IDE, als auch die Forms zur Laufzeit direkt mit den DFM-Ressourcen arbeiten. Insofern ist das Lesen, Schreiben und sogar Anwenden und Generieren dieser ein Leichtes, wenn man sich ein wenig auskennt.

In deinem Fall dürfte TParser (was eigentlich TLexer heißen müsste) wohl die richtige Anlaufstelle sein.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#7

AW: Externes Programm zum durchsuchen von *.dfm Dateien und Speicherung von Actions

  Alt 14. Jun 2018, 08:30
Um genau den Punkt, die dritte Verschachtelung, um den geht es mir. Wie ich von der zweiten Verschachtelung in die dritte übergehe und das speichern kann. In diesem Falle eben "DatenImportieren" bzw. "DatenExportieren". Da hakt es leider bei mir
Arbeite das DFM zeilenweise ab und merke dir die Einrückung in einem Level.
Kommt ein object erhöhe den Level um 1.
Kommt ein end verringere den Level um 1
wenn der Level 0 wird speicher den Datensatz und leere den Menüpfad, sonst
hänge die Caption der zeile an den Menüpfad dran.

Da das eine Baumstruktur ist, kannst du auch mit Rekursionen arbeiten oder, wie Dennis07 schreibt, den Parser benutzen, was mE aber jetzt nicht dein Problem löst, sondern dir nur den Zugriff erleichtert.
  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 21:33 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