Usuwanie rekordów z tabeli.

0

Może, ktoś ma pomysł jak usuwać rekordy z tabeli dane w której są umieszczone rekordy baza? Dispose? jeżeli tak to jak jej użyć bo mi się pomysły skończyły?

const N=1000;
      NazwaPliku='baza_danych.dat';

type baza= record
        imie: string[20];
        ntstac: string[10];
        ntkom: string[9]
        end;

var dane:array[1..N] of baza;
    wybor: char;
    i, j, nA, LbPoz: integer;
    selektor: string[20];
0

jak to jest pascal to jedynie przesunąć wszystkie, które są "nad" usuwanym o 1 pozycję w dół

jak to delphi to zamiast tablicy zastosować TList

0

Dobra zilustrujmy problem:

user image

chce usunąć rekord w tablicy oznaczony szarym paskiem. Jak to zrobić? Może, ktoś podać konkretny wycinek kodu?

0
Halva napisał(a)

Dobra zilustrujmy problem:

user image

chce usunąć rekord w tablicy oznaczony szarym paskiem. Jak to zrobić? Może, ktoś podać konkretny wycinek kodu?

Misiek już Ci napisał...
Przyrównujesz do siebie indeksy kolejnych rekordów z tablicy dane, po tym wierszu.

dane[4]:=dane[5];
dane[5]:=dane[6];

itd.(tylko nie rób ściemy i użyj pętli ;))
A ostatni rekord po przypisaniu po prostu czyścisz

0

Ok dobra, wartość dane[4] zostanie zastąpiona wartością dane[5] i tak dalej. Załóżmy że tabela ma 5 rekordów, które są zapełnione jakimiś danymi, imie, numer stacjonarny i komórkowy. Ja chce usunąć dane klienta z rekordu 4. przypisuje dane[4] zawartość dane[5], poczym czyszcze dane[5].
W ten sposob klient z pozycji 5 przenosi sie na poz 4 kasujac klienta z poz 4. Wszyskto bylo by ok, gdyby nie to, ze po wypisaniu zawartości tabeli, program pokazuje dalej 5 wersów tylko że 5 jest pusty. Weźmy na przykład taką sytuację, gdy do tabeli, nowe rekordy dopisywane sa dnamicznie, i załóżmy ze jest ich już 980, wg. tej metody usuwania, usuwamy 300 ostatnich rekordow. Owszem, zostaną one opróżnione, ale nadal beda istniec, i program przy wypisywaniu ich wyswiteli 980 rekordow tylko ze 300 ostatnie bedzie puste, a ja chce zeby on nie pokazywal mi tych 300 pustych wpisow bo po co to komu?

Chyba, ze znacie jakąś inną metodę czyszczenia ostatniego rekordu niż ja. Jak go czyścicie?

0

ech szkoda słów - żeby nie rozumieć własnegoi programu ...

N=1000;
dane:array[1..N] of baza;

twój kod :> to by wynikało, że zawsze masz 1000 rekordów, niezależnie od tego, czy jakiś jest wypełniony czy pusty.

0

Ok problem rozwiąany następująco:

procedure UsunWpis;
begin
  write('Podaj imie abonenta ktory ma zostac usuniety: ');
  readln(selektor);
   for i:=1 to LbPoz do
     if selektor=dane[i].imie then
       for i:=i to LbPoz do
         begin
           dane[i].imie:=dane[i+1].imie;
           dane[i].ntstac:=dane[i+1].ntstac;
           dane[i].ntkom:=dane[i+1].ntkom;
         end;
       LbPoz:=LbPoz-1;
       ZapiszNaDysku(NazwaPliku);
end;

Przypisujemy wybranemu wersowi wartość następnego i tak w pętli dochodzimy do ostatniego wersu. Potem zapisujemy to wszystko do pliku i gotowe :) A mam pytanie, co będzie gdy tabela będzie wypełniona cała? Czy w takim wypadku ostatni wers zostanie podwojony? Czy moze komenda przypisania do wersu 1000 wartosci wersu 1001, po prosty wyczyści wers 1000, bo przecież wers 1001 nie istnieje?

0

błąd

0
Misiekd napisał(a)

jak to delphi to zamiast tablicy zastosować TList

<ot>Tak z ciekawości spytam, bo jeszcze nie korzystałem z TList. Co jest szybsze, TList czy dynamiczne tablice? Chodzi mi o takie operacje jak szukanie, dodawanie, usuwanie przy ilości rekordów ok 10 000.</ot>

Co do głównego tematu, widziałem gdzieś przykład szybkiego usuwania z dynamicznej tablicy za pomocą Copy, coś jak:

Tablica[usuwany_index] := Copy(Tablica, usuwany_index+2, Length(Tablica)-(usuwany_index+2));
SetLengt(Tablica, Length(Tablica)-1);

... czy jakoś tak

0

TList jest oparta o dynamiczną tablicę ale ma zaimplementowanie dodawanie, usuwanie, przenoszenie, zamiane miejscami i wyszukiwanie konkretnego elementu

0

jaka zasada dzialania na tablicy raz tworzymy taka sama tablice ale o liczbie elementow mniejszej o 1
w petli ustawiamy wartosci odopwiednio (w kodzie to jest x) jak i <> tego co chcemy usunac to dodajemy do x 1 i wlasnie ten element dodajemy z tablicy glownej [i], pozniej nalezy tylko odwrocic proces czyli z tablicy tymaczasowej zrobic: to co jest var dym : tsmoke dajemy setlength(tablicaglowna_zktorej_bralismy_wartosci,length(tablica_tymczasowa)); pozniej tylko przypisanie wartosci jednej tablicy do drugiej

procedure delete_smoke(var dym : tsmoke; index : integer);
var
temp : array of tsmoke_nfo;
i : integer;
x : integer;
begin
setlength(temp,length(dym.smoke_quad)-1);

x := -1;
for i:=0 to high(dym.smoke_quad) do
if i <> index then begin
x:=x+1;
temp[x].pos.x := dym.smoke_quad[i].pos.x;
temp[x].pos.y := dym.smoke_quad[i].pos.y;
temp[x].pos.z := dym.smoke_quad[i].pos.z;
temp[x].size := dym.smoke_quad[i].size;
temp[x].visible := dym.smoke_quad[i].visible;
end;

setlength(dym.smoke_quad,length(temp));

for i:=0 to high(dym.smoke_quad) do begin
dym.smoke_quad[i].pos.x := temp[i].pos.x;
dym.smoke_quad[i].pos.y := temp[i].pos.y;
dym.smoke_quad[i].pos.z := temp[i].pos.z;
dym.smoke_quad[i].size := temp[i].size;
dym.smoke_quad[i].visible := temp[i].visible;
end;

end;

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