AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte UnitOptimizer
Thema durchsuchen
Ansicht
Themen-Optionen

UnitOptimizer

Ein Thema von stahli · begonnen am 25. Mai 2018 · letzter Beitrag vom 31. Okt 2021
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.639 Beiträge
 
Delphi 12 Athens
 
#1

AW: UnitOptimizer

  Alt 6. Sep 2018, 09:01
Gibt es in einem der beiden Programmen die Funktionalität, das "für alle Dateien des Projektes" oder "für ein Verzeichnis" oder "für eine Liste von Dateien" gleichzeitig aufzurufen?
Es gibt eine Kommandozeilenversion, mit der das alles angefangen hat. Die ist eigentlich nicht für die Veröffentlichung aufbereitet und einiges ist da sicher noch verbesserungsfähig. Also alles ohne Gewähr.

Die Konfigurationsdatei solltest du auf dein Projekt anpassen (insbesondere den Suchpfad und die GroupNames) und mit dem -c Parameter auf der Kommandozeile übergeben. Das könnte dann in etwa so aussehen:
Code:
UsesCleaner -c:"c:\MyProjectPath\UsesCleaner.cfg" "c:\MyProjectPath\*.pas"
Es können auch mehrere Wildcard-Ausdrücke angegeben werden und wenn du noch einen Parameter -s spendierst, werden auch Unterverzeichnisse durchsucht.
Angehängte Dateien
Dateityp: zip UsesCleaner.zip (409,5 KB, 18x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
raller09

Registriert seit: 7. Nov 2005
38 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: UnitOptimizer

  Alt 6. Sep 2018, 11:47
Moin,

vielen Dank für die Rückmeldung.


Für GExperts will ich das gerade nicht implementieren, da die Gefahr, sich dabei das komplette Projekt zu zerschießen ziemlich hoch ist.
Du kannst das aber gerne selbst tun, der Source ist ja verfügbar.
wollte ich im ersten Schritt vermeiden, aber kann ich mir ggf. ansehen.

Die angesprochen Probleme habe ich gerade auch mit der Sortierung der uses + der Funktion von Herrn Raabe aus MMX schon festgestellt:

Die dort eingestellte Sortierungs-Reihenfolge der Uses sorgt z.B. für einen Parameter-Fehler in "DeleteFile", da "PWideChar <> TFileName"

Ich hatte implizit System.SysUtils.DeleteFile genutzt, welches durch die geänderte Uses zu "Winapi.Windows.DeleteFile" wurde...

Wie war noch mal die Reihenfolge bei gleichen Funktions/Prozedur-Namen in verschiedenen Units. Ich meine Uses von unten nach oben, korrekt?


In welcher Reihenfolge werden die Namespaces Aufgelöst? Ich würde von links nach rechts tippen, ist das korrekt?

Es gibt eine Kommandozeilenversion, mit der das alles angefangen hat. Die ist eigentlich nicht für die Veröffentlichung aufbereitet und einiges ist da sicher noch verbesserungsfähig. Also alles ohne Gewähr.
Vielen Dank für das Tool, damit teste ich mal. Ich werde die Sortier-Reihenfolge + Gültigkeitsbereichsnamen gleich meiner Projekt-Einstellung setzen.

Ich werde mir das bis zum Wochenende mal mit unserem Programm angesehen haben + gebe dann eine Rückmeldung.


Danke,
  Mit Zitat antworten Zitat
raller09

Registriert seit: 7. Nov 2005
38 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: UnitOptimizer

  Alt 11. Sep 2018, 14:22
So, hab jetzt mal das Haupt-Verzeichnis der Units mit dem Tool von Herrn Raabe bearbeitet (350 Units).

"UnitScopeNames" so eingestellt wie im Projekt, "GroupNames=" (leer).

Dadurch wird nicht sortiert sondern nur entsprechend erweitert.
Ich musste noch an ein paar Stellen den fehlenden Scope vor einzelnen Funktions-Aufrufen erweitern...


Sieht soweit gut aus aber kompiliert leider auch nicht schneller (Erzeugen ohne IDEFixPack ca. 15 Min, mit ca. 3 Min.).
Lasse es aber trotzdem so. vielleicht bemerke ich noch Vorteile an anderer Stelle...


Danke
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: UnitOptimizer

  Alt 29. Okt 2018, 22:15
Ich habe jetzt die Formatierung angefangen.
Aktuell sehen die uses- und const-Abschnitte schon ganz gut aus.

Es werden bestimmte Regeln zu den Einrückungen und Leerzeichen um bestimmte Zeichen eingehalten.

Die Einrückungen können auch bestimmte Inhalte (z.B. '=' oder später 'read' und 'write' von Properties) untereinander ausrichten.
Leerzeilen dienen dabei als Trennzeilen für einzelne Blöcke.

Umgebrochene lange Zeilen können ebenfalls an bestimmten Textmarken ausgerichtet werden.

Es gibt natürlich extrem viele Möglichkeiten, die da relevant werden können. Sicherlich hat da jeder Entwickler auch eigene Wünsche und Vorstellungen.
Mal sehen, wie weit ich damit komme.

Es ist auf jeden Fall eine ziemlich komplexe Angelegenheit. :-/


Was mir besonderes Kopfzerbrechen macht, ist der Umgang mit Zeilenumbrüchen und Kommentartexten.
Ich kann leider nicht unterscheiden, ob ein Zeilenumbruch durch einen Entwickler eingefügt wurde oder durch eine frühere Formatierung.
Entsprechend weiß ich bei einer Neuformatierung nicht, ob ein Zeilenumbruch bestehen bleiben soll oder ob der nach einer Codeänderung neu berechnet werden muss.
Workarounds, die mir da einfallen, sind nicht wirklich tauglich oder zumindest im Codeeditor störend.
Weiß jemand, ob der Codeeditor sowas wie weiche Umbrüche unterstützt (Shift+Enter)? Ich habe leider noch nichts gefunden.

Bei Kommentaren werde ich unterscheiden zwischen "Auskommentierungen" und "echtem Kommentar". "Auskommentierungen" werden auf Wunsch wie Quelltext formatiert, was die Einrückungen, Umbrüche und Space-Korrekturen betrifft. Die Codezeilen werden dann zwischen begin-end usw. entsprechend eingerückt.
Echter Kommentar wird im Block wie gehabt linksbündig ausgerichtet und kann beliebige Leerzeichen enthalten.
(Für den Compiler bleibt natürlich alles normaler Kommentar.)


Anbei mal zwei Darstellungen eines Beispielcodes, unformatiert und formatiert.
Da das hier in der DP nur näherungsweise darstellbar ist, auch mal noch zwei entsprechende Screenshots.


VORHER:
Code:
unit uInterfaces;

interface

uses
  System.Classes,Generics.Collections        ,System.Generics.Collections  ,   Vcl.Graphics;

const
  sid_UnitFile = '{3D27E420-B68B-423D-8F4A-BF9179A14BF3}';
sid_Parser='{683E78A3-A24F-4841-81B2-459EC0A9A20F}';

  sid_ResultText = '{23B6DE22-7C2C-4F6C-BB49-F6BD5FCF9A56}'  ;
  sid_PosMarker = '{7F1F73C8-722E-4D87-A367-D06EFFA1D81E}'   ;
  sid_Word = '{CF738D99-C813-471B-9810-DD8BE204F007}'        ;
  sid_Words = '{A5461E5E-67A7-42EC-B918-23828C749DAA}'       ;

  sid_LB = '{3765F016-9575-4916-BDC4-CF0700462E0D}'          ;
  sid_Apostroph = '{904BD8A1-2149-4679-B80D-FC89CDFB31D7}';
  sid_Comment = '{AF8075A3-3C80-40DE-8963-53FC9A791B1D}';
  sid_CommentParenthesisStars = '{B0D4E9FB-BBF3-4C13-889F-21A54E54D70F}';
  sid_CommentCurlyBraces = '{2D28310E-F09F-4016-9D35-84DE5352F18A}';
  sid_CommentDoubleSlashes = '{C983F5E9-F68A-46D4-9895-AF68A38A0B04}';
  sid_CommentHK = '{FD36117E-5E4F-4D13-8D33-5407259F61A0}';
  sid_Attribute = '{2D28DE78-CD7A-4164-915D-BE4A228DFEAD}';
  sid_Type = '{40D018C6-55EC-4040-804C-5F45AEB77382}';
  sid_FoundMember = '{6E68F02E-2FB5-4FE2-BD53-1E8E5CFE3DF8}';
  sid_Unit = '{E7E7399C-AA72-472C-BD51-0EB6298FCB9B}';
  sid_UnitInterface = '{42207023-90C8-4D10-9066-F51221D8C53D}';
  sid_UnitImplementation = '{546D8E44-433C-46BF-96AB-3E6BDE4D4F09}';
  sid_UnitUses = '{AF8CD130-CB09-4D7D-AD26-FE2C636F9DBD}';
  sid_UnitUse = '{48EC2F39-887A-4AC5-893E-02B4B385B18F}';
  sid_UnitConst = '{64264236-FCAA-4765-896E-941DE00B8A59}';
  sid_UnitType = '{66906CF4-9489-4AD9-8246-FC2F010DAF4B}';
  sid_UnitInitialization = '{72DF6782-D73C-4353-8177-66BE26E3527E}';
  sid_UnitFinalization = '{CF5EAA57-9946-4875-91A6-75985DAFA2EB}';
  sid_ParamPart = '{8A3310C3-2126-4E85-8451-B2383FFF7D93}';
  sid_Params = '{04D95874-A9D6-475E-B9EA-CF2806108E29}';
  sid_Index = '{AFCF6127-F72A-472B-A963-25B3F3CCB365}';
  sid_Bases = '{FF65E2E6-BA17-444A-8F16-040EFD73B2B0}';
  sid_InterfaceClassDeclaration = '{604DD7AF-9699-4DF6-B333-EE49ACE67DB5}';
  sid_InterfaceDeclaration = '{2B986919-AF9E-4673-845B-001EBFD17E91}';
  sid_ClassDeclaration = '{61B14F2F-8B38-4995-A0A4-DDE4D70254D4}';
  sid_ClassSection = '{87176506-56B6-426F-BFCC-6DA956AB5560}';
  sid_Getter = '{15E251BF-A12A-480B-A512-07A7CA9B056D}';
  sid_Setter = '{E319417C-8AF6-4558-81DD-7F2970380C8E}';
  sid_ConstructorDeclaration = '{3CA6DA10-29B3-4393-AE41-FF8C7484232A}';
  sid_DestructorDeclaration = '{C1981961-EED7-45C4-9BBA-6F7E51597892}';
  sid_ProcedureDeclaration = '{C4DD75FD-138D-45D7-9C01-0928747CAFB9}';
  sid_FunctionDeclaration = '{D8F6BC30-5D06-4482-8C83-07ABC6EDD4F4}';
  sid_PropertyDeclaration = '{0294DE48-6390-4DE7-A4CD-EE17F62DA292}';
  sid_PropDeclaration = '{831497FE-1FA7-4418-B019-A505906D00E3}';
  sid_PropSig = '{919A50FC-A5A1-4464-98A3-D15F9778AD75}';
  sid_FieldDeclaration = '{6C62B581-CFAD-42CD-843D-6F9051BD16D7}';

  sid_ClassHeader = '{ADC0E9DF-803C-41AE-8CA4-1E2473144525}';
  sid_ClassConstructor = '{AAA34D34-E4DB-4BD1-A5C8-F27CDAF68E31}';
  sid_ClassDestructor = '{263AE578-4E0B-4093-9FC0-7264F619A98D}';
  sid_ClassProcedure = '{8D8585FA-B120-476B-B84B-46D29E2F8E4E}';
  sid_ClassFunction = '{F8A6A860-9B8E-4051-A533-D22ACDFAA510}';

TEST_Integer=1+2+3+4+5+6+7+8+9+11+2+3+4+5+6+7+888+9+1+2+3+44+5+6+7+8+9+1111+2+3+4+5+6+7+8+9+1+2+3+4+5+666+7+8+99999999999999999+11111+2+3+4+5+6+7+8+99+1+2+3+4+5+6+7+8+9+111+2+3+4+5+66+7+8+999;
Test_String='Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test '+'Test';
NACHHER:
Code:
unit uInterfaces;

interface

uses
  System.Classes, Generics.Collections, System.Generics.Collections, Vcl.Graphics;

const
  sid_UnitFile = '{3D27E420-B68B-423D-8F4A-BF9179A14BF3}';
  sid_Parser  = '{683E78A3-A24F-4841-81B2-459EC0A9A20F}';

  sid_ResultText = '{23B6DE22-7C2C-4F6C-BB49-F6BD5FCF9A56}';
  sid_PosMarker = '{7F1F73C8-722E-4D87-A367-D06EFFA1D81E}';
  sid_Word      = '{CF738D99-C813-471B-9810-DD8BE204F007}';
  sid_Words     = '{A5461E5E-67A7-42EC-B918-23828C749DAA}';

  sid_LB                       = '{3765F016-9575-4916-BDC4-CF0700462E0D}';
  sid_Apostroph                = '{904BD8A1-2149-4679-B80D-FC89CDFB31D7}';
  sid_Comment                  = '{AF8075A3-3C80-40DE-8963-53FC9A791B1D}';
  sid_CommentParenthesisStars  = '{B0D4E9FB-BBF3-4C13-889F-21A54E54D70F}';
  sid_CommentCurlyBraces       = '{2D28310E-F09F-4016-9D35-84DE5352F18A}';
  sid_CommentDoubleSlashes     = '{C983F5E9-F68A-46D4-9895-AF68A38A0B04}';
  sid_CommentHK                = '{FD36117E-5E4F-4D13-8D33-5407259F61A0}';
  sid_Attribute                = '{2D28DE78-CD7A-4164-915D-BE4A228DFEAD}';
  sid_Type                     = '{40D018C6-55EC-4040-804C-5F45AEB77382}';
  sid_FoundMember              = '{6E68F02E-2FB5-4FE2-BD53-1E8E5CFE3DF8}';
  sid_Unit                     = '{E7E7399C-AA72-472C-BD51-0EB6298FCB9B}';
  sid_UnitInterface            = '{42207023-90C8-4D10-9066-F51221D8C53D}';
  sid_UnitImplementation       = '{546D8E44-433C-46BF-96AB-3E6BDE4D4F09}';
  sid_UnitUses                 = '{AF8CD130-CB09-4D7D-AD26-FE2C636F9DBD}';
  sid_UnitUse                  = '{48EC2F39-887A-4AC5-893E-02B4B385B18F}';
  sid_UnitConst                = '{64264236-FCAA-4765-896E-941DE00B8A59}';
  sid_UnitType                 = '{66906CF4-9489-4AD9-8246-FC2F010DAF4B}';
  sid_UnitInitialization       = '{72DF6782-D73C-4353-8177-66BE26E3527E}';
  sid_UnitFinalization         = '{CF5EAA57-9946-4875-91A6-75985DAFA2EB}';
  sid_ParamPart                = '{8A3310C3-2126-4E85-8451-B2383FFF7D93}';
  sid_Params                   = '{04D95874-A9D6-475E-B9EA-CF2806108E29}';
  sid_Index                    = '{AFCF6127-F72A-472B-A963-25B3F3CCB365}';
  sid_Bases                    = '{FF65E2E6-BA17-444A-8F16-040EFD73B2B0}';
  sid_InterfaceClassDeclaration = '{604DD7AF-9699-4DF6-B333-EE49ACE67DB5}';
  sid_InterfaceDeclaration     = '{2B986919-AF9E-4673-845B-001EBFD17E91}';
  sid_ClassDeclaration         = '{61B14F2F-8B38-4995-A0A4-DDE4D70254D4}';
  sid_ClassSection             = '{87176506-56B6-426F-BFCC-6DA956AB5560}';
  sid_Getter                   = '{15E251BF-A12A-480B-A512-07A7CA9B056D}';
  sid_Setter                   = '{E319417C-8AF6-4558-81DD-7F2970380C8E}';
  sid_ConstructorDeclaration   = '{3CA6DA10-29B3-4393-AE41-FF8C7484232A}';
  sid_DestructorDeclaration    = '{C1981961-EED7-45C4-9BBA-6F7E51597892}';
  sid_ProcedureDeclaration     = '{C4DD75FD-138D-45D7-9C01-0928747CAFB9}';
  sid_FunctionDeclaration      = '{D8F6BC30-5D06-4482-8C83-07ABC6EDD4F4}';
  sid_PropertyDeclaration      = '{0294DE48-6390-4DE7-A4CD-EE17F62DA292}';
  sid_PropDeclaration          = '{831497FE-1FA7-4418-B019-A505906D00E3}';
  sid_PropSig                  = '{919A50FC-A5A1-4464-98A3-D15F9778AD75}';
  sid_FieldDeclaration         = '{6C62B581-CFAD-42CD-843D-6F9051BD16D7}';

  sid_ClassHeader     = '{ADC0E9DF-803C-41AE-8CA4-1E2473144525}';
  sid_ClassConstructor = '{AAA34D34-E4DB-4BD1-A5C8-F27CDAF68E31}';
  sid_ClassDestructor = '{263AE578-4E0B-4093-9FC0-7264F619A98D}';
  sid_ClassProcedure  = '{8D8585FA-B120-476B-B84B-46D29E2F8E4E}';
  sid_ClassFunction   = '{F8A6A860-9B8E-4051-A533-D22ACDFAA510}';

  TEST_Integer = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 11 + 2 + 3 + 4 + 5 + 6 + 7 + 888 + 9 + 1 + 2 + 3 + 44 + 5 + 6 + 7 +
                 8 + 9 + 1111 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 2 + 3 + 4 + 5 + 666 + 7 + 8 + 99999999999999999 +
                 11111 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 99 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 111 + 2 + 3 + 4 + 5 + 66 +
                 7 + 8 + 999;
  Test_String = 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' +
                 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test ' + 'Test';
Miniaturansicht angehängter Grafiken
f1.jpg   f2.jpg  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (30. Okt 2018 um 10:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: UnitOptimizer

  Alt 30. Okt 2018, 06:06
Sieht gut aus und gefällt mir.
Vor allem die Sortierung der sid_

Das jedoch fällt etwas aus dem Rahmen "sid_InterfaceClassDeclaration"
Es ist der längste string sollten dann nicht die anderen alle noch um 1 aufrücken?

Das scheint bei allen längsten srings zu sein.

gruss

Geändert von EWeiss (30. Okt 2018 um 06:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: UnitOptimizer

  Alt 30. Okt 2018, 07:56
Das jedoch fällt etwas aus dem Rahmen "sid_InterfaceClassDeclaration"
Es ist der längste string sollten dann nicht die anderen alle noch um 1 aufrücken?
Da das hier in der DP nur näherungsweise darstellbar ist, auch mal noch zwei entsprechende Screenshots.
Aufm Bild passt alles und ich kann auch nur meinen Respekt zollen indem ich sage: Das hast Du echt cool hinbekommen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: UnitOptimizer

  Alt 30. Okt 2018, 08:27
Das jedoch fällt etwas aus dem Rahmen "sid_InterfaceClassDeclaration"
Es ist der längste string sollten dann nicht die anderen alle noch um 1 aufrücken?
Da das hier in der DP nur näherungsweise darstellbar ist, auch mal noch zwei entsprechende Screenshots.
Aufm Bild passt alles und ich kann auch nur meinen Respekt zollen indem ich sage: Das hast Du echt cool hinbekommen!
Korrekt
Macht wohl der Formater im Forum Trouble..
Nehme alles zurück

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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