Einzelnen Beitrag anzeigen

Axti

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

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

  Alt 14. Jun 2018, 14:16
Okay ich hab mir den Ratschlag zu herzen genommen und das ganze mal gebastelt. Ich gehe jede Zeile der *.dfm durch und isoliere den TMainMenu block. Dieser wird dann in einer StringList TempMenuData gespeichert. Diese Liste gehe ich von oben bis unten für jede Datei durch und speicher dann entsprechend den Pfad. Am Ende gehe ich die fertige Tabelle durch und hänge an der entsprechenden Stelle der Action den Pfad dran. Zumindest sollte es so sein. Leider macht er nicht genau das sondern speichert nur den zuerst gefundenen Menüpunkt. Alle darauffolgenden nicht mehr. In dem Falle nur "Datei" und alle seine Items. Der nächste Menüpunkt wäre Bearbeiten. Diesen Block speichert er schon nicht mehr ab.

Delphi-Quellcode:
    for linePath in TempMenuData do
    begin
      if (MenuLevel = 1)
        and (TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('object')
        and TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('TMenuItem'))
      then
      begin
        tempMenuTop := TempMenuData.Strings[TempMenuData.IndexOf(linePath)];
        tempMenuTop := tempMenuTop.Replace(' ', EmptyStr);
        tempMenuTop := tempMenuTop.Replace('object', EmptyStr);
        tempMenuTop := tempMenuTop.Replace(':TMenuItem', EmptyStr);

        MenuLevel := 2;
      end
      else if (MenuLevel = 2)
        and (TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('object')
        and TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('TMenuItem'))
      then
      begin
        tempPath := tempMenuTop + '->' + TempMenuData.Strings[TempMenuData.IndexOf(linePath)];
        tempPath := tempPath.Replace(' ', EmptyStr);
        tempPath := tempPath.Replace('object', EmptyStr);
        tempPath := tempPath.Replace(':TMenuItem', EmptyStr);

        if TempMenuData.Strings[TempMenuData.IndexOf(linePath)+1].Contains('Action') then
        begin
          tempMenuAction := TempMenuData.Strings[TempMenuData.IndexOf(linePath)+1];
          tempMenuAction := tempMenuAction.Replace('Action = ', '');
          tempMenuAction := tempMenuAction.Replace(' ', '');
        end;

        MenuLevel := 3;
      end
      else if (MenuLevel = 3)
        and (TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('object')

        and TempMenuData.Strings[TempMenuData.IndexOf(linePath)].Contains('TMenuItem'))
      then
      begin
        tempPath := tempPath + '->' + TempMenuData.Strings[TempMenuData.IndexOf(linePath)];
        tempPath := tempPath.Replace(' ', EmptyStr);
        tempPath := tempPath.Replace('object', EmptyStr);
        tempPath := tempPath.Replace(':TMenuItem', EmptyStr);

        if TempMenuData.Strings[TempMenuData.IndexOf(linePath)+1].Contains('Action') then
        begin
          tempMenuAction := TempMenuData.Strings[TempMenuData.IndexOf(linePath)+1];
          tempMenuAction := tempMenuAction.Replace('Action = ', '');
          tempMenuAction := tempMenuAction.Replace(' ', '');
        end;
      end;

      if not linePath.Contains('end') then
      begin
        for lineNewPath in FinishedTable do
        begin
          if FinishedTable[FinishedTable.IndexOf(lineNewPath)].Contains(tempMenuAction)
           and not FinishedTable[FinishedFile.IndexOf(lineNewPath)].Contains('Path')
          then
          begin
            FinishedTable.Strings[FinishedTable.IndexOf(lineNewPath)]
                := FinishedTable.Strings[FinishedTable.IndexOf(lineNewPath)] +
                   ' Path: ' + tempPath;
            break;
          end;
        end;
      end
      else if linePath.Contains('end') then
      begin
        MenuLevel := MenuLevel-1;
      end;

      if MenuLevel = 0 then
      begin
        tempPath := EmptyStr;
      end;

    end;
Alexander
  Mit Zitat antworten Zitat