Pliki typowane-edycja rekordu

0

Tak, znowu ja...
Piszę sobie dalej program do obsługi magazynu, i utknąłem przy zmianie istniejących rekordów w bazie danych (pliki typowane).
Na logikę: żeby zmienić jakiś rekord trzeba go nadpisać nowym.
Problem w tym że gdy mam plik o takiej strukturze (nie czepiać się szczegółów ;) )

REKORD 0
REKORD 1
REKORD 2
REKORD 3

to gdy chcę zmienić rekord nr 1 to robię Seek(Plik,1); Write(Plik,RekordPoprawiony)Tyle że wtedy wygląda to tak jakby Seek ustawiał kursor na KOŃCU "REKORD 1" i nadpisuje "REKORD 2". Teoretycznie można cofnąć Seek o 1, ale jak wtedy edytować pierwszy rekord? Zależy mi na tym żeby to było możliwe. Czy może jedyne wyjście to "poświęcić" rekord zero na rzecz edycji, i właściwe dane trzymać w rekordach od 1 w górę?
Na google mało jest o edycji rekordów w delphi tak jak i w innych językach (myślałem że może coś zaadoptuję ;) )...

Pozdrawiam
Paweł Lis

0

Nie wiem jak wygląda Twój kod, ale najprawdopodobniej musiałeś się gdzieś pomylić, bo Seek(ZmiennaPlikowa, 0) zawsze ustawia znacznik pliku przed pierwszym rekordem. Gdyby było inaczej, to byłaby to niewątpliwie poważna wpadka programistów Borlanda (brak możliwości edytowania pierwszego elementu).

Poniżej mały przykład, że jest tak jak napisałem. Otwórz plik Rekord.txt, a sam się przekonasz

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
    Zm: Byte;
    Plik: file of Byte;
begin
  AssignFile(Plik, 'C:\Rekord.txt');  // Nietypowo plik tekstowy, dla łatwego sprawdzenia
  Rewrite(Plik);
  Zm:= Ord('a');
  for i:= 1 to 10 do Write(Plik, Zm);
  Seek(Plik, 0);                      // Ustaw pozycje pliku przed pierwszym rekordem
  Zm:= Ord('b');
  Write(Plik, Zm);
  CloseFile(Plik);
end;
0

Fajnie że dałeś przykład bo coś mi uświadomił. Seek ustawia kursor tam gdzie ROZPOCZYNA SIĘ edycja, czyli tam gdzie cała zabawa ma tylko początek ;) czyli każde Read i Write robi swoje i przesuwa kursor.
U mnie to było tak że chciałem odczytać pierwszy rekord, zmienić mu tylko kilka wartości i zapisać. Wyglądało to tak:

Seek(Plik,0);
Read(Plik, Rekord);
Rekord.Data:=DateTimePicker1;
Seek(Plik,0); { Read po odczytaniu zerowego rekordu ustawiał kursor na jego końcu, więc trzeba (a jednak!) wrócić na początek ręcznie... }
Write(Plik,Rekord);

Właśnie to mnie w Twoim przykładzie zastanowiło że Write(Plik, Zm); jest jakoś tak luzem ;) Bez Seek który by się ustawiał na kolejnym rekordzie.

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