![]() |
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? |
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: |
AW: Suchen und ersetzen
Zitat:
|
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.
|
AW: Suchen und ersetzen
Zitat:
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? |
AW: Suchen und ersetzen
Zitat:
|
AW: Suchen und ersetzen
Zitat:
|
AW: Suchen und ersetzen
Zitat:
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. |
AW: Suchen und ersetzen
Zitat:
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. |
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: |
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.
|
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. |
AW: Suchen und ersetzen
Zitat:
|
AW: Suchen und ersetzen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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. |
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. |
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. |
AW: Suchen und ersetzen
Zitat:
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. |
AW: Suchen und ersetzen
Freut mich, dass es nun funktioniert und ich dir helfen konnte.
|
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