BARDZO PROSTA 'baza danych'

0

Chcę, aby po wpisaniu do pola Edit1 nazwiska(lub czegos innego) zostało one dodane do Listbox1 i jednoczesnie zajeło kolejną pozycję w tablicy (10o elementowej), abym mógł je następnie wyszukać
Podaję fragment kodu który napisałem i mam problem gdyż nie chce mi sie skompilowac a chodzilo mi o to żeby pierwszemu elementowi tablicy była przypisana pierwsza pozycja na listboxie

procedure TForm1.SzukajClick(Sender: TObject);
var szukaj:string;
    i:integer;
    ok:boolean;
begin
nazwiska[1]:=listbox1.items[1];
nazwiska[2]:=listbox1.Items[2];
nazwiska[3]:=listbox1.Items[3];
nazwiska[4]:=listbox1.Items[4];
nazwiska[5]:=listbox1.Items[5];
nazwiska[6]:=listbox1.items[6];
nazwiska[7]:=listbox1.Items[7];
nazwiska[8]:=listbox1.Items[8];
nazwiska[9]:=listbox1.Items[9];
nazwiska[10]:=listbox1.Items[10];

szukaj:=InputBox('Szukaj','Podaj nazwisko','');
ok:=false;
for i:=1 to 10 do
if szukaj=nazwiska[i] then ok:=true;
if ok then
ShowMessage('Nazwisko '+nazwiska[i]+' zostało znalezione w bazie!!!')  ;
if not ok then
ShowMessage('Nie znaleziono takiego nazwiska w bazie');
end;

end.

Prosilbym o pomoc w tej sprawie.
Pozdroweinia Tomek

0

Jak nie chce się skompilować to podaj błąd i miejsce w jakim występuje.. na oko ciżko powiedzieć, ale raczej te linie:

nazwiska[1]:= ...

itd - zainicjalizowałeś wcześniej długość "nazwiska" ?

0

Aha
Gdy próbuję skompilowac program kompiluje sie i uruchamia ale gdy klikne przycisk 'Szukaj' wyskakuje mi taki błąd:

Project Project1.exe raised exception class EStringListError eith message' List Index Out of Bounds (1)'
Process stopped. Use Step or Run to Continue.

0

W takim razie musisz ustawić SetLength dla tablicy "nazwiska"..

0

Nie chce mi sie czytac (upal), ale na pierwszy rzut oka narzuca mi sie pytanie czy wiesz od jakiego indeksu zaczyna sie tablica ListBox1.Items (podpowiedz : liczba nieujemna mniejsza od 1). A jeli nie w tym blad, to moze pamietaj o tym ze jak nie masz w ListBoxie tylu pozycji (10) to nie mozesz ich do niczego przypisywac.

0

A nazwiska to tablica dynamiczna, czy statyczna 10-elementowa?
Jeśli statyczna, to jak wygląda jej deklaracja: nazwiska: array[0..9] of string, czy nazwiska: array[1..10] of string ?
W jaki sposób dodajesz itemy do ListBox-a i ile?

Error "EStringListError....list index out of bounds" wskazuje tutaj na jakiś problem z ListBox.Items.
I coś mi się zdaje, że masz ListBox-a z 10-oma itemami.
Jeśli tak, to przy deklaracji nazwiska: array[0..9] of string powinno być:

nazwiska[0]:=listbox1.items[0];
....
nazwiska[9]:=listbox1.items[9];

a przy deklaracji nazwiska: array[1..10] of string powinno być:

nazwiska[1]:=listbox1.items[0];
....
nazwiska[10]:=listbox1.items[9];
0

No wiem że OT, ale nie mogę na te 10 przypisań patrzeć! O pętli nie słyszał??? :-[

0

Jack

  • to jest tablica statyczna
array [1..10] of string

-elementy do listboxa dodaje klikajac na przycisk dodaj. Podaję kod przycisku:

Listbox1.items.add(edit1.text);
edit1.text:='';

zrobiłem tak jak mówiłeś czyli nazwiska[1]:=listbox1.items[0] itd.
i teraz jest tak:
jeśli dodam do listboxa 10 elementów to przycisk Szukaj działa(nie wyskakuje błąd jak poprzednio) ale gdy dodam mniej elementów np.1 to wyskakuje identyczny błąd jak poprzednio.
Kolejna sprawa to to że gdzy dodam juz te 10 elementów do listboxa to tak jak mówiłem przycisk Szukaj działa i przechodzi do następnej instrukcji programu czyli pokazuje sie InputBox Który pyta o nazwisko. I teraz:
-jeśli wpisze nazwisko znajdujące się na listboxie to wyskakuje kolejny, inny błąd:
Project Project1.exe raised exception class EAccess violation with message 'Access violation at adress 004041F3 in module 'PROJECT1.EXE'.
Read of adress FFFFFFFB.
Proccess stopped. Use Step or Run to continue.

-ale jeśli wpisze nazwisko które nie znajduje sie na listboxie to program działa prawidłowo czyli wyswietla ze nie znalazl nazwiska w bazie

Nie wiem jak zrobić żeby nie trzeba było dodawać 10 elementów tylko np. 3 albo 15 (jakaś pętla)
pozdrawiam Tomek(Bundy)

0

Mój nr GG: 3559801

0

wg mnie odwolujesz sie do czegos co nie istnieje.
jak juz Ci zasugerowal pq...uzyj petli!!

for i:=0 to listbox1.items.count-1

do powinno zalatwic sprawe.

zrob sobie tez tablice dynamiczna....bedzie latwiej i lepiej :)
wiecej pod F1

0

Wesoledi

Wiem wiem, to żałosne ale nie bardzo wiem gdzie wstawić tą pętlę ....
Domyślam się że mam usunąć te 10 deklaracji ale co wpisać jako ciało pętli po słowie

do

?

0
var i:integer;
begin
...
for i:=0 to listbox1.items.count-1 do
nazwiska[i+1]:=listbox1.items[i];
...
0

Stworzyłem tablicę dynamczną

var nazwiska: array[0..9] of string

i zrobiłem pętlę for i:=0 to listbox1.items.count-1 do
nazwiska[i]:=listbox1.items[i];


I teraz jest tak:

-program się kompiluje, dodaje itemy ale gdy kliknę Szukaj przechodzi do nastepnej instrukcji czyli wyświetla inputbox i pyta o nazwisko i teraz:

-gdy wpisze nazwisko ktorego nie ma w listboxie jest ok Wyswietla sie ShowMessage ze Nie znalazl takiego nazwiska w bazie ALE

-gdy wpisze nazwisko znajdujace sie w bazie (niewazne czy tablica jest jeszcze niedopelniona czy jest juz 10 elementow) wyskakuje błąd:

Project Project1.exe raised exception class EAccess violation with message 'Access violation at adress 004041F3 in module 'PROJECT1.EXE'. 
Read of adress FFFFFFFB. 
Proccess stopped. Use Step or Run to continue.


0

bo w tej drugiej pętli pewno nadal masz od 1 do 10 zamiast od 0 do listbox1.items.count-1
zrób tak:

procedure TForm1.SzukajClick(Sender: TObject);
var szukaj:string;
  i:integer;
  ok:boolean;
begin
  for i:=0 to listbox1.items.count-1 do
  nazwiska[i+1]:=listbox1.items[i];
  szukaj:=InputBox('Szukaj','Podaj nazwisko','');
  ok:=false;
  for i:=0 to listbox1.items.count-1 do
    if szukaj=nazwiska[i] then ok:=true;
  if ok then
    ShowMessage('Nazwisko '+nazwiska[i]+' zostało znalezione w bazie!!!') else
    ShowMessage('Nie znaleziono takiego nazwiska w bazie');
end;

albo ja bym zrobił tak w ogóle:

procedure TForm1.SzukajClick(Sender: TObject);
var i:integer;
  ok:boolean;
  szukaj:string;
begin
  szukaj:=InputBox('Szukaj','Podaj nazwisko','');
  ok:=false;
  for i:=0 to listbox1.items.count-1 do
    if (LowerCase(szukaj)=LowerCase(listbox1.items.strings[i])) then ok:=true;
  if ok then
    ShowMessage('Nazwisko '+szukaj+' zostało znalezione w bazie!!!') else
    ShowMessage('Nie znaleziono takiego nazwiska w bazie');
end;
0

MASZ RACJĘ ADAMO !!!
WIELKIE DZIĘKI !!!
WSZYSTKO DZIAŁA !!!
[hurra] [hurra] [hurra]

0

Jeszcze jedno czy ktoś może mi wyjaśnić do czego służy 'count' bo tak dokładnie nie wiem

0

Jeszcze jedno czy ktoś może mi wyjaśnić do czego służy 'count' bo tak dokładnie nie wiem

do liczenia ilosci elementow. logiczne.

0
Bundy napisał(a)

Stworzyłem tablicę dynamczną

var nazwiska: array[0..9] of string

Twoja tablica jest wybitnie statyczna.

Tablicę dynamiczną deklaruje się tak:

var nazwiska: array of string;

begin
SetLength(nazwiska, 10); // <-- czyli przypisujesz tablicy długość 10 elementów, wystarczy trochę poczytać
...
end;
0

witam. pisalem podobny program na zlecenie i problem tkwi w tym że listbox dodaje "1" do kazdego numeru linijki. po prostu odejmij 1 odkazdej wczytywanej linijki :)

// po 6 latach to już ta pomoc chyba zbędna... - Ktos

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