INI z serwera i z dysku

0

Witam!
Korzystałem z artykułu o aktualizacji programu. Zrobiłem aktualizację w swoim programie. Dotąd wszystko było wporządku. Program sprawdzał czy w stałej jest mniejsza liczba niż na serwerze w pliku ini i jeżeli była mniejsza to pytał czy ściągnąć.
Problem pojawił się jednak gdy chciałem zrobić aktualizację "bazy danych". Polega ona na tym że wpisane są tam informacje o pewnych graczach oraz wpisana jest wersja bazy danych no i link wrazie gdy trzeba byłoby ją ściągnąć.

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, HTTPGet, StdCtrls, INIFiles, ComCtrls, Buttons;

type
  TForm4 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    HTTPGet1: THTTPGet;
    HTTPGet2: THTTPGet;
    SaveDialog1: TSaveDialog;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure HTTPGet1DoneFile(Sender: TObject; FileName: String;
      FileSize: Integer);
    procedure HTTPGet1Error(Sender: TObject);
    procedure HTTPGet2DoneFile(Sender: TObject; FileName: String;
      FileSize: Integer);
    procedure HTTPGet2Error(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

const
   version = '0.1.1.0';


implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
begin
HTTPGet1.URL := 'http://www.magnum007.republika.pl/setup.ini';  //lokalizacja pliku z informacją
HTTPGet1.FileName := ExtractFilePath(Application.ExeName) + 'setup.ini';
HTTPGet1.GetFile;  //pobranie pliku ini
Memo1.Lines.Add('Pobieranie informacji...');
end;

procedure TForm4.HTTPGet1DoneFile(Sender: TObject; FileName: String;
  FileSize: Integer);
var
INI  : TINIFile;
updtVersion : string;
cyfra1 : integer;
cyfra2 : integer;
cyfra3 : integer;
cyfra4 : integer;
updtCyfr1 : integer;
updtCyfr2 : integer;
updtCyfr3 : integer;
updtCyfr4 : integer;
begin
Memo1.Lines.Add('Sprawdzanie, czy jest nowa wersja...');
INI := TINIFile.Create(HTTPGet1.FileName);
try
   updtVersion := INI.ReadString('update','version','');  //odcytanie wersji z pliku ini

   //nie śmiejcie sie z tego sposobu. to tylko przykład :)
   cyfra1 := StrToInt(version[1]);
   cyfra2 := StrToInt(version[3]);
   cyfra3 := StrToInt(version[5]);
   cyfra4 := StrToInt(version[7]);
   updtCyfr1 := StrToInt(updtVersion[1]);
   updtCyfr2 := StrToInt(updtVersion[3]);
   updtCyfr3 := StrToInt(updtVersion[5]);
   updtCyfr4 := StrToInt(updtVersion[7]);
   if (cyfra1 < updtCyfr1) or (cyfra2 < updtCyfr2) or (cyfra3 < updtCyfr3) or (cyfra4 < updtCyfr4) then  //sprawdzenie, czy jest nowa wersja
   begin
     Memo1.Lines.Add('Jest nowa wersja bazy danych!');

{wyświetlenie zapytania. Jeśli użytkownik wybierze Tak, rozpoczyna się pobieranie programu }
     if Application.MessageBox('Czy chcesz pobrać nową wersję bazy danych?','Nowa wersja bazy danych!',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 bazy danych');
finally
   INI.Free;
end;

end;

procedure TForm4.HTTPGet1Error(Sender: TObject);
begin
Memo1.Lines.Add('Wystąpił błąd!');
end;

procedure TForm4.HTTPGet2DoneFile(Sender: TObject; FileName: String;
  FileSize: Integer);
begin
Memo1.Lines.Add('Pobieranie zakończone sukcesem!');
end;

procedure TForm4.HTTPGet2Error(Sender: TObject);
begin
Memo1.Lines.Add('Wystąpił błąd podczas pobierania pliku!');
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
Form4.Caption := 'Aktualizacja bazy danych';
end;

end.
  1. Po pierwsze. Program aktualizuje plik z serwera nawet gdy wcisnę, że nie chcę go aktualizować.
  2. Po drugie. Program pobiera wersje ze stałej oraz z serwera. I jeżeli zrobię raz aktualizację bazy, to wersja która jest w stałej się nie zmieni i gdy użytkownik sprawdzi czy jest nowa wersja to się okaże że jest chociaż to nie prawda ;/
    Wymyśliłem, że rozwiązaniem mogłoby być, aby pobierana była wersja z pliku setup.ini (baza danych, która jest na dysku) i porównywana z plikiem setup.ini który jest na serwerze. I jeżeli wersje by się nie zgadzały, to ściągana byłaby wersja z serwera.

Mam nadzieję że da się to jakoś zrobić. Myślałem, i próbowałem zrobić zmienną INI2 ale to nic nie pomagało ;/

Pozdrawiam!</delphi>

0

Ad1. Ja bym proponował zamienić na coś takiego:

 case  Application.MessageBox('Czy chcesz pobrać nową wersję bazy danych?','Nowa wersja bazy danych!',MB_YesNo) of
     IDYes    : exit;
     IDNo     :
    begin
       HTTPGet2.URL := INI.ReadString('update','url','');
       if SaveDialog1.Execute then  // tu użytkownik wybierze, gdzie zapisać program
       begin
         HTTPGet2.FileName := SaveDialog1.FileName;
         HTTPGet2.GetFile;  //pobieranie pliku
         Memo1.Lines.Add('Pobieranie pliku...');
       end;
    end;
 end ;

Działa na 100% sprawdzone!!!!! tylko nie wiem czy sie end-y zgadzaja!!!!

Ad2.
Zmien to 'version = '0.1.1.0';'. W oncreate dodaj linijke aby program sprawdzal plik ini i odczytywal obecna baze pliku. A po sciagnieciu daj aby zapisywal aktualna baze ktora zostala sciagnieta z serwera. Proste!!!!
[browar]

0

Co do AD.1 to teraz nawet gdy wersja się nie zgadza to ściąga bez pytania, chociaż dodał do memo że nie ma najnowszej wersji. Stawiam na to że najpierw ściąga a później sprawdza ;/ i Tak chyba rzeczywiście jest. Spróbuje to napisać jeszcze raz bo wcześniej było ok. Dalej jednak nie wiem co zrobić z tą aktualizacją bazy (co do tego ad2). ;/
Mógłbyś jakoś prościej wytłumaczyć ad2 :P?
pzdr.

0

sprobuj cos takiego:

  case  Application.MessageBox('Czy chcesz pobrać nową wersję bazy danych?','Nowa wersja bazy danych!',MB_YesNo) of
     IDYes    : showmessage('Wybrano tak');
     IDNo     : showmessage('Wybrano nie');
end ; 

I to dziala czyli masz cos spieprozne po drodze!!!!

A co do ad2. to tak
Zapisujesz przy pobieranio nowszej wersji bazy z serwera numer nowszej wersji w pliku ini twojego programu, ktory znajduje sie na dysku. Podczas ponownego sprawdzania czy jest nowsza wersja pobierasz z tego pliku wersje bazy znajdujaca
sie na dysku a nastepnie porownujesz nia z ta wersja ktora znajduje sie na serwerze. Czyli musisz wywalic tego cont-a. Bo jest to wartosc stala. Chyba teraz wyjasnilem to troszke jasniej.

0

Ojoj, ten problem nie leży w tym tak, nie. On zanim zapyta czy ma ściagnąć ściaga plik i go zastąpia.
Co do ad2 to chcĘ zrobić tak, żeby sprawzdał jaka wersja jest w pliku na dysku i jaka na serwerze, porównywał i jak coś to ściagał. Tylko nie umiem tego zrobić ;/ Bo on ściąga mi wersje z serwera i wersje z serwera a to jest to samo ;/ i zawsze wychodzi że nie ma nowej wersji ;/

0

No bo to bylo na odwrot. Teraz powinno dzialc.

 case  Application.MessageBox('Czy chcesz pobrać nową wersję bazy danych?','Nowa wersja bazy danych!',MB_YesNo) of
     IDNo    : exit;
     IDYes    :
    begin
       HTTPGet2.URL := INI.ReadString('update','url','');
       if SaveDialog1.Execute then  // tu użytkownik wybierze, gdzie zapisać program
       begin
         HTTPGet2.FileName := SaveDialog1.FileName;
         HTTPGet2.GetFile;  //pobieranie pliku
         Memo1.Lines.Add('Pobieranie pliku...');
       end;
    end;
end ;

A co do ad.2.
Masz plik config.ini polegajacy na tym ze zapisuje konfiguracje programu na dysku. w tym wersje bazy ktora jest obecnia.
Teraz tak dajesz sprawdz czy jest nowsza baza czyli pobieraz plik i zapisujesz go np. jako wersja.ini. Sprawdzasz czy ta wersja ktora jest na serwerze jest nowsza od tej ktora posiada klient na dysku, jezeli tak to pobierasz ta baze i zapisujesz w pliku config.ini ta wersje z wersja.ini. i to by bylo na tyle. Inaczej nie umiem tego wytlumaczyc. A jak mi sie bedzie chcialo to napisze Ci kodzik. Ale tak szczeze to wolalbym abys Ty to zrobil bo wkoncu to Twoj program a nie moj. Pozdrawiam i pomysl troszke bo to naprawde nie jest trudne!!!!!

Co do ad2 to chcĘ zrobić tak, żeby sprawzdał jaka wersja jest w pliku na dysku i jaka na serwerze, porównywał i jak coś to ściagał. Tylko nie umiem tego zrobić ;/ Bo on ściąga mi wersje z serwera i wersje z serwera a to jest to samo ;/ i zawsze wychodzi że nie ma nowej wersji ;/

A co do tego to mawsz racje w Twoim kodzie brakowalo

Begin

i End

 w if... then gdy nie ma begin i end-a to bierze tylko pierwsza linijke pod then tj.
HTTPGet2.FileName := SaveDialog1.FileName;
ale reszta tego kodziku tj.:
HTTPGet2.GetFile;  //pobieranie pliku
Memo1.Lines.Add('Pobieranie pliku...');
wykonywalo sie....
No i teraz to by bylo na tyle.... Pozdrawiam i jeszcze raz powodzenia...
0

Niestety nie poradziłem sobie ;/ Jestem tuman.
Zrobie po prostu tak że zamiast wyboru czy chcĘ ściągnąć czy nie wpisze że plik został ściągnięty ("a no bo najlepiej pójść na łatwizne" - babka na polskim w podstawówce).
Dzieki Cymes za wysiłek :)

pzdr.

0

Ok, pojawił się kolejny problem, dopisuje się do tematu żeby niepotrzebnie nie zaśmiecać forum.
Otóż chciałbym aby program pobierał wersję bazy danych z pliku i serwera. Wyświetlał później w labelach, że Twoja wersja jest taka i taka, a aktualna jest taka i taka.

Procedura wygląda tak:

procedure TForm4.FormCreate(Sender: TObject);
var
INI  : TINIFile;
updtVersion : string;
updtVersion2 : string;
begin
Form4.Caption := 'Aktualizacja bazy danych';
INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'setup.ini');
  try
   updtVersion := INI.ReadString('update','version','');  //odczytanie wersji z pliku ini
  Label2.Caption := updtVersion;
  finally
   INI.Free;
end;
INI := TINIFile.Create('http://www.magnum007.republika.pl/setup.ini');
  try
   updtVersion2 := INI.ReadString('update','version','');  //odczytanie wersji z pliku ini
  Label3.Caption := updtVersion2;
  finally
   INI.Free;
end;
end;
end.

Teraz ten Label2 się łądnie wczytuje (tj. wczytuje z pliku na dysku) ale ten z serwera się nie wczytuje :(
Prosze o pomoc.
Pozdrawiam.

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