Ĺadny brzuch
Kożystam z ListBox'a. Zapisuje dodane rekordy do pliku z rozszeżeniem .baz. Poszczególne kolumny oddzielam znakami #0 , a koniec rekordu #0#0#0 . Procedura wygląda tak:
procedure TOkno.mnZapiszClick(Sender: TObject); var Plik: File of Byte; Bajt: Byte; i: Integer; begin if NazwaPliku='' then mnZapiszJakoClick(Sender) else begin Randomize; Dane:=''; for i:=0 to Lista.Items.Count-1 do Dane:=Dane + Lista.Items[i].Caption + '#0' + Lista.Items[i].SubItems[0] + '#0' + Lista.Items[i].SubItems[1] + '#0' + Lista.Items[i].SubItems[2] + '#0' + Lista.Items[i].SubItems[3] + '#0' + Lista.Items[i].SubItems[4] + '#0' + Lista.Items[i].SubItems[5] + '#0' + Lista.Items[i].SubItems[6] + '#0' + Lista.Items[i].SubItems[7] + '#0'; Dane:=Dane + '#0#0#0'; try AssignFile (Plik, NazwaPliku); Rewrite (Plik); Write (Plik); for i:=1 to Length (Dane) do begin Bajt:=Ord (Dane [i]); Write (Plik, Bajt); end; CloseFile (Plik); except ShowMessage('Wystąpił błąd'); end; end; end;
Zapisuje wszystko ładnie. Gdy chcę odczytać bazę to nic nie robi.
Procedura wczytywania bazy tak wygląda:
procedure TOkno.WczytajBaze(S : String); var Plik : File of Byte; x : Integer; A : String; B : String; Item : TListItem; begin NazwaPliku:=S; Dane:=''; AssignFile(Plik,NazwaPliku); Reset(Plik); Read(Plik); X:=Pos('#0#0#0',Dane); Delete(Dane,X+1,Length(Dane)); X:=Pos('#0',Dane); while X>0 do begin A:=Copy(Dane,1,X-1); Delete(Dane,1,X); X:=Pos('#0',Dane); B:=Copy(Dane,1,X-1); Delete(Dane,1,X); if (A<>'') and (B<>'') then begin Item := Lista.Items.Add; Item.Caption := A; Item.SubItems.Add(B); end; X:=Pos('#0',Dane); end; end;
Jest to przerobiony kod, na podstawie tych(ten kod jest z zaszyfrowaniem danych, a ja to wyżuciłem).
Zapis bazy
procedure TOkno.mnZapiszBazeClick(Sender: TObject); var Plik : File of Byte; Bajt : Byte; i : Integer; begin {inicjujemy generator liczb losowych} Randomize; {na początku dane są puste} Dane:=''; {zapisujemy dane z listy oddzielając je od siebie znakiem #0} for i:=0 to Lista.Items.Count-1 do Dane:=Dane+Lista.Items[i].Caption+#0+Lista.Items[i].SubItems[0]+#0; {dopisujemy znacznik konca danych #0#0#0} Dane:=Dane+#0#0#0; {uzupełniamy dalej dane "śmieciami" o losową długość} for i:=1 to Length(Dane)+Random(2048)+100 do Dane:=Dane+Chr(Random(256)); {generujemy losową liczbę} Klucz.SRAND:=Random(256); {szyfrujemy dane obliczając jednocześnie ich sumę kontrolną} SumaKontrolna:=0; Szyfruj(Dane); {zapisujemy wszystko do pliku} try AssignFile(Plik,NazwaPliku); Rewrite(Plik); Write(Plik,Klucz.Typ); {najpierw typ} Write(Plik,Klucz.SRAND); {później losową liczbę} BlockWrite(Plik,SumaKontrolna,sizeof(SumaKontrolna)); {następnie sumę kontrolną} for i:=1 to Length(Dane) do begin Bajt:=Ord(Dane[i]); Write(Plik,Bajt); {no i dane} end; CloseFile(Plik); except ShowMessage('Wystąpił błąd podczas zapisu danych.'); end; end;
Wczytaj baze
procedure TOkno.WczytajBazeDanych(S : String); var Plik : File of Byte; PlikK: File of Byte; i,x : Integer; NowaSumaKontrolna : Longint; Wczytano : Longint; Bufor : array[0..1023] of Byte; A,B : String; Item : TListItem; VolumeSerialNumber : DWORD; MaximumComponentLength: DWORD; FileSystemFlags : DWORD; begin {zapamiętujemy nazwę otwieranej bazy} NazwaPliku:=S; {na początku dane i suma kontrolna są puste} Dane:=''; SumaKontrolna:=0; {wczytujemy plik} AssignFile(Plik,NazwaPliku); Reset(Plik); Read(Plik,Klucz.Typ); {najpierw typ} Read(Plik,Klucz.SRAND); if Klucz.Bufor='' then {jeśli pusty klucz to...} if Klucz.Typ=0 then {jak typ 0 - prosimy o hasło} begin OknoHaslo.eHaslo.Text:=''; OknoHaslo.ShowModal; Klucz.Bufor:=OknoHaslo.eHaslo.Text; Klucz.Serial:=''; Klucz.Dysk:=''; end else {a jak nie - prosimy o plik klucza} begin if OknoOtworzKlucz.Execute then begin {pobieramy literę dysku} Klucz.Dysk:=Copy(OknoOtworzKlucz.FileName,1,3); try {odczytujemy klucz} AssignFile(PlikK,OknoOtworzKlucz.FileName); Reset(PlikK); while not Eof(PlikK) do begin BlockRead(PlikK,Bufor,sizeof(Bufor),Wczytano); for i:=0 to Wczytano-1 do Klucz.Bufor:=Klucz.Bufor+Chr(Bufor[i]); end; CloseFile(PlikK); except ShowMessage('Błąd odczytu pliku klucza.'); end; end; end; {jak nadal nie mamy klucza - znaczy złe hasło} if Klucz.Bufor='' then begin CloseFile(Plik); ShowMessage('Podano złe hasło!'); exit; end; {odczytujemy sumę kontrolną} BlockRead(Plik,NowaSumaKontrolna,sizeof(NowaSumaKontrolna)); {no i odczytujemy dane} while not eof(Plik) do begin BlockRead(Plik,Bufor,SizeOf(Bufor),Wczytano); for i:=0 to Wczytano-1 do Dane:=Dane+Chr(Bufor[i]); end; CloseFile(Plik); if Klucz.Typ=2 then begin {pobieramy informacje o numerze seryjnym dla danego dysku} if GetVolumeInformation(PChar(Klucz.Dysk),nil,0,@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags, nil,0) then begin Klucz.Serial:=IntToHex(HiWord(VolumeSerialNumber), 4)+'-'+IntToHex(LoWord(VolumeSerialNumber),4); end else begin ShowMessage('Nie mogę pobrać informacji o numerze seryjnym!'); exit; end; end; {deszyfrujemy wczytane dane} Deszyfruj(Dane); {jak nie zgadza się suma kontrolna to błąd} if SumaKontrolna<>NowaSumaKontrolna then begin ShowMessage('Podano złe hasło!'); exit; end; {usuwamy śmieci - od znacznika #0#0#0} X:=Pos(#0#0#0,Dane); Delete(Dane,X+1,Length(Dane)); {dekodujemy poszczególne linie} X:=Pos(#0,Dane); while X>0 do begin A:=Copy(Dane,1,X-1); Delete(Dane,1,X); X:=Pos(#0,Dane); B:=Copy(Dane,1,X-1); Delete(Dane,1,X); if (A<>'') and (B<>'') then begin Item := Lista.Items.Add; Item.Caption := A; Item.SubItems.Add(B); end; X:=Pos(#0,Dane); end; {aktualizujemy ustawienia} Lista.Visible:=TRUE; mnDane.Enabled:=TRUE; mnZapiszBaze.Enabled:=TRUE; mnZamknijBaze.Enabled:=TRUE; end;
Dlaczego mi nie wczytuje bazy?? Co jest nie tak!!
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
procedure TOkno.mnZapiszClick(Sender: TObject); var Plik: File of Byte; Bajt: Byte; i: Integer; begin if NazwaPliku='' then mnZapiszJakoClick(Sender) else begin Randomize; Dane:=''; for i:=0 to Lista.Items.Count-1 do Dane:=Dane + Lista.Items[i].Caption + '#0' + Lista.Items[i].SubItems[0] + '#0' + Lista.Items[i].SubItems[1] + '#0' + Lista.Items[i].SubItems[2] + '#0' + Lista.Items[i].SubItems[3] + '#0' + Lista.Items[i].SubItems[4] + '#0' + Lista.Items[i].SubItems[5] + '#0' + Lista.Items[i].SubItems[6] + '#0' + Lista.Items[i].SubItems[7] + '#0'; Dane:=Dane + '#0#0#0'; try AssignFile (Plik, NazwaPliku); Rewrite (Plik); Write (Plik); for i:=1 to Length (Dane) do begin Bajt:=Ord (Dane [i]); Write (Plik, Bajt); end; CloseFile (Plik); except ShowMessage('Wystąpił błąd'); end; end; end;
Zapisuje wszystko ładnie. Gdy chcę odczytać bazę to nic nie robi.
Procedura wczytywania bazy tak wygląda:
procedure TOkno.WczytajBaze(S : String); var Plik : File of Byte; x : Integer; A : String; B : String; Item : TListItem; begin NazwaPliku:=S; Dane:=''; AssignFile(Plik,NazwaPliku); Reset(Plik); Read(Plik); X:=Pos('#0#0#0',Dane); Delete(Dane,X+1,Length(Dane)); X:=Pos('#0',Dane); while X>0 do begin A:=Copy(Dane,1,X-1); Delete(Dane,1,X); X:=Pos('#0',Dane); B:=Copy(Dane,1,X-1); Delete(Dane,1,X); if (A<>'') and (B<>'') then begin Item := Lista.Items.Add; Item.Caption := A; Item.SubItems.Add(B); end; X:=Pos('#0',Dane); end; end;
Jest to przerobiony kod, na podstawie tych(ten kod jest z zaszyfrowaniem danych, a ja to wyżuciłem).
Zapis bazy
procedure TOkno.mnZapiszBazeClick(Sender: TObject); var Plik : File of Byte; Bajt : Byte; i : Integer; begin {inicjujemy generator liczb losowych} Randomize; {na początku dane są puste} Dane:=''; {zapisujemy dane z listy oddzielając je od siebie znakiem #0} for i:=0 to Lista.Items.Count-1 do Dane:=Dane+Lista.Items[i].Caption+#0+Lista.Items[i].SubItems[0]+#0; {dopisujemy znacznik konca danych #0#0#0} Dane:=Dane+#0#0#0; {uzupełniamy dalej dane "śmieciami" o losową długość} for i:=1 to Length(Dane)+Random(2048)+100 do Dane:=Dane+Chr(Random(256)); {generujemy losową liczbę} Klucz.SRAND:=Random(256); {szyfrujemy dane obliczając jednocześnie ich sumę kontrolną} SumaKontrolna:=0; Szyfruj(Dane); {zapisujemy wszystko do pliku} try AssignFile(Plik,NazwaPliku); Rewrite(Plik); Write(Plik,Klucz.Typ); {najpierw typ} Write(Plik,Klucz.SRAND); {później losową liczbę} BlockWrite(Plik,SumaKontrolna,sizeof(SumaKontrolna)); {następnie sumę kontrolną} for i:=1 to Length(Dane) do begin Bajt:=Ord(Dane[i]); Write(Plik,Bajt); {no i dane} end; CloseFile(Plik); except ShowMessage('Wystąpił błąd podczas zapisu danych.'); end; end;
Wczytaj baze
procedure TOkno.WczytajBazeDanych(S : String); var Plik : File of Byte; PlikK: File of Byte; i,x : Integer; NowaSumaKontrolna : Longint; Wczytano : Longint; Bufor : array[0..1023] of Byte; A,B : String; Item : TListItem; VolumeSerialNumber : DWORD; MaximumComponentLength: DWORD; FileSystemFlags : DWORD; begin {zapamiętujemy nazwę otwieranej bazy} NazwaPliku:=S; {na początku dane i suma kontrolna są puste} Dane:=''; SumaKontrolna:=0; {wczytujemy plik} AssignFile(Plik,NazwaPliku); Reset(Plik); Read(Plik,Klucz.Typ); {najpierw typ} Read(Plik,Klucz.SRAND); if Klucz.Bufor='' then {jeśli pusty klucz to...} if Klucz.Typ=0 then {jak typ 0 - prosimy o hasło} begin OknoHaslo.eHaslo.Text:=''; OknoHaslo.ShowModal; Klucz.Bufor:=OknoHaslo.eHaslo.Text; Klucz.Serial:=''; Klucz.Dysk:=''; end else {a jak nie - prosimy o plik klucza} begin if OknoOtworzKlucz.Execute then begin {pobieramy literę dysku} Klucz.Dysk:=Copy(OknoOtworzKlucz.FileName,1,3); try {odczytujemy klucz} AssignFile(PlikK,OknoOtworzKlucz.FileName); Reset(PlikK); while not Eof(PlikK) do begin BlockRead(PlikK,Bufor,sizeof(Bufor),Wczytano); for i:=0 to Wczytano-1 do Klucz.Bufor:=Klucz.Bufor+Chr(Bufor[i]); end; CloseFile(PlikK); except ShowMessage('Błąd odczytu pliku klucza.'); end; end; end; {jak nadal nie mamy klucza - znaczy złe hasło} if Klucz.Bufor='' then begin CloseFile(Plik); ShowMessage('Podano złe hasło!'); exit; end; {odczytujemy sumę kontrolną} BlockRead(Plik,NowaSumaKontrolna,sizeof(NowaSumaKontrolna)); {no i odczytujemy dane} while not eof(Plik) do begin BlockRead(Plik,Bufor,SizeOf(Bufor),Wczytano); for i:=0 to Wczytano-1 do Dane:=Dane+Chr(Bufor[i]); end; CloseFile(Plik); if Klucz.Typ=2 then begin {pobieramy informacje o numerze seryjnym dla danego dysku} if GetVolumeInformation(PChar(Klucz.Dysk),nil,0,@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags, nil,0) then begin Klucz.Serial:=IntToHex(HiWord(VolumeSerialNumber), 4)+'-'+IntToHex(LoWord(VolumeSerialNumber),4); end else begin ShowMessage('Nie mogę pobrać informacji o numerze seryjnym!'); exit; end; end; {deszyfrujemy wczytane dane} Deszyfruj(Dane); {jak nie zgadza się suma kontrolna to błąd} if SumaKontrolna<>NowaSumaKontrolna then begin ShowMessage('Podano złe hasło!'); exit; end; {usuwamy śmieci - od znacznika #0#0#0} X:=Pos(#0#0#0,Dane); Delete(Dane,X+1,Length(Dane)); {dekodujemy poszczególne linie} X:=Pos(#0,Dane); while X>0 do begin A:=Copy(Dane,1,X-1); Delete(Dane,1,X); X:=Pos(#0,Dane); B:=Copy(Dane,1,X-1); Delete(Dane,1,X); if (A<>'') and (B<>'') then begin Item := Lista.Items.Add; Item.Caption := A; Item.SubItems.Add(B); end; X:=Pos(#0,Dane); end; {aktualizujemy ustawienia} Lista.Visible:=TRUE; mnDane.Enabled:=TRUE; mnZapiszBaze.Enabled:=TRUE; mnZamknijBaze.Enabled:=TRUE; end;
Dlaczego mi nie wczytuje bazy?? Co jest nie tak!!