Ĺadny brzuch
Chciałbym się dowiedzieć jak stworzyć aktualizatora programu, który łączyłby się z Internetem i sprawdzał czy jest nowa wersja? Korzystam z wujka Google(definicja: jak stworzyć aktualizator plików, aktualizacje), ale nic ciekawego nie znajduję
Stawiasz na serwer jakiś plik z numerem aktualnej wersji.
W programie go pobierasz i sprawdzasz czy numer jest większy. Jeśli jest większy to ściągasz aktualizację.
Mnie raczej o jakiś kod do programu chodzi, że będzie przykładowo menu Opcje->Sprawdź aktualizacje... łączy się i sprawdza czy są.
Jeżeli nie ma połączenia wyświetla: Nie jesteś połączony z internetem, połącz się i sprawdź
Jeżeli nie ma aktualizacji: Posiadasz aktualną wersję programu
Jeżeli są aktualizacje: Dostępna jest nowa wersja. Pobrać? I odpowiedzi Tak i Nie.
http://www.google.co...&...-8&oe=utf-8
Proszę bardzo :)
@Petermechanic, dzięki. A jak zainstalować HTTPGet? Bo z tym mam problem.
Tu masz paczkę, zbudowaną przeze mnie: http://pioder.gim2pr...les/HTTPGet.rar
Rozpakowujesz do katalogu lib, następnie uruchamiasz HTTPGetPKG.dpk, klikasz Compile i Install. Po wszystkim zapisujesz zmiany, zrestartuj środowisko. Jeżeli komponent, mimo, iż widnieje nie będzie działać, tzn. could not find httpget.dcu to dodajesz do Environment Options->Libraries ścieżkę: $(DELPHI)\Lib\HTTPGet.
Podczas próby skompilowania pojawiły się błędy:
unit Notatnik; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Spin, Menus, StdCtrls, ComCtrls, HTTPGet; type TfGlowny = class(TForm) PopupMenu1: TPopupMenu; MainMenu1: TMainMenu; Edit2: TMenuItem; N7: TMenuItem; Paste2: TMenuItem; Copy2: TMenuItem; Cut2: TMenuItem; Edytor: TMemo; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; File1: TMenuItem; Exit1: TMenuItem; N2: TMenuItem; SaveAs1: TMenuItem; Save1: TMenuItem; Open1: TMenuItem; New1: TMenuItem; Edit1: TMenuItem; Paste1: TMenuItem; Copy1: TMenuItem; Cut1: TMenuItem; Zaznaczwszystko1: TMenuItem; N1: TMenuItem; Zaznaczwszystko2: TMenuItem; Opcje1: TMenuItem; Sprawdaktualizacje1: TMenuItem; Pomoc1: TMenuItem; HTTPGet1: THTTPGet; HTTPGet2: THTTPGet; Memo1: TMemo; ProgressBar1: TProgressBar; procedure Nowy1Click(Sender: TObject); procedure Otworz1Click(Sender: TObject); procedure Zapiszjako1Click(Sender: TObject); procedure Koniec1Click(Sender: TObject); procedure Wytnij1Click(Sender: TObject); procedure Kopiuj1Click(Sender: TObject); procedure Wklej1Click(Sender: TObject); procedure Zaznaczwszystko1Click(Sender: TObject); procedure Sprawdzaktualizacje1Click(Sender: TObject); procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer); procedure HTTPGet1DoneFile(Sender: TObject; FileName: String; FileSize: Integer); procedure HTTPGet1Error(Sender: TObject); procedure HTTPGet2Error(Sender: TObject); procedure HTTPGet2Progress(Sender: TObject; TotalSize, Readed: Integer); private { Private declarations } public Nazwa_pliku : String; end; var fGlowny: TfGlowny; implementation {$R *.dfm} procedure TfGlowny.Nowy1Click(Sender: TObject); begin Nazwa_pliku:=''; Edytor.Lines.Clear; end; procedure TfGlowny.Zapiszjako1Click(Sender: TObject); begin if SaveDialog1.Execute then begin Nazwa_pliku:=SaveDialog1.FileName; Edytor.Lines.SaveToFile(Nazwa_pliku); end; end; procedure TfGlowny.Otworz1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Nazwa_pliku:=OpenDialog1.FileName; Edytor.Lines.LoadFromFile(Nazwa_pliku); end; end; procedure TfGlowny.Koniec1Click(Sender: TObject); begin Close end; procedure TfGlowny.Wytnij1Click(Sender: TObject); begin Edytor.CutToClipboard; end; procedure TfGlowny.Kopiuj1Click(Sender: TObject); begin Edytor.CopyToClipboard end; procedure TfGlowny.Wklej1Click(Sender: TObject); begin Edytor.PasteFromClipboard end; procedure TfGlowny.Zaznaczwszystko1Click(Sender: TObject); begin Edytor.SelectAll; end; procedure TfGlowny.Sprawdzaktualizacje1Click(Sender: TObject); begin HTTPGet1.URL := 'http://www.programy-oldshaterhana.yoyo.pl/version Notatnik OldShaterhana.ini'; //lokalizacja pliku z informacją HTTPGet1.FileName := ExtractFilePath(Application.ExeName) + 'version Notatnik OldShaterhana.ini'; HTTPGet1.GetFile; //pobranie pliku ini Memo1.Lines.Add('Pobieranie informacji...'); end; procedure TfGlowny.HTTPGet1DoneFile(Sender: TObject; FileName: String; FileSize: Integer); var INI : TINIFile; updtVersion : string; cyfra1 : integer; cyfra2 : integer; updtCyfr1 : integer; updtCyfr2 : integer; begin Memo1.Lines.Add('Sprawdzanie, czy jest nowa wersja'); INI := TINIFile.Create(HTTPGet1.FileName); try updtVersion := INI.ReadString('update','version',''); //odczytanie wersji z pliku ini //nie śmiejcie sie z tego sposobu. To tylko przykład :) cyfra1 := StrToInt(wersja[1]); cyfra2 := StrToInt(wersja[3]); updtCyfr1 := StrToInt(updtVersion[1]); updtCyfr2 := StrToInt(updtVersion[3]); if (cyfra1 < updtCyfr1) or (cyfra2 < updtCyfr2) then //sprawdzenie, czy jest nowa wersja begin Memo1.Lines.Add('Jest nowa wersja programu'); {wyświetlenie zapytania. Jeśli użytkownik wybierze Tak, rozpoczyna się pobieranie programu } if Application.MessageBox('Czy chcesz pobrać nową wersję programu?','Informacja',MB_YesNo) = ID_NO then exit else begin HTTPGet2.URL := INI.ReadString('update','url',''); if SaveDialog1.Execute then // tu użytkownik wybierze, gdzie zapisać program HTTPGet2.FileName := SaveDialog1.FileName; HTTPGet2.GetFile; //pobieranie pliku Memo1.Lines.Add('Pobieranie pliku'); end; end else Memo1.Lines.Add('Nie znaleziono nowej wersji programu'); finally INI.Free; DeleteFile(HTTPGet1.FileName); //usunięcie pliku ini end; end; procedure TfGlowny.HTTPGet1Error(Sender: TObject); begin Memo1.Lines.Add('Wystąpił błąd'); end; procedure TGlowny.HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer); begin Memo1.Lines.Add('Pobieranie zakończone sukcesem'); end; procedure TfGlowny.HTTPGet2Error(Sender: TObject); begin Memo1.Lines.Add('Wystąpił błąd podczas pobierania pliku'); end; procedure TfGlowny.HTTPGet2Progress(Sender: TObject; TotalSize, Readed: Integer); begin ProgressBar1.Max := TotalSize; ProgressBar1.Position := Readed; end; end.
Kilka błędów poprawiłem.
Użytkownik OldShaterhan edytował ten post 06 lipiec 2009, 15:49
1. nie zdeklarowałeś stałej const
2. do Memo wypisywane są komunikaty o aktualizacji - dodaj ten komponent na formatkę to zobaczysz, o co chodzi ;)
PS. ile czasu już programujesz? :)
2. Ale, ja go mam na niej, nawet 2 razy, bo tworzę Notatnik w wersji 2.0 i jest tam 2 razy on.
PS. Bardzo krótko.
Użytkownik OldShaterhan edytował ten post 07 lipiec 2009, 09:47
[Error] Notatnik.pas(147): Undeclared identifier: 'wersja'
zmiennej/stałej wersja nigdzie nie ma w Twoim kodzie. Dlatego Delphi nie wie co robić.
[Error] Notatnik.pas(185): Undeclared identifier: 'Memo1'
U Ciebie widzę że zamiast Memo1 powinno być Edytor
[Error] Notatnik.pas(51): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile'
Usuń z type
procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer);
//EDIT
Zauważyłem że też masz Memo1, sory za wprowadzenie w bład.
Użytkownik CorVeta edytował ten post 07 lipiec 2009, 10:12
[Error] Notatnik.pas(147): Undeclared identifier: 'wersja'
zmiennej/stałej wersja nigdzie nie ma w Twoim kodzie. Dlatego Delphi nie wie co robić.
[Error] Notatnik.pas(185): Undeclared identifier: 'Memo1'
U Ciebie widzę że zamiast Memo1 powinno być Edytor
[Error] Notatnik.pas(51): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile'
Usuń z type
procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer);
1. Jak zadeklarować wersję lub wyciągnąć z Project->Options->Version Info?
2. Ale ja mam na formie 2 Memo. OK.
3. Usunąłem i pojawił się błąd. Przywróciłem.
//EDIT Jak zadeklarować wersję?
const wersja ='2.0.0'
Po takim wpiasniu znacznie więcej błędów się pojawia.
Użytkownik OldShaterhan edytował ten post 07 lipiec 2009, 10:31
1. Jak zadeklarować wersję lub wyciągnąć z Project->Options->Version Info?
2. Ale ja mam na formie 2 Memo. OK.
3. Usunąłem i pojawił się błąd.
Sory nie zauważyłem. :(
//EDIT
1 -> w kodzie jako zmienną albo stałą
3 -> To pochwal się błędem
Użytkownik CorVeta edytował ten post 07 lipiec 2009, 10:24
Dostałeś go na GG, a potem usunąłem
1. Zadeklarować - jak daję const to więcej błędów się robi.
const wersja ='2.0.0'
a średnik na końcu? Wersja ma być w formacie x.x
Użytkownik Petermechanic edytował ten post 07 lipiec 2009, 16:16
Po zadeklarowaniu wersji pojawiają się takie błędy:
[Error] Notatnik.pas(41): Identifier redeclared: 'Memo1' [Error] Notatnik.pas(147): Statement expected but 'CONST' found [Error] Notatnik.pas(148): '=' expected but ':=' found [Error] Notatnik.pas(148): Constant expression expected [Error] Notatnik.pas(149): '=' expected but ':=' found [Error] Notatnik.pas(149): Constant expression expected [Error] Notatnik.pas(150): '=' expected but ':=' found [Error] Notatnik.pas(150): Undeclared identifier: 'updtVersion' [Error] Notatnik.pas(150): Constant expression expected [Error] Notatnik.pas(151): '=' expected but ':=' found [Error] Notatnik.pas(151): Constant expression expected [Error] Notatnik.pas(152): Declaration expected but 'IF' found [Error] Notatnik.pas(154): Undeclared identifier: 'Memo1' [Error] Notatnik.pas(154): Missing operator or semicolon [Error] Notatnik.pas(162): Undeclared identifier: 'HTTPGet2' [Error] Notatnik.pas(162): Undeclared identifier: 'INI' [Error] Notatnik.pas(163): Undeclared identifier: 'SaveDialog1' [Error] Notatnik.pas(163): 'THEN' expected but identifier 'Execute' found [Error] Notatnik.pas(180): Missing operator or semicolon [Error] Notatnik.pas(183): Statement expected but 'PROCEDURE' found [Error] Notatnik.pas(183): ';' expected but '.' found [Error] Notatnik.pas(186): Missing operator or semicolon [Error] Notatnik.pas(54): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile' [Error] Notatnik.pas(56): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet1Error' [Fatal Error] Project2.dpr(5): Could not compile used unit 'Notatnik.pas'
podaj jeszcze raz w [ codebox ] kod, ale już ten, w którym dodałeś stałą.
const wersja ='2.0.0'
a średnik na końcu? Wersja ma być w formacie x.x
On ma w kodzie coś takiegoupdtVersion := INI.ReadString('update','version',''); //odczytanie wersji z pliku ini //nie śmiejcie sie z tego sposobu. To tylko przykład smile.gif cyfra1 := StrToInt(wersja[1]); cyfra2 := StrToInt(wersja[3]); zatem zmienna wersja jest prawdopodobnie stringiem i jest zmienną a nie typu const. Poza tym wydaje mi się, że w tym miejscu nie powinna być użyta wersja ale updtVersion i to powinno załatwić ten błąd. Jednak odwołanie się do konkretnego znaku w zmiennej updtVersion będzie działało źle jeżeli np. cyfra1 lub cyfra2 będzie miała dwa znaki, tzn. wersja > 9.
Użytkownik imcpan edytował ten post 08 lipiec 2009, 11:02
Usunąłem tą deklarację. To jak w końcu zadeklarować?
Pozwoliłem sobie odświeżyć.
<<Odświeżam>>
Po co Ci taki długi kod na sprawdzanie wersji? :D Robisz to tak:
var wersja:string; begin wersja:=IdHTTP1.Get('http://www.twojastrona.pl/wersja.txt'); if wersja='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else Application.MessageBox('Znaleziono nową wersję programu :)','Nowa wersja', MB_ICONINFORMATION); end;
Do pobrania pliku potrzebujesz Indy 9 i komponentu IdHTTP [zakładka Indy Clients]. Możesz także skorzystać z jakiegoś innego komponentu, byle by Ci ściągnął zawartość pliku do zmiennej wersja. W pliku wersja.txt wpisujesz "1.0" - dla wersji aktualnej, lub coś innego dla nowej wersji ;).
Pozdrawiam
Użytkownik mateok edytował ten post 18 lipiec 2009, 18:18
mateok, no ok, ale co wtedy, kiedy zdeklaruje wersję 1.1 w programie jako nowa, a we wpisie będzie jeszcze starsza i da aktualizuj albo będzie testować aktualizator z nową wersją (na razie unstable), a w bazie wpisy ze stable? Będzie nieaktualna, a to bzdura - na odwrót, chociaż trochę to wyjątki z marginesu, ale zdarza się :)
mateok, no ok, ale co wtedy, kiedy zdeklaruje wersję 1.1 w programie jako nowa, a we wpisie będzie jeszcze starsza i da aktualizuj albo będzie testować aktualizator z nową wersją (na razie unstable), a w bazie wpisy ze stable? Będzie nieaktualna, a to bzdura - na odwrót, chociaż trochę to wyjątki z marginesu, ale zdarza się :)
Raczej się nowe wersje robi, a nie starsze :). A jak chce mieć bete, to zawsze może ją umieścić tylko na stronie. No, ale skoro tak mówisz, to można zrobić jeszcze tak:
var wersja:string; begin try wersja:=IdHTTP1.Get('http://www.twojastrona.pl/wersja.txt'); if wersja='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else if pos('beta ',wersja)>0 then begin wersja:=StringReplace(wersja, 'beta ', '', [rfReplaceAll]); Application.MessageBox(PChar('Pojawiła się wersja beta oznaczoną jako: '+wersja),'Informacja', MB_ICONINFORMATION); end else Application.MessageBox(PChar('Znaleziono nową wersję programu oznaczoną jako: '+wersja),'Nowa wersja', MB_ICONINFORMATION); except Application.MessageBox('Brak połączenia z internetem','Błąd', MB_IConerror) end; end;
Wtedy wystarczy w pliku wersja.txt wpisać "beta 1.0.1" i program wyświetli, że pojawiła się wersja beta oznaczona jako 1.0.1 :). Dodałem do tego kodu także try i except, po to, że jeśli wyskoczy jakiś błąd to raczej nie ma połączenia z internetem (lub serwer padł :P). Sprawdzałem - działa :)
Czyli zainstalować Indy 9? I usunąć te pliki, które stworzyłem do aktualizatora zastępując je Indy? Jeżeli tak to skąd można pobrać gotową?
Użytkownik OldShaterhan edytował ten post 19 lipiec 2009, 10:59
Ja podałem przykładowy sposób pobrania pliku przez Indy 9, Ty możesz pobrać plik byle czym (nawet URLmon). A jeśli chcesz Indy to poszukaj na necie instalki, komponenty te mają instalatora, więc problemów z instalacją nie będzie :)
A nie dało by rady poprawić tego kodu?
A nie dało by rady poprawić tego kodu?
ehh... Powinienem Ci nie podawać, ale masz taką wersję "na odczepnego" :D. Do uses na samej górze kodu programu dodajesz URLMon. Dajesz na formę komponent Memo i ustawiasz właściwość Visible na false (żeby nie było go widać). A później kod:
begin if URLDownloadToFile(nil, 'http://www.mateusz0.ovh.org/version.ini', 'wersja.txt', 0, nil) <> 0 then Application.MessageBox('Błąd podczas pobierania','Błąd', MB_IConerror) else begin Memo1.Lines.LoadFromFile('wersja.txt'); //wczytuje plik do Memo1 DeleteFile('a.txt'); // usuwa go z dysku if Memo1.Text='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else if pos('beta ',Memo1.Text)>0 then begin Memo1.Text:=StringReplace(Memo1.Text, 'beta ', '', [rfReplaceAll]); Application.MessageBox(PChar('Pojawiła się wersja beta oznaczoną jako: '+Memo1.Text),'Informacja', MB_ICONINFORMATION); end else Application.MessageBox(PChar('Znaleziono nową wersję programu oznaczoną jako: '+Memo1.Text),'Nowa wersja', MB_ICONINFORMATION); end; end;
Oczywiście możesz dodać ściąganie pliku do Temp'a (bo np. jak zapiszesz program na płycie CD to wywali bład, bo nie zapisze sobie pliku :P). No, ale to już Twoja sprawa :). Lepiej wykorzystać IdHTTP z Indy, ale to jak już chcesz :)
Użytkownik mateok edytował ten post 20 lipiec 2009, 12:07
Zrobię chyba jednak w Indy. Jednak mam problem. Otóż przy próbie podwójnego kliknięcia na komponent pojawił się błąd. Wykasowałem Indy i teraz przy próbie instalacji przycisk Install jest nieaktywny.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Stawiasz na serwer jakiś plik z numerem aktualnej wersji.
W programie go pobierasz i sprawdzasz czy numer jest większy. Jeśli jest większy to ściągasz aktualizację.
Mnie raczej o jakiś kod do programu chodzi, że będzie przykładowo menu Opcje->Sprawdź aktualizacje... łączy się i sprawdza czy są.
Jeżeli nie ma połączenia wyświetla: Nie jesteś połączony z internetem, połącz się i sprawdź
Jeżeli nie ma aktualizacji: Posiadasz aktualną wersję programu
Jeżeli są aktualizacje: Dostępna jest nowa wersja. Pobrać? I odpowiedzi Tak i Nie.
http://www.google.co...&...-8&oe=utf-8
Proszę bardzo :)
@Petermechanic, dzięki. A jak zainstalować HTTPGet? Bo z tym mam problem.
Tu masz paczkę, zbudowaną przeze mnie: http://pioder.gim2pr...les/HTTPGet.rar
Rozpakowujesz do katalogu lib, następnie uruchamiasz HTTPGetPKG.dpk, klikasz Compile i Install. Po wszystkim zapisujesz zmiany, zrestartuj środowisko. Jeżeli komponent, mimo, iż widnieje nie będzie działać, tzn. could not find httpget.dcu to dodajesz do Environment Options->Libraries ścieżkę: $(DELPHI)\Lib\HTTPGet.
Podczas próby skompilowania pojawiły się błędy:
unit Notatnik; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Spin, Menus, StdCtrls, ComCtrls, HTTPGet; type TfGlowny = class(TForm) PopupMenu1: TPopupMenu; MainMenu1: TMainMenu; Edit2: TMenuItem; N7: TMenuItem; Paste2: TMenuItem; Copy2: TMenuItem; Cut2: TMenuItem; Edytor: TMemo; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; File1: TMenuItem; Exit1: TMenuItem; N2: TMenuItem; SaveAs1: TMenuItem; Save1: TMenuItem; Open1: TMenuItem; New1: TMenuItem; Edit1: TMenuItem; Paste1: TMenuItem; Copy1: TMenuItem; Cut1: TMenuItem; Zaznaczwszystko1: TMenuItem; N1: TMenuItem; Zaznaczwszystko2: TMenuItem; Opcje1: TMenuItem; Sprawdaktualizacje1: TMenuItem; Pomoc1: TMenuItem; HTTPGet1: THTTPGet; HTTPGet2: THTTPGet; Memo1: TMemo; ProgressBar1: TProgressBar; procedure Nowy1Click(Sender: TObject); procedure Otworz1Click(Sender: TObject); procedure Zapiszjako1Click(Sender: TObject); procedure Koniec1Click(Sender: TObject); procedure Wytnij1Click(Sender: TObject); procedure Kopiuj1Click(Sender: TObject); procedure Wklej1Click(Sender: TObject); procedure Zaznaczwszystko1Click(Sender: TObject); procedure Sprawdzaktualizacje1Click(Sender: TObject); procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer); procedure HTTPGet1DoneFile(Sender: TObject; FileName: String; FileSize: Integer); procedure HTTPGet1Error(Sender: TObject); procedure HTTPGet2Error(Sender: TObject); procedure HTTPGet2Progress(Sender: TObject; TotalSize, Readed: Integer); private { Private declarations } public Nazwa_pliku : String; end; var fGlowny: TfGlowny; implementation {$R *.dfm} procedure TfGlowny.Nowy1Click(Sender: TObject); begin Nazwa_pliku:=''; Edytor.Lines.Clear; end; procedure TfGlowny.Zapiszjako1Click(Sender: TObject); begin if SaveDialog1.Execute then begin Nazwa_pliku:=SaveDialog1.FileName; Edytor.Lines.SaveToFile(Nazwa_pliku); end; end; procedure TfGlowny.Otworz1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Nazwa_pliku:=OpenDialog1.FileName; Edytor.Lines.LoadFromFile(Nazwa_pliku); end; end; procedure TfGlowny.Koniec1Click(Sender: TObject); begin Close end; procedure TfGlowny.Wytnij1Click(Sender: TObject); begin Edytor.CutToClipboard; end; procedure TfGlowny.Kopiuj1Click(Sender: TObject); begin Edytor.CopyToClipboard end; procedure TfGlowny.Wklej1Click(Sender: TObject); begin Edytor.PasteFromClipboard end; procedure TfGlowny.Zaznaczwszystko1Click(Sender: TObject); begin Edytor.SelectAll; end; procedure TfGlowny.Sprawdzaktualizacje1Click(Sender: TObject); begin HTTPGet1.URL := 'http://www.programy-oldshaterhana.yoyo.pl/version Notatnik OldShaterhana.ini'; //lokalizacja pliku z informacją HTTPGet1.FileName := ExtractFilePath(Application.ExeName) + 'version Notatnik OldShaterhana.ini'; HTTPGet1.GetFile; //pobranie pliku ini Memo1.Lines.Add('Pobieranie informacji...'); end; procedure TfGlowny.HTTPGet1DoneFile(Sender: TObject; FileName: String; FileSize: Integer); var INI : TINIFile; updtVersion : string; cyfra1 : integer; cyfra2 : integer; updtCyfr1 : integer; updtCyfr2 : integer; begin Memo1.Lines.Add('Sprawdzanie, czy jest nowa wersja'); INI := TINIFile.Create(HTTPGet1.FileName); try updtVersion := INI.ReadString('update','version',''); //odczytanie wersji z pliku ini //nie śmiejcie sie z tego sposobu. To tylko przykład :) cyfra1 := StrToInt(wersja[1]); cyfra2 := StrToInt(wersja[3]); updtCyfr1 := StrToInt(updtVersion[1]); updtCyfr2 := StrToInt(updtVersion[3]); if (cyfra1 < updtCyfr1) or (cyfra2 < updtCyfr2) then //sprawdzenie, czy jest nowa wersja begin Memo1.Lines.Add('Jest nowa wersja programu'); {wyświetlenie zapytania. Jeśli użytkownik wybierze Tak, rozpoczyna się pobieranie programu } if Application.MessageBox('Czy chcesz pobrać nową wersję programu?','Informacja',MB_YesNo) = ID_NO then exit else begin HTTPGet2.URL := INI.ReadString('update','url',''); if SaveDialog1.Execute then // tu użytkownik wybierze, gdzie zapisać program HTTPGet2.FileName := SaveDialog1.FileName; HTTPGet2.GetFile; //pobieranie pliku Memo1.Lines.Add('Pobieranie pliku'); end; end else Memo1.Lines.Add('Nie znaleziono nowej wersji programu'); finally INI.Free; DeleteFile(HTTPGet1.FileName); //usunięcie pliku ini end; end; procedure TfGlowny.HTTPGet1Error(Sender: TObject); begin Memo1.Lines.Add('Wystąpił błąd'); end; procedure TGlowny.HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer); begin Memo1.Lines.Add('Pobieranie zakończone sukcesem'); end; procedure TfGlowny.HTTPGet2Error(Sender: TObject); begin Memo1.Lines.Add('Wystąpił błąd podczas pobierania pliku'); end; procedure TfGlowny.HTTPGet2Progress(Sender: TObject; TotalSize, Readed: Integer); begin ProgressBar1.Max := TotalSize; ProgressBar1.Position := Readed; end; end.
Kilka błędów poprawiłem.
Użytkownik OldShaterhan edytował ten post 06 lipiec 2009, 15:49
1. nie zdeklarowałeś stałej const
2. do Memo wypisywane są komunikaty o aktualizacji - dodaj ten komponent na formatkę to zobaczysz, o co chodzi ;)
PS. ile czasu już programujesz? :)
2. Ale, ja go mam na niej, nawet 2 razy, bo tworzę Notatnik w wersji 2.0 i jest tam 2 razy on.
PS. Bardzo krótko.
Użytkownik OldShaterhan edytował ten post 07 lipiec 2009, 09:47
[Error] Notatnik.pas(147): Undeclared identifier: 'wersja'
zmiennej/stałej wersja nigdzie nie ma w Twoim kodzie. Dlatego Delphi nie wie co robić.
[Error] Notatnik.pas(185): Undeclared identifier: 'Memo1'
U Ciebie widzę że zamiast Memo1 powinno być Edytor
[Error] Notatnik.pas(51): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile'
Usuń z type
procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer);
//EDIT
Zauważyłem że też masz Memo1, sory za wprowadzenie w bład.
Użytkownik CorVeta edytował ten post 07 lipiec 2009, 10:12
[Error] Notatnik.pas(147): Undeclared identifier: 'wersja'
zmiennej/stałej wersja nigdzie nie ma w Twoim kodzie. Dlatego Delphi nie wie co robić.
[Error] Notatnik.pas(185): Undeclared identifier: 'Memo1'
U Ciebie widzę że zamiast Memo1 powinno być Edytor
[Error] Notatnik.pas(51): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile'
Usuń z type
procedure HTTPGet2DoneFile(Sender: TObject; FileName: String; FileSize: Integer);
1. Jak zadeklarować wersję lub wyciągnąć z Project->Options->Version Info?
2. Ale ja mam na formie 2 Memo. OK.
3. Usunąłem i pojawił się błąd. Przywróciłem.
//EDIT Jak zadeklarować wersję?
const wersja ='2.0.0'
Po takim wpiasniu znacznie więcej błędów się pojawia.
Użytkownik OldShaterhan edytował ten post 07 lipiec 2009, 10:31
1. Jak zadeklarować wersję lub wyciągnąć z Project->Options->Version Info?
2. Ale ja mam na formie 2 Memo. OK.
3. Usunąłem i pojawił się błąd.
Sory nie zauważyłem. :(
//EDIT
1 -> w kodzie jako zmienną albo stałą
3 -> To pochwal się błędem
Użytkownik CorVeta edytował ten post 07 lipiec 2009, 10:24
Dostałeś go na GG, a potem usunąłem
1. Zadeklarować - jak daję const to więcej błędów się robi.
const wersja ='2.0.0'
a średnik na końcu? Wersja ma być w formacie x.x
Użytkownik Petermechanic edytował ten post 07 lipiec 2009, 16:16
Po zadeklarowaniu wersji pojawiają się takie błędy:
[Error] Notatnik.pas(41): Identifier redeclared: 'Memo1' [Error] Notatnik.pas(147): Statement expected but 'CONST' found [Error] Notatnik.pas(148): '=' expected but ':=' found [Error] Notatnik.pas(148): Constant expression expected [Error] Notatnik.pas(149): '=' expected but ':=' found [Error] Notatnik.pas(149): Constant expression expected [Error] Notatnik.pas(150): '=' expected but ':=' found [Error] Notatnik.pas(150): Undeclared identifier: 'updtVersion' [Error] Notatnik.pas(150): Constant expression expected [Error] Notatnik.pas(151): '=' expected but ':=' found [Error] Notatnik.pas(151): Constant expression expected [Error] Notatnik.pas(152): Declaration expected but 'IF' found [Error] Notatnik.pas(154): Undeclared identifier: 'Memo1' [Error] Notatnik.pas(154): Missing operator or semicolon [Error] Notatnik.pas(162): Undeclared identifier: 'HTTPGet2' [Error] Notatnik.pas(162): Undeclared identifier: 'INI' [Error] Notatnik.pas(163): Undeclared identifier: 'SaveDialog1' [Error] Notatnik.pas(163): 'THEN' expected but identifier 'Execute' found [Error] Notatnik.pas(180): Missing operator or semicolon [Error] Notatnik.pas(183): Statement expected but 'PROCEDURE' found [Error] Notatnik.pas(183): ';' expected but '.' found [Error] Notatnik.pas(186): Missing operator or semicolon [Error] Notatnik.pas(54): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet2DoneFile' [Error] Notatnik.pas(56): Unsatisfied forward or external declaration: 'TfGlowny.HTTPGet1Error' [Fatal Error] Project2.dpr(5): Could not compile used unit 'Notatnik.pas'
podaj jeszcze raz w [ codebox ] kod, ale już ten, w którym dodałeś stałą.
const wersja ='2.0.0'
a średnik na końcu? Wersja ma być w formacie x.x
On ma w kodzie coś takiegoupdtVersion := INI.ReadString('update','version',''); //odczytanie wersji z pliku ini //nie śmiejcie sie z tego sposobu. To tylko przykład smile.gif cyfra1 := StrToInt(wersja[1]); cyfra2 := StrToInt(wersja[3]); zatem zmienna wersja jest prawdopodobnie stringiem i jest zmienną a nie typu const. Poza tym wydaje mi się, że w tym miejscu nie powinna być użyta wersja ale updtVersion i to powinno załatwić ten błąd. Jednak odwołanie się do konkretnego znaku w zmiennej updtVersion będzie działało źle jeżeli np. cyfra1 lub cyfra2 będzie miała dwa znaki, tzn. wersja > 9.
Użytkownik imcpan edytował ten post 08 lipiec 2009, 11:02
Usunąłem tą deklarację. To jak w końcu zadeklarować?
Pozwoliłem sobie odświeżyć.
<<Odświeżam>>
Po co Ci taki długi kod na sprawdzanie wersji? :D Robisz to tak:
var wersja:string; begin wersja:=IdHTTP1.Get('http://www.twojastrona.pl/wersja.txt'); if wersja='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else Application.MessageBox('Znaleziono nową wersję programu :)','Nowa wersja', MB_ICONINFORMATION); end;
Do pobrania pliku potrzebujesz Indy 9 i komponentu IdHTTP [zakładka Indy Clients]. Możesz także skorzystać z jakiegoś innego komponentu, byle by Ci ściągnął zawartość pliku do zmiennej wersja. W pliku wersja.txt wpisujesz "1.0" - dla wersji aktualnej, lub coś innego dla nowej wersji ;).
Pozdrawiam
Użytkownik mateok edytował ten post 18 lipiec 2009, 18:18
mateok, no ok, ale co wtedy, kiedy zdeklaruje wersję 1.1 w programie jako nowa, a we wpisie będzie jeszcze starsza i da aktualizuj albo będzie testować aktualizator z nową wersją (na razie unstable), a w bazie wpisy ze stable? Będzie nieaktualna, a to bzdura - na odwrót, chociaż trochę to wyjątki z marginesu, ale zdarza się :)
mateok, no ok, ale co wtedy, kiedy zdeklaruje wersję 1.1 w programie jako nowa, a we wpisie będzie jeszcze starsza i da aktualizuj albo będzie testować aktualizator z nową wersją (na razie unstable), a w bazie wpisy ze stable? Będzie nieaktualna, a to bzdura - na odwrót, chociaż trochę to wyjątki z marginesu, ale zdarza się :)
Raczej się nowe wersje robi, a nie starsze :). A jak chce mieć bete, to zawsze może ją umieścić tylko na stronie. No, ale skoro tak mówisz, to można zrobić jeszcze tak:
var wersja:string; begin try wersja:=IdHTTP1.Get('http://www.twojastrona.pl/wersja.txt'); if wersja='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else if pos('beta ',wersja)>0 then begin wersja:=StringReplace(wersja, 'beta ', '', [rfReplaceAll]); Application.MessageBox(PChar('Pojawiła się wersja beta oznaczoną jako: '+wersja),'Informacja', MB_ICONINFORMATION); end else Application.MessageBox(PChar('Znaleziono nową wersję programu oznaczoną jako: '+wersja),'Nowa wersja', MB_ICONINFORMATION); except Application.MessageBox('Brak połączenia z internetem','Błąd', MB_IConerror) end; end;
Wtedy wystarczy w pliku wersja.txt wpisać "beta 1.0.1" i program wyświetli, że pojawiła się wersja beta oznaczona jako 1.0.1 :). Dodałem do tego kodu także try i except, po to, że jeśli wyskoczy jakiś błąd to raczej nie ma połączenia z internetem (lub serwer padł :P). Sprawdzałem - działa :)
Czyli zainstalować Indy 9? I usunąć te pliki, które stworzyłem do aktualizatora zastępując je Indy? Jeżeli tak to skąd można pobrać gotową?
Użytkownik OldShaterhan edytował ten post 19 lipiec 2009, 10:59
Ja podałem przykładowy sposób pobrania pliku przez Indy 9, Ty możesz pobrać plik byle czym (nawet URLmon). A jeśli chcesz Indy to poszukaj na necie instalki, komponenty te mają instalatora, więc problemów z instalacją nie będzie :)
A nie dało by rady poprawić tego kodu?
A nie dało by rady poprawić tego kodu?
ehh... Powinienem Ci nie podawać, ale masz taką wersję "na odczepnego" :D. Do uses na samej górze kodu programu dodajesz URLMon. Dajesz na formę komponent Memo i ustawiasz właściwość Visible na false (żeby nie było go widać). A później kod:
begin if URLDownloadToFile(nil, 'http://www.mateusz0.ovh.org/version.ini', 'wersja.txt', 0, nil) <> 0 then Application.MessageBox('Błąd podczas pobierania','Błąd', MB_IConerror) else begin Memo1.Lines.LoadFromFile('wersja.txt'); //wczytuje plik do Memo1 DeleteFile('a.txt'); // usuwa go z dysku if Memo1.Text='1.0' then Application.MessageBox('Posiadasz aktualną wersję programu;)','Informacja', MB_ICONINFORMATION) else if pos('beta ',Memo1.Text)>0 then begin Memo1.Text:=StringReplace(Memo1.Text, 'beta ', '', [rfReplaceAll]); Application.MessageBox(PChar('Pojawiła się wersja beta oznaczoną jako: '+Memo1.Text),'Informacja', MB_ICONINFORMATION); end else Application.MessageBox(PChar('Znaleziono nową wersję programu oznaczoną jako: '+Memo1.Text),'Nowa wersja', MB_ICONINFORMATION); end; end;
Oczywiście możesz dodać ściąganie pliku do Temp'a (bo np. jak zapiszesz program na płycie CD to wywali bład, bo nie zapisze sobie pliku :P). No, ale to już Twoja sprawa :). Lepiej wykorzystać IdHTTP z Indy, ale to jak już chcesz :)
Użytkownik mateok edytował ten post 20 lipiec 2009, 12:07
Zrobię chyba jednak w Indy. Jednak mam problem. Otóż przy próbie podwójnego kliknięcia na komponent pojawił się błąd. Wykasowałem Indy i teraz przy próbie instalacji przycisk Install jest nieaktywny.