Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Suchen und ersetzen (https://www.delphipraxis.net/189634-suchen-und-ersetzen.html)

Amateurprofi 2. Jul 2016 06:23

Suchen und ersetzen
 
Mit Strg-R kann man einen Text suchen und durch einen anderen Text ersetzen, mit der Option alle Vorkommen des Textes innerhalb einer Unit zu ändern.
Gibt es eine Möglichkeit diese Option dahingehend zu erweitern, dass alle Vorkommen des Textes in allen "eigenen" Units eines Projektes geändert werden?

mm1256 2. Jul 2016 08:41

AW: Suchen und ersetzen
 
Hallo Klaus,

in diesem Fall gehe ich immer den Umweg über "in allen geöffneten Dateien". Ist etwas umständlich aber wenigstens eine Möglichkeit. Schön wäre mal eine Liste der im Projekt enthaltenen Units in einer CheckListBox :thumb:

Uwe Raabe 2. Jul 2016 09:33

AW: Suchen und ersetzen
 
Zitat:

Zitat von mm1256 (Beitrag 1341795)
in diesem Fall gehe ich immer den Umweg über "in allen geöffneten Dateien".

Wo findest du denn diese Option in einem Standard-Delphi? Oder wird das durch eine IDE-Erweiterung bereitgestellt?

Aviator 2. Jul 2016 09:52

AW: Suchen und ersetzen
 
Also das könnte man bedingt auch durch Refactoring lösen. Wenn es z.B. nur um das Umbenennen einer Variable geht.

nahpets 2. Jul 2016 10:49

AW: Suchen und ersetzen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1341796)
Zitat:

Zitat von mm1256 (Beitrag 1341795)
in diesem Fall gehe ich immer den Umweg über "in allen geöffneten Dateien".

Wo findest du denn diese Option in einem Standard-Delphi? Oder wird das durch eine IDE-Erweiterung bereitgestellt?

Unter Delphi 7:

Menü: Suchen
Untermenü: In Dateien suchen

Dort kann man rechts (per Groupbox) auswählen zwischen:
In allen Dateien des Projektes
In allen geöffneten Dateien
In Verzeichnissen

Gibt's das in neueren Delphis nicht mehr?

Amateurprofi 2. Jul 2016 13:26

AW: Suchen und ersetzen
 
Zitat:

Zitat von mm1256 (Beitrag 1341795)
Hallo Klaus,

in diesem Fall gehe ich immer den Umweg über "in allen geöffneten Dateien". Ist etwas umständlich aber wenigstens eine Möglichkeit. Schön wäre mal eine Liste der im Projekt enthaltenen Units in einer CheckListBox :thumb:

Diese Möglichkeit gibt es zwar beim Suchen, nicht aber beim Ersetzen.

mm1256 2. Jul 2016 13:41

AW: Suchen und ersetzen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1341805)
Diese Möglichkeit gibt es zwar beim Suchen, nicht aber beim Ersetzen.

Zum ersten Fenster gehen => 1x Suchen/Ersetzen => [Strg]+[Tab] => [Strg]+[R] => [Strg]+[Tab] => [Strg]+[R] . . .

Amateurprofi 2. Jul 2016 13:53

AW: Suchen und ersetzen
 
Zitat:

Zitat von Aviator (Beitrag 1341798)
Also das könnte man bedingt auch durch Refactoring lösen. Wenn es z.B. nur um das Umbenennen einer Variable geht.

Danke, löst aber nicht mein Problem, weil nur die Stellen umbenannt werden, die die auf diese eine Variable beziehen.
Zum Beispiel gleichnamige lokale Variablen in anderen Prozeduren werden nicht umbenannt.

Mein Problem:
Früher habe ich alle Variablennamen konsequent klein geschrieben, Namen von Funktionen mit gro0em Anfangsbuchstaben.
Der Grund war, dass ich meinte, mein Code wäre für mich so besser lesbar.
Wenn ich in die Delphi-SourceCodes schaute und dort meistens groß geschriebene Variablennamen fand, dann war das für mich "Augenpulver".
Seit einigen Monaten ist es umgekehrt.
Variablennamen in Kleinschrift verwirren mich.
Wenn ich nun ein älteres Projekt hervorkrame und etwas aufpeppe, dann sind die Texte wegen der Kleinschreibung von Variablennamen für mich schwer lesbar.
Also benenne ich die um, was aber nur Groß-/Kleinschreibung betrifft.
Mit "Suchen und ersetzen" und "Alles ersetzen" und dann mit F3 in den anderen Units benenne ich die dann um.
Das geht zwar, wird aber auf Dauer doch etwas lästig.

Amateurprofi 2. Jul 2016 14:01

AW: Suchen und ersetzen
 
Zitat:

Zitat von mm1256 (Beitrag 1341808)
Zitat:

Zitat von Amateurprofi (Beitrag 1341805)
Diese Möglichkeit gibt es zwar beim Suchen, nicht aber beim Ersetzen.

Zum ersten Fenster gehen => 1x Suchen/Ersetzen => [Strg]+[Tab] => [Strg]+[R] => [Strg]+[Tab] => [Strg]+[R] . . .

Nee, so geht das nicht.
Wenn ich mit Strg-Tab in eine andere Unit gehe und dort Strg-R drücke, dann steht im Suchen/Ersetzen Dialog als zu suchender Text, der Text an der Cursor-Position.
Also:
In der ersten Unit Suchen und Ersetzen.
Dann in die nächste Unit gehen und dort Strg-Pos1, gefolgt von F3.

Aber genau diese ganze Arbeit will ich mir ja durch eine Projektweite Umbenennung sparen.

mm1256 2. Jul 2016 14:59

AW: Suchen und ersetzen
 
Hallo Klaus,

sorry, mein Fehler, falsche Taste: nicht [Strg]+[R] sondern [Strg]+[L]. Aber, du hast ja Recht, es ist umständlich :oops:

Uwe Raabe 2. Jul 2016 15:23

AW: Suchen und ersetzen
 
Eigentlich ist das keine schlechte Idee. Im Moment erledige ich solche Dinge immer mit UltraEdit, wobei ich dann vorher alle betroffenen Dateien selektiere und in UltraEdit öffne. Wäre schon recht praktisch, wenn das direkt in der IDE ginge.

Benedikt Magnus 2. Jul 2016 18:48

AW: Suchen und ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Weil mich das Thema interessierte und ich es auch ab und an mal brauche, habe ich gerade einfach mal ein entsprechendes Tool geschrieben. Habs getestet und es funktioniert prima.
Für diejenigen, die es ebenfalls verwenden möchten, habe ich es hochgeladen (im Anhang). Es lässt sich wie folgt ganz einfach in die IDE integrieren:
Unter "Tools->Tools konfigurieren" ein neues Tool hinzufügen und die Exe unter "Programm" einfügen (das Arbeitsverzeichnis ist dabei egal). Als Parameter den Wert "$PROJECT" angeben. Nun kann man, wenn ein Projekt geöffnet wurde, unter "Tools->DeinTitel" das Programm starten. Das aktuelle Projekt wird dabei automatisch übergeben, die .dpr nach eigenen Units (anhand der Endung .pas) durchsucht und alles aufgelistet (es lassen sich dann händisch weitere Units hinzufügen oder entfernen). Anschließend gibt man nurnoch ein, was wie ersetzt werden soll, klickt auf "Durchführen" und alles ist fertig.

Uwe Raabe 2. Jul 2016 19:10

AW: Suchen und ersetzen
 
Zitat:

Zitat von Benedikt Magnus (Beitrag 1341821)
Weil mich das Thema interessierte und ich es auch ab und an mal brauche, habe ich gerade einfach mal ein entsprechendes Tool geschrieben. Habs getestet und es funktioniert prima.

Wie berücksichtigt das Tool denn die aktuell im Editor geöffneten und eventuell gegenüber der Version auf Platte geänderten Dateien?

Benedikt Magnus 2. Jul 2016 21:01

AW: Suchen und ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe
Wie berücksichtigt das Tool denn die aktuell im Editor geöffneten und eventuell gegenüber der Version auf Platte geänderten Dateien?

Gar nicht. Daran habe ich gar nicht gedacht. Man sollte also vorher alles speichern.

EDIT:

Hier mal der Quelltext, ist ja nicht viel. Wer will, kann ihn ruhig verbessern:

Delphi-Quellcode:
unit Unit_Haupt;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm_GUI = class(TForm)
    Edit_Suchen: TLabeledEdit;
    Edit_Ersetzen: TLabeledEdit;
    Label_Überschrift: TLabel;
    ListBox_Dateien: TListBox;
    Button_Starten: TButton;
    Button_Hinzufügen: TButton;
    Button_Löschen: TButton;
    OpenDialog: TOpenDialog;
    Label_Verarbeite: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button_HinzufügenClick(Sender: TObject);
    procedure ListBox_DateienDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure Button_LöschenClick(Sender: TObject);
    procedure Button_StartenClick(Sender: TObject);
  private
    { Private-Deklarationen }
    flbHorzScrollWidth: Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form_GUI: TForm_GUI;
  Projektpfad: String;

const
  Pfadkürzel = '$PROJECT';

implementation

{$R *.dfm}

////////////////////
//Initialisierung://
////////////////////

procedure TForm_GUI.FormCreate(Sender: TObject);
var
  Datei: String;
  Inhalt: TStringList;
  Stelle, i: Integer;
begin
  if ParamCount > 0 then
  begin
    Datei := ParamStr(1);
    if ExtractFileExt(Datei) = '.dproj' then Delete(Datei, Length(Datei) -1, 2); //Lösche "oj" aus "dproj", um "dpr" zu erhalten.
    if ExtractFileExt(Datei) = '.dpr' then //Wenn nicht .dpr, dann verwerfen.
    begin
      Inhalt := TStringList.Create;
      try
        Inhalt.LoadFromFile(Datei);
        Stelle := Pos('.pas', Inhalt.Text);
        while Stelle > 0 do
        begin
          for i := Stelle -2 downto 1 do //#39 = '
            if Inhalt.Text[i] = #39 then
            begin
              ListBox_Dateien.Items.Add(Pfadkürzel + '\' + Copy(Inhalt.Text, i +1, Stelle + 3 - i)); //Pfade mit Pfadkürzel abkürzen.
              Break;
            end;
          Stelle := Pos('.pas', Inhalt.Text, Stelle +1);
        end;
      finally
        Inhalt.Free;
      end;
    end;
    Projektpfad := ExtractFilePath(Datei);
  end;
end;

////////////
//Buttons://
////////////

procedure TForm_GUI.Button_HinzufügenClick(Sender: TObject);
var
  i: Integer;
begin
  if OpenDialog.Execute then
  begin
    if Projektpfad = '' then ListBox_Dateien.Items.AddStrings(OpenDialog.Files)
    else
      for i := 0 to OpenDialog.Files.Count -1 do
        ListBox_Dateien.Items.Add(StringReplace(OpenDialog.Files[i], Projektpfad, Pfadkürzel, []));
      //Wenn sich die Datei unterhalb des Projektverzeichnisses befindet, wird dieses verkürzt dargestellt.
  end;
end;

procedure TForm_GUI.Button_LöschenClick(Sender: TObject);
begin
  Listbox_Dateien.DeleteSelected;
end;

procedure TForm_GUI.Button_StartenClick(Sender: TObject);
var
  i: Integer;
  Inhalt: TStringList;
  Datei: String;
begin
  Label_Verarbeite.Visible := true;
  Application.ProcessMessages;

  Inhalt := TStringList.Create;
  try
    for i := 0 to ListBox_Dateien.Items.Count -1 do
    begin
      Datei := StringReplace(ListBox_Dateien.Items[i], Pfadkürzel, Projektpfad, []); //Pfadkürzel durch richtigen Pfad ersetzen.
      Inhalt.LoadFromFile(Datei);
      Inhalt.Text := StringReplace(Inhalt.Text, Edit_Suchen.Text, Edit_Ersetzen.Text, [rfReplaceAll]);
      Inhalt.SaveToFile(Datei);
    end;
  finally
    Inhalt.Free;
  end;

  Label_Verarbeite.Visible := false;
  Application.ProcessMessages;

  ShowMessage('Alles ersetzt!');
end;

//////////////
//Sonstiges://
//////////////

//Für die horizontale Scrollbox:
procedure TForm_GUI.ListBox_DateienDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
 Len: Integer;
 NewText: String;
begin
  NewText := Listbox_Dateien.Items[Index];

  with Listbox_Dateien.Canvas do
  begin
    FillRect(Rect);
    TextOut(Rect.Left +1, Rect.Top, NewText);
    Len := TextWidth(NewText) + Rect.Left + 10;
    if Len > flbHorzScrollWidth then
    begin
      flbHorzScrollWidth := Len;
      Listbox_Dateien.Perform(LB_SETHORIZONTALEXTENT, flbHorzScrollWidth, 0);
    end;
  end;
end;

end.

Amateurprofi 2. Jul 2016 23:25

AW: Suchen und ersetzen
 
Hab ich mal probiert, funktioniert bei mir leider nicht.

Scenario:
Im Editor bin ich in der .dproj Datei.
Mit Menu > Tools > Projektweites Ersetzen wird das Programm ProjektweiteErsetzung.exe aufgerufen.
Jetzt sollten in der Dateien Liste alle .pas Dateien des Projektes aufgelistet werden.
Die Liste bleibt aber leer.

Nun ja, das Prinzip habe ich verstanden.
Wenn ich mal die nötige Zeit habe werde ich versuchen, das zum laufen zu kriegen.

Danke, Benedikt, für die Arbeit die du dir gemacht hast.

Benedikt Magnus 3. Jul 2016 07:28

AW: Suchen und ersetzen
 
Wenn du mal manuell in die .dpr reinsiehst, sind dort dann die .pas aufgelistet?
Die .dpr findet er wohl, sonst gäbe es eine Fehlermeldung. Dann könnte ich mir nur noch vorstellen, dass das Projekt nicht übergeben wird. Hast du den Parameter gesetzt und findest du ihn unter Makros (wenn man ein neues Tool erstellt) wieder? Ich kann leider nicht sagen, ob XE2 das unterstützt, habe hier nur XE5.

Amateurprofi 3. Jul 2016 13:13

AW: Suchen und ersetzen
 
Zitat:

Zitat von Benedikt Magnus (Beitrag 1341828)
Wenn du mal manuell in die .dpr reinsiehst, sind dort dann die .pas aufgelistet?
Die .dpr findet er wohl, sonst gäbe es eine Fehlermeldung. Dann könnte ich mir nur noch vorstellen, dass das Projekt nicht übergeben wird. Hast du den Parameter gesetzt und findest du ihn unter Makros (wenn man ein neues Tool erstellt) wieder? Ich kann leider nicht sagen, ob XE2 das unterstützt, habe hier nur XE5.

Ja.

War mein Fehler.
Ich habe nicht $Project als Parameter mitgegeben.
Du hattest das in deiner "Gebrauchsanleitung" erwähnt.
Tja, wer lesen kann und das auch tut, ist klar im Vorteil.

Benedikt Magnus 4. Jul 2016 15:01

AW: Suchen und ersetzen
 
Freut mich, dass es nun funktioniert und ich dir helfen konnte.

Benedikt Magnus 5. Jul 2016 13:17

AW: Suchen und ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich wurde darauf angesprochen, dass dem Programm die Funktion, nur ganze Wörter zu ersetzen, fehle. Das habe ich nun ergänzt.
Im Anhang findet sich das Programm samt Quelltext. Was haltet ihr davon?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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