Problem ze zmiana nazwy pliku :(

0

Mam taki problem, właśnie napisałem <ort>modół </ort>aktualizacji do mojego programu, który bazuje na tym w artach, tylko że zrobiłem tak, że kiedy użytkownik wybierze, że ma pobrać się aktualizacja to po zakończeniu pobierania ściągnięty plik ma się zamienić, z tym programu tzn: ściąga się plik ~.exe, główny programu nazywa się Main1.exe, po ściągnięciu Main1.exe ma zmienić nazwe na np.: 1.exe a ~.exe ma zmienić swoją na Main.exe, na końcu plik 1.exe zostaje usuwany. Tylko jak to zrobić, <ort>prubowałem </ort>już zrobić plik bat i mi wyszło, tylko że jak w programie dam linijke:

ShellExecute(Handle,'open','update.bat', nil, nil, SW_HIDE); Application.Terminate;

To wtedy plik bat niechce poprawnie zminić nazwy bo Main1.exe jest cały czas w użyciu, więc potrzebuje zrobić, żeby jakoś najpierw zamknąś moja aplikacje a potem dopiero uruchomoć plik bat, tylko że niechce koniecznie do tego tworzyć nowego pliku exe, tylko jakoś w tym pliku bat żeby można jakoś daćfunkcje która poczeka z 5 sekund i dopiero zacznie wydawać kolejne komendy np.: rename Main1.exe 1.exe, mam nadzieje że mnie zrozumieliście i jakoś pomożecie, Pozdrawiam.

0

Ktoś to kiedyś chyba w FAQ umieścił, ale nie chce mi się szukać, więc wklejam wprost z jakiegoś mojego programu, przerób sobie. Chodzi o to, że tworzysz bata, który próbuje do skutku skasować plik exe, czyli dopóki go nie wyłączysz. A wyłączyć program możesz z jego poziomu.

procedure SkasujSiebie(co : string);
var
    FName, SName: string;
    TF: TextFile;
    Katalog : string;
begin
    SName := co;
    FName := 'c:\\Kasuj.bat';
    AssignFile(TF, FName);
    Rewrite(TF);
    Katalog := ExtractFilePath(Application.ExeName);
    Delete(Katalog, Length(Katalog), 1);
    try
        Writeln(TF, ':start');
        Writeln(TF, 'del "' + SName + '"');
        Writeln(TF, 'if not exist "' + SName + '" goto end');
        Writeln(TF, 'goto start');
        Writeln(TF, ':end');
        Writeln(TF, 'rmdir ' + Katalog);
        Writeln(TF, 'del "' + FName + '"');
    finally
        CloseFile(TF);
    end;
    WinExec(PChar(FName), SW_HIDE);
end;
0

Berl wielkieeee dzięki, znmodyfikowałem ten kodzik i działa tak jak bym chciał, nawet lepiej [browar]

A przepraszam, że jeszcze przedłużam, ale już niechce zakłądać nowego tematu - chodzi o ten <ort>modół </ort>aktualizacji, mam procedurke:

<delphi> INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'version.ini'); Ver := INI.ReadString('Update', 'version', ''); x := Application.MessageBox('Dostępna jest nowa wersja aplikacji: ' + Ver + ', czy pobrać ?', 'Aktualizacja...', MB_YesNo + MB_IconQuestion); Może ktoś wie, dlaczego to wywala błąd przy kompilacji, <ort>po prostu </ort>chce wsadzić w wiadomość nazwe nowej wersji :-|
0

Może ktoś wie, dlaczego to wywala błąd przy kompilacji, po prostu chce wsadzić w wiadomość nazwe nowej wersji :-|

bo messagebox przyjmuje jako parametr PChar i nie masz tutaj rzutowania typów. Zrób tak:

Application.MessageBox(PChar('Dostępna jest nowa wersja aplikacji: ' + Ver + ', czy pobrać ?'), 'Aktualizacja...', MB_YesNo + MB_IconQuestion);
0

Tylko że Freshmen doszedłby do tego samego gdyby
a) zajrzał do helpa na definicję funkcji

function MessageBox(const Text, Caption: PChar; Flags: Longint = MB_OK): Integer;

lub
b) przeczytał opis błędu
[Error]Form1.pas(100): Incompatible types: 'String' and 'PChar'

Może dajmy ludziom trochę samemu się pomęczyć i pogłówkować. Danie wszystkiego 'na talerzu' też nie jest dobre.
Pozdrawiam i się ... nie czepiam.

0

[browar] Co ja bym bez Was zrobił :-* Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0