Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi uses in sehr vielen pas-Dateien anpassen (https://www.delphipraxis.net/150918-uses-sehr-vielen-pas-dateien-anpassen.html)

knochen 30. Apr 2010 11:26


uses in sehr vielen pas-Dateien anpassen
 
Hallo zusammen,

ich musste an unsrem sehr großen Projekt strukturelle Änderungen vornehmen. Dabei kommt es zu folgendem Szenario:

In einigen Tausend pas-Dateien wird eine Funktion aufgerufen, die sich in der Unit MeineNeueUnit.pas befindet, die gerade neu hinzugekommen ist. Die Funktionsaufrufe in den betroffenen Units sind alle vorhanden, aber die Unit MeineNeueUnit.pas steht noch nicht in deren uses-Klausel. Wie kann ich elegant und zeitsparend MeineNeueUnit.pas in alle Units einbinden, in denen besagte Funktion aufgerufen wird?

Nochmal kürzer formuliert: Ich habe in vielen Dateien Funktionsaufrufe, ohne dass die benötigte Unit bei uses eingebunden ist.
Wenn es zwei uses gibt, soll MeineNeueUnit.pas in der zweiten uses eingebunden werden.

Wer hilft?
Vielen Dank im Voraus.

Bernhard Geyer 30. Apr 2010 12:22

Re: uses in sehr vielen pas-Dateien anpassen
 
Einfach in der bisherigen Unit in der die alte Version der Funktion definiert ist die neue Version aufrufen und diese alte Methode dann als deprecated deklarieren.
Dann könnt ihr bei bedarf (unit wird eh gerade geändert) den Aufruf anpassen.

uligerhardt 30. Apr 2010 12:32

Re: uses in sehr vielen pas-Dateien anpassen
 
Schreibt euch ein kleines Tool, das nach dem Funktionsnamen grept, und dort, wo es fündig wird, die implementation-uses-Klausel anpasst - z.B. Unit in Stringlist laden, in selbiger nach Eintrag "implementation" suchen, dann ab dessen Index nach Eintrag "uses" suchen und dort Append("MeineNeueUnit,") aufrufen. Das ist natürlich nicht narrensicher, aber ist ne halbe Stunde Arbeit und könnte euch 99,9% der Arbeit abnehmen.

blackfin 30. Apr 2010 13:01

Re: uses in sehr vielen pas-Dateien anpassen
 
Die GExperts haben genau so ein GREP/Replace-Tool für Delphi-Projekte drin.

uligerhardt 30. Apr 2010 13:33

Re: uses in sehr vielen pas-Dateien anpassen
 
Zitat:

Zitat von blackfin
Die GExperts haben genau so ein GREP/Replace-Tool für Delphi-Projekte drin.

Du meinst, dass das kann, was der OP will? Das musst du mir zeigen. :-)

blackfin 30. Apr 2010 13:42

Re: uses in sehr vielen pas-Dateien anpassen
 
*hisst den weissen socken*

OK, ich geb dir recht, das Ding kann ja nur single line.....

alzaimar 30. Apr 2010 15:53

Re: uses in sehr vielen pas-Dateien anpassen
 
Delphi-Quellcode:
Procedure AddToUsesClause (aCode : TStrings; aUnitName : String);
Var
  CodeStr : String;
  upcCodeStr : String;
  p,q : Integer;

Begin
  CodeStr := aCode.Text;
  upcCodeStr := Uppercase(CodeStr);
  p := Pos ('IMPLEMENTATION',upcCodeStr);
  if p=0 then exit;
  q := PosEx('USES',upcCodeStr,p);
  if q=0 then
    Insert(#13#10+' uses '+aUnitName+';'+#13#10,CodeStr, p + 14)
  else
    Insert(' '+aUnitName+',',CodeStr, q + 4);
  aCode.Text := CodeStr;
End;

Procedure AddUnitIfRefExists (aPasFileName : String; aUnitName, aRefName : String);
Var
  code : TStringlist;

Begin
  code := TStringlist.Create;
  code.LoadFromfile (aPasFileName);
  Try
    if Pos (Uppercase(aRefName), Uppercase (code.Text))<>0 then
      AddToUsesClause(code, aUnitName);
  Finally
    code.Free;
  End
End;
(*
 Aufruf
   AddUnitIfRefExists ('MyPasFile.Pas','NewUnit','SomeFunctionCall');
*)
Sollte funktionieren. Fügt die Uses-Klausel aber auch dann ein, wenn 'SomeFunctionCall' in auskommentiertem Code steht. Einen Parser zu schreiben war mir grad zu umständlich. :mrgreen:

himitsu 30. Apr 2010 16:28

Re: uses in sehr vielen pas-Dateien anpassen
 
Wie fügt denn Delphi Units ein, wenn es das automatisch macht?
Das könnte man bestimmt anzapfen.

(Aber es wäre schon toll, wenn man bei der nächsten Compilerversion endlich mal Zugriff auf den Parser bekommen könnte.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz