Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programmupdate über Extraprogramm (https://www.delphipraxis.net/40946-programmupdate-ueber-extraprogramm.html)

Nicolai1234 23. Feb 2005 16:33


Programmupdate über Extraprogramm
 
Ich wollte in mein Programm eine Updatefunktion einbauen. Hierzu wollte ich über mein Hauptprogramm die neuen Dateien runterladen.
Dann soll das Hauptprogramm beendet werden, ein Konsolenprogramm aufgerufen werden, das die Dateien ersetzt, und dann wieder das Hauptprgramm geöffnet werden.

Die Daten, was es kopieren und löschen soll, bekommt die Konsolenanwendung aus einer ini. So wie diese hier:
Zitat:

[QUELLE]
P1=c:\test.txt
P2=c:\test3.txt

[ZIEL]
P1=c:\test2.txt
P2=c:\test4.txt

[URSPRUNG]
P=Mein Programm
Es soll immer von Quelle nach Ziel kopiert werden. Davor soll die alte Zieldatei gelöscht werden, danach die Quelldatei.
Am Ende soll das Hauptprogramm wieder geöffnet werden. (der komplette Pfad steht unter URSPRUNG)

Das ganze geht in der Praxis auch mit diesem Code: (Das Sleep kann man sich jetzt mal wegdenken, denn das ist nur da, damit das nicht alles so schnell geht... :wink: )
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, idGlobal, inifiles, QDialogs, ShellAPI, forms, windows;

var
i: integer;
ini: tinifile;

begin
writeln('Update wird abgeschlossen...');
sleep(50);
writeln('INI wird geladen...');
ini := tinifile.create(ExtractFilePath(Paramstr(0))+'update.ini');
sleep(50);
writeln('INI wird geladen... abgeschlossen');
sleep(50);
writeln('Dateien werden kopiert...');
sleep(50);
i := 1;
while ini.ReadString('QUELLE','P'+inttostr(i),'0') <> '0' do
begin
writeln('Loeschen der Zieldatei... (' + inttostr(i) + ')');
deletefile(pchar(ini.ReadString('Ziel','P'+inttostr(i),'0')));
sleep(50);
writeln('Kopieren der Datei...');
copyfileto(pchar(ini.ReadString('QUELLE','P'+inttostr(i),'0')), pchar(ini.ReadString('ZIEL','P'+inttostr(i),'0')));
sleep(50);
writeln('.......................abgeschlossen');
writeln('Löschen der Datei...');
deletefile(pchar(ini.ReadString('QUELLE','P'+inttostr(i),'0')));
sleep(50);
writeln('Löschung war erfolgreich');
inc(i);
sleep(50);
end;
writeln('Update erfolgreich abgeschlossen...');
sleep(500);
ShellExecute(Application.Handle, 'open' ,PChar(ini.readstring('URSPRUNG','P','0')), nil, nil, sw_ShowNormal);
end.
Das funktioniert soweit auch alles sehr gut, aber das Programm ist in dieser form leider 572KB groß. Ich wollte das eigentlich mit einem Konsolenprogramm machen, um es möglichst klein zu haben.

Was könnte man ändern bzw. wie würdet ihr es machen? Das Grundprinzip sollte aber dabei gleich bleiben.
Danke

franktron 23. Feb 2005 16:37

Re: Programmupdate über Extraprogramm
 
Nimm mal Forms und QDialog aus der Unit Klausel

CalganX 23. Feb 2005 16:37

Re: Programmupdate über Extraprogramm
 
Hi,
erstmal die QDialogs rausnehmen, finde im Moment auch keinen Grund, warum du das brauchst. ;)
Versuche dann noch alles aus der SysUtils rauszunehmen. Es gibt Alternativen für z.B. IntToStr.
Also Alles in Allem versuchen die VCL loszuwerden. Dann sollte es kleiner werden.

Chris

Nicolai1234 23. Feb 2005 16:40

Re: Programmupdate über Extraprogramm
 
Zitat:

Zitat von franktron
Nimm mal Forms und QDialog aus der Unit Klausel

Oh...
QDialog war noch drin, weil ich was mit showmessage überprüft habe.

Forms hingegen brauche ich, da er in dieser Zeile
Delphi-Quellcode:
ShellExecute(Application.Handle, 'open' ,PChar(ini.readstring('URSPRUNG','P','0')), nil, nil, sw_ShowNormal);
das Application sonst nicht kennt.

Oder gibt es dazu einer Alternative?

CalganX 23. Feb 2005 16:45

Re: Programmupdate über Extraprogramm
 
Hi,
Zitat:

Zitat von Nicolai1605
Oder gibt es dazu einer Alternative?

na klar. Du kannst entweder nil übergeben (sollte möglich sein) oder holst dir über die WinAPI das Handle des aktuellen Fensters. Da bin ich mir aber nicht sicher, wie das geht.

Chris

maynard 23. Feb 2005 23:15

Re: Programmupdate über Extraprogramm
 
Tach...

Für intelligente Updates helfen dir vieleicht auch patch u. diff ... ich glaube für Windows bringt diese die MSYS Installation mit.

Nicolai1234 24. Feb 2005 14:03

Re: Programmupdate über Extraprogramm
 
Zitat:

Zitat von Chakotay1308
Hi,
Zitat:

Zitat von Nicolai1605
Oder gibt es dazu einer Alternative?

na klar. Du kannst entweder nil übergeben (sollte möglich sein) oder holst dir über die WinAPI das Handle des aktuellen Fensters. Da bin ich mir aber nicht sicher, wie das geht.

Chris

Also nil geht da nicht. habe ich gerade getestet. Was meinst du mit der API? Da kann ich mir ganricht drunter vorstellen :roll:

Beckman 24. Feb 2005 14:37

Re: Programmupdate über Extraprogramm
 
Delphi-Quellcode:
ShellExecute(0,'open',PAnsiChar(ExtractFilePath(Paramstr(0))+'file.ext'),nil,nil,sw_show);
geht problemlos in console apps.
warum willst du das handle uebergeben?

MathiasSimmack 24. Feb 2005 15:58

Re: Programmupdate über Extraprogramm
 
Will er doch gar nicht. ;) Chakotay schrieb:
Zitat:

Du kannst entweder nil übergeben
was aber nicht geht, weil der 1. Parameter von "ShellExecute" keinen Zeiger erwartet. Schäm dich, Chakotay! :stupid: Deine Null, @beckmann, steht übrigens für das Desktop-Fenster.


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