Entwickler-Ecke

Sonstiges (Delphi) - Code-Optimierung


fuggaz - Mi 17.12.08 00:31
Titel: Code-Optimierung
Hey,

Kann ich folgenden Code mit Delphi-Befehlen optimieren, damit die Exe-Datei kleiner wird?
Trotz des kurzen Quelltextes ist das Programm 380kb groß-finde ich zuviel.
(Es ist der Projekt-Quelltext)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
program pSort;

uses
  SysUtils, Forms, Dialogs, StdCtrls;

{$R *.res}

var OpenDialog:TOpenDialog;
    Liste:TListBox;
begin
ForceCurrentDirectory:=true;
OpenDialog:=TOpenDialog.Create(Application.Owner);
OpenDialog.Options:=[ofHidereadonly,ofFileMustExist,ofPathMustExist,ofDontAddToRecent];
if OpenDialog.Execute then
  begin
  Liste:=TListBox.Create(Application.Owner);
  Liste.ParentWindow:=Application.Handle;
  Liste.Sorted:=false;
  Liste.Items.LoadFromFile(OpenDialog.FileName);
  Liste.Items.Delete(0);
  Liste.Sorted:=true;
  Liste.Items.Insert(0,'[Blocksite]');
  Liste.Items.SaveToFile(OpenDialog.FileName);
  Liste.Free;
  end;
OpenDialog.Free;
end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


jfheins - Mi 17.12.08 00:51

Du könntest die Einträge manuell sortieren, dann benötigst du die >Unit Forms nicht, das spart viel ;)

Das nächste wäre dann, auf den Opendialog zu verzichten. (Ich glaube, Dialogs bindet wiederum Forms ein ...)


jaenicke - Mi 17.12.08 00:54

Was machst du denn mit einer ListBox? :shock: Du hast doch gar kein Formular, da ist es doch Schwachsinn eine TListBox zu erzeugen, was hat das für einen Sinn? :gruebel:

Durch den Dialog und das wird die Exe groß. Lass die TListBox weg, die Funktionalität, die du benutzt, steckt ohnehin in TStringList auch drin, nimm einfach das, und ersetze den VCL-Dialog durch den API-Dialog:
http://msdn.microsoft.com/en-us/library/ms646927.aspx
http://www.scalabium.com/faq/dct0156.htm

Dann kannst du auf die Units Dialogs und Forms verzichten.


BenBE - Mi 17.12.08 01:23

Ferner fällt ohne die TListbox die Unit StdCtrls weg. Für die TStringList brauch man zwar die Classes, die ist aber vergleichsweise klein.


Martok - Mi 17.12.08 01:38

Und bitte verwende Resourcenschutzblöcke. Hat zwar gar nichts mit deiner Frage zu tun, aber sowas tut schon fast in den Augen weh ;)


BenBE - Mi 17.12.08 01:43

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
[...] aber sowas tut schon fast in den Augen weh ;)

Nicht nur fast! Das ist schon regelrechte Folter ;-) :mrgreen:


Dunkel - Mi 17.12.08 02:05

Resourcenschutzblöcke sind doch nur was für Schwächlinge! Lachend in die Klinge reinlaufen rulez! (wer Ironie findet, darf es gerne behalten; man kann eh nie genug davon haben :wink: )

Viel schlimmer finde ich die, auch schon angesprochene, Verwendung von VCL-Elementen, wo überhaupt keine nötig sind. Das V in VCL steht für Visuell, Du benötigst aber keine visuell darstellenden Elemente.


turboPASCAL - Mi 17.12.08 04:56


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
program pSort;

uses
  Windows,
  Classes,  // für TStringList notwendig
  nonVCLOpenFileDlg in 'nonVCLOpenFileDlg.pas';

const
  AppName = 'pSort';

var
  Liste: TStringList;
  FileName: String;

begin
  FileName := OpenFileDialog(0'');

  if FileName <> '' then
  begin
    Liste := TStringList.Create;
    try
      Liste.Sorted := false;
      Liste.LoadFromFile(FileName);
      Liste.Delete(0);
      Liste.Sorted := true;
      Liste.Insert(0'[Blocksite]');
      Liste.SaveToFile(FileName);
    finally
      Liste.Free;
    end;
  end else
    MessageBox(0'Es wurde keine Datei geöffnet.',
      AppName, MB_ICONINFORMATION or MB_OK);
end.


Geht auch noch kleiner wenn man sich selbst eine non VCL Classe für TStringList baut. So sind es ~ 150 KByte.


alzaimar - Mi 17.12.08 08:12

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
[...] aber sowas tut schon fast in den Augen weh ;)

Nicht nur fast! Das ist schon regelrechte Folter ;-) :mrgreen:

Was passiert eigentlich mit den ganzen Handles und Speicherbereichen, wenn das Programm einfach terminiert?


BenBE - Mi 17.12.08 14:46

Werden im Idealfall freigegeben; kann aber sein, dass schlecht programmierte Treiber das nicht mitbekommen und die Ressourcen damit noch reserviert bleiben.


fuggaz - Mi 17.12.08 23:15

danke schonmal für die konstruktiven und bewertenden Antworten ;-)^^

Ich werde mich ab Freitag daran begeben mir das mal alles genauer anzuschauen.


alzaimar - Do 18.12.08 20:42

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Werden im Idealfall freigegeben; kann aber sein, dass schlecht programmierte Treiber das nicht mitbekommen und die Ressourcen damit noch reserviert bleiben.

Treiber in Delphi? Ich dachte, das geht nicht. Oder meinst Du, Handles *VON* schlecht programmierten Treibern? Oha.


jaenicke - Do 18.12.08 20:59

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Treiber in Delphi? Ich dachte, das geht nicht. Oder meinst Du, Handles *VON* schlecht programmierten Treibern? Oha.
Das meinte er vermutlich, aber man kann rein theoretisch auch in Delphi Treiber schreiben, da gabs das Delphi Driver Development Kit z.B.: http://w-shadow.com/blog/2006/10/12/writing-drivers-in-delphi/
Aber die Entwickler haben es wohl mittlerweile eingesehen, dass es sich nicht lohnt es weiterzuentwicklen. Wer würde schon ernsthaft Delphi dafür nehmen wollen, bzw. aus welchem Grund. ;-) Aber man kann theoretisch. :mrgreen: