Plik o formacie bazodanowym - obsługa

0

Witam,

Pracuję obecnie nad progamem - edytorem list kanałów (settingów) do mojego tunera cyfrowego. Chcę mieć możliwość otwierania/edycji i zapisu. Niestety w trakcie okazało się, że sprawa jest znacznie bardziej złożona niż sobie wyobrażałem :(

Miałem nieco problemów z przygotowaniem procedury odczytującej określony fragment pliku, ale już nieco wybrnąłem - oto co powstało (podpierałem się jednym z przykładów z 4programmers):

procedure TNSSetEditMain.Button1Click(Sender: TObject);
var
F, Dst : file;
Buff : array[0..7] of char;
BytesRead : Integer;
begin
AssignFile(F, 'C:\Documents and Settings\Dj. Kadet\Pulpit\NS SetEdit\lista.sdx');
Reset(F, 1);
Seek(F, 68);
AssignFile(Dst, 'C:\Documents and Settings\Dj. Kadet\Pulpit\NS SetEdit\Test.txt');
Rewrite(Dst, 1);
if BytesRead > 0 then
begin
  BlockRead(F, Buff, 7, BytesRead);
  BlockWrite(Dst, Buff, BytesRead)
end;
CloseFile(F);
CloseFile(Dst);
Application.MessageBox('Odczyt zakończony powodzeniem','Super chruper :P', 0)
end;

Procedurka jak widać odczytuje plik od 68 bajtu - <ort>szczytuje </ort> <font color="orange">[czy ty wiesz co to znaczy szczytować!?? pq] </span>7 bajtów. Niestety aktualnie to nie jest jeszcze to co mi potrzebne:

  1. Jak po odczycie wynik wyświetlić w Edit, a nie zapisywać do pliku ???
  2. Chciałbym, aby procedura inteligentnie sama wiedziała ile ma odczytać - nie wpisywać na sztywno "7", ale żeby odczyt kończył się, gdy procedura trafi na zdefiniowany wcześniej znak (np.: HEX 00 lub FF).

Żeby bardziej obrazowo pokazać o co mi chodzi - przykład:

Ala ma kotaDelphi errorBorlandAQQ

Problem polega na zrobieniu w tym wypadku odczytu np.: od znaku 13 (to załatwi seek) do pierwszego trafionego ^ (powinno zwrócić "Delphi error").

Czyli efekt - rozpoznanie długości odczytywanego elementu i odpowiednie dynamiczne zarządzanie rozmiarem bufora danych - tak aby odczytało do znaku i koniec, a wynik pracy zwróciło nie zapisując do pliku, a wyświetlając w Edicie.

  1. To już bardziej ogólnie - program po ukończeniu może być dość pamięciożerny, dlatego proszę o rzucenie okiem na tą procedurkę, którą wkleiłem - jeśli da się jeszcze w jakiś sposób zaoszczędzić pamięci - proszę o info

Próbowałem uzyskać pomoc na forum ks-ekspert, ale jakoś brak odzewu; chyba niemożliwe, żeby się nie dało tego wykonać :-|

0

Naprawdę nikt nie pomoże ;( Chociaż napiszcie, że się nie da - to się przestanę męczyć nad tym ;(

0

jakby to było takie ważne to już byś dawno znalazł!

var
f: file of char;
znak: char;
tekst: string;
begin
AssignFile(F, 'C:\Documents and Settings\Dj. Kadet\Pulpit\NS SetEdit\lista.sdx');
Reset(F, 1);
Seek(F, 68);
tekst := '';
while not EoF(f) do
begin
  Read(f, znak);
  while znak <> '^' do
  begin
    tekst := tekst + Znak;
    Read(f, znak);
  end;
end;
0

To nie jest takie łatwe jak by się wydawało (przykład miał tylko pokazać, że chodzi o to, żeby progz znajdował sam - nieco uprościłem w nim sprawę)...

Procedura, którą proponujesz zwraca "Read beyond end of file". Nie ważne jaki znak podam przy:

while

Do tego pojawia się konieczność ucięcia:

Reset(F);

czyli dania bez drugiego parametru, bo wywala - zbyt dużo parametrów.
Z kolei usunięcie "of char" z:

F: file of char;

uniemożliwi kompilację (Incompatible types).

Do tego procedura wymaga wpisania znaku ASCII, ale jak tu wpisać odpowiednik szesnastkowego 00, czy FF (rozdzielają dane). Włąściwie w ogóle jak taki znak wprowadzić do kodu :|

W każdym razie dzięki za pomoc :) Każdy post z podpowiedzią się liczy.

Czekam na dalsze pomysły; może ktoś widział gdzieś jakiś kodzik, który może pomóc [???]

0
Dj. Kadet napisał(a)

Procedura, którą proponujesz zwraca "Read beyond end of file". Nie ważne jaki znak podam przy:

bo ten znak powinien w moim wypadku występować na końcu (poniżej poprawiony kod bez tego ograniczenia)

Do tego pojawia się konieczność ucięcia:

Reset(F);

czyli dania bez drugiego parametru, bo wywala - zbyt dużo parametrów.

bo ten kawałek skopiowałem z Twojego kodu, nie powinno go tam być :)

Do tego procedura wymaga wpisania znaku ASCII, ale jak tu wpisać odpowiednik szesnastkowego 00, czy FF (rozdzielają dane). Włąściwie w ogóle jak taki znak wprowadzić do kodu :|

var Znak: Char;
...
Znak := #$00; //szesnastkowo
Znak := #$FF; //szesnastkowo
Znak := #32; //dziesiętnie

A tu poprawiony kod:

var
f: file of char;
znak: char;
tekst: string;
begin
AssignFile(F, 'C:\Documents and Settings\Dj. Kadet\Pulpit\NS SetEdit\lista.sdx');
Reset(F);
Seek(F, 68);
tekst := '';
while not EoF(f) do
begin
  read(f, znak);
  while (not EoF(f)) and (znak <> '^') do
  begin
    tekst := tekst + Znak;
    read(f, znak);
  end;
end;
0

Traciłem już nadzieję, ale DZIAŁA !!!

Pozwoliłem sobie na dwie zmiany:

  • brakuje end; jednego ;)
  • wywaliłem while not EoF(f) do przed procedurą odczytu szukanego ciągu znaków (czyli ten pierwszy), nie wiem tylko czy dobrze zrobiłem - czy można to wywalić? Z obecnością tej linii mimo, że procedura odczytała szukany ciąg program robił coś dalej (dłubał chyba dalej w pliku) i troche to trwało, a efektem było przywieszenie się całego programu do momentu aż przestanie dłubać. Po usunięciu tej linii wartość odczytywana jest natychmiast.

Dzięki za pomoc [browar] Będę pamiętać przy robieniu okienka "O programie..." :d
Mam nadzieję, że dalej sobie już poradzę - to było chyba najgorsze do zrobienia ;) Ale jakby co to będę pisać ;P

0

i troche to trwało, a efektem było przywieszenie się całego programu do momentu aż przestanie dłubać

Dobrym pomysłem byłoby użycie Application.ProcessMessages;

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