Delphi как удалить удаленные свойства из dfm в exe - PullRequest
0 голосов
/ 19 июня 2020

У меня много dfms. Я использую команду удаления нежелательных свойств exe с этого сайта Delphi DFM properties remover , чтобы удалить удаленные свойства, которые больше не требуются. Следующий код работает нормально, за исключением некоторых свойств, например, если я хочу удалить свойство с именем Prop, тогда он удаляет другое свойство с именем SecondProp вместе с Prop. mPropList содержит каждое свойство в новой строке, например Prop1 Prop2 SecondProp Propn

Я сомневаюсь в следующем коде:

 if StrIPos(mPropList.Lines[K] + ' =', S) = 0 then
      begin
        LResult.Add(LSource[J]);
        continue;
      end;

Как пропустить SecondProp в таком случае?

Я пробовал это

if mPropList.Lines[K] = S then
      begin
        LResult.Add(LSource[J]);
        continue;
      end;

Чтобы соответствовать точным строкам, но это не сработало.

Это код кнопки удаления

procedure TfrmDeleteProp_MainForm.Button2Click(Sender: TObject);
var
      LFile, LSource, LResult: TStringList;
      I, J, K, Processed, WasError, Removed: Integer;
      SkipPropData: Boolean;
      FLOpt: TFileListOptions;
      S: String;
begin
      LFile := TStringList.Create;
      LSource := TStringList.Create;
      LResult := TStringList.Create;
  try
    if chbxSubFolders.Checked then
      FLOpt := [flFullNames, flRecursive]
    else
      FLOpt := [flFullNames];

    if not AdvBuildFileList(IncludeTrailingBackslash(edPath.Text) + '*.DFM', faAnyFile, LFile, FLOpt) then
    begin
      MessageBox(Handle,
        'Invalid path specified. Can not process.',
        'Warning',
        MB_OK or MB_ICONEXCLAMATION);
      exit;
    end;

    Processed := 0;
    WasError := 0;

    for I := 0 to LFile.Count - 1 do
    begin
      LSource.LoadFromFile(LFile[I]);
      Removed := 0;

      for K := 0 to mPropList.Lines.Count - 1 do
      begin
        if K > 0 then
          LSource.Assign(LResult);

        if Trim(mPropList.Lines[K]) = '' then
          continue;

        LResult.Clear;
        SkipPropData := False;

        for J := 0 to LSource.Count - 1 do
        begin
          S := Trim(LSource[J]);

          if SkipPropData then
          begin
            if (S > '') and (S[Length(S)] in [')', '}']) then
              SkipPropData := False;
            continue;
          end;

          if StrIPos(mPropList.Lines[K] + ' =', S) = 0 then
          begin
            LResult.Add(LSource[J]);
            continue;
          end;

          if (S > '') and (S[Length(S)] in ['(', '{']) then
            SkipPropData := True;

          Removed := Removed + 1;
        end;
      end;

      if Removed > 0 then
      begin
        if RenameFile(LFile[I], ChangeFileExt(LFile[I], '.BAK')) then
        begin
          LResult.SaveToFile(LFile[I]);
          Processed := Processed + 1;
        end else
        begin
          MessageBox(Handle,
            PChar('Can not create back up copy for file: ' + LFile[I] + #13#10'File is not processed.'),
            'Warning',
            MB_OK or MB_ICONEXCLAMATION);
          WasError := WasError + 1;
        end;
      end;
    end;

    MessageBox(Handle,
      PChar(Format('Total files found: %d'#13#10'Properties were removed from: %d'#13#10'Error files: %d',
        [LFile.Count, Processed, WasError])),
      'Statistics',
      MB_OK or MB_ICONINFORMATION);
  finally
    LFile.Free;
    LSource.Free;
    LResult.Free;
  end;
end;

1 Ответ

1 голос
/ 22 июня 2020

Мы установили, что:

  • Каждый ваш mPropList.Lines содержит что-то вроде Prop =[...] или SecondProp =[...], и имя свойства всегда начинается с строки.
  • LResult содержит линии, которые следует сохранить. Итак, вы не хотите добавлять к этому, если строки совпадают, но вы делаете , если они не .

Собирая их вместе, вы хотите сделать LResult.Add(), только если StrIPos(...) <> 1. Таким образом, вы добавляете

  • строк, которые не содержат имени свойства (StrIPos() == 0, т.е. < 1), и
  • строк, которые содержат его как подстроку, но не в начало, т.е. только в пределах другого имени свойства (StrIPos > 1).

Таким образом, фиксированный код будет выглядеть так:

if StrIPos(mPropList.Lines[K] + ' =', S) <> 1 then
  begin
    LResult.Add(LSource[J]);
    continue;
  end;
...