Witam,
Od razu zaznaczam że nie jestem zbyt dobry z programowania.
Otóż mam problem- dostałem pracę zaliczeniową - bazę danych.
Napisałem cały program - tj. tworzę plik, usuwam, dodaje wpis, usuwam wpis, odczytuje zawartosc pliku, ale mam problem - jak podczas dodawania wpisu zamiast liczby wpiszę literę to wyskakuje błąd i program się sypie. poza tym wszystko jest dobrze. Co zrobić?
"Napisalem program, ale jak wpisze do niego litere to sie sypie", moze tak troche wiecej, jakis kod .... ?
Sorry, oto kod programu:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Baza1: TMenuItem;
Koniec1: TMenuItem;
Nowyplik1: TMenuItem;
Wprowadnowedane1: TMenuItem;
Czytajdanezpliku1: TMenuItem;
Kasujdanezpliku1: TMenuItem;
StringGrid1: TStringGrid;
Usuplik1: TMenuItem;
procedure Koniec1Click(Sender: TObject);
procedure Nowyplik1Click(Sender: TObject);
procedure Usuplik1Click(Sender: TObject);
procedure Wprowadnowedane1Click(Sender: TObject);
procedure Czytajdanezpliku1Click(Sender: TObject);
procedure Kasujdanezpliku1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
spis=record
nazwa:String[45];
powierz:Integer;
glebok:Integer;
dno:String[50];
dostep:Integer;
brzegi:String[50];
sprzet:String[50];
miejscowosc:String[40];
end;
spis_2=file of spis;
var
Form1: TForm1;
jeziora, jeziora_pomoc:spis_2;
rek:spis;
kas_pozycja:string[50];
znkon:string[1];
ile,wynik:integer;
implementation
{$R *.dfm}
procedure TForm1.Koniec1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Nowyplik1Click(Sender: TObject);
begin
AssignFile(jeziora,'jeziora.dat');
{$i-}
Reset(jeziora);
CloseFile(jeziora);
{$i+}
if IORESULT = 0 then
Showmessage ('Plik juz istnieje')
else
Begin
Showmessage('Tworze plik');
Rewrite(jeziora);
CloseFile(jeziora);
end;
end;
procedure TForm1.Usuplik1Click(Sender: TObject);
begin
AssignFile(jeziora,'jeziora.dat');
{$i-}
erase(jeziora);
{$i+}
if ioResult=0 then
Showmessage('Usunięto!')
else
Showmessage('Brak pliku do usunięcia!');
end;
procedure TForm1.Wprowadnowedane1Click(Sender: TObject);
begin
AssignFile(jeziora,'jeziora.dat');
{$i-}
Reset(jeziora);
{$i+}
if IOResult<>0 then
begin
wynik:=Application.MessageBox('Czy stworzyc nowy?','Plik nie istnieje',
MB_YesNo+MB_IconStop+MB_DefButton1);
if wynik=6 then
begin
Rewrite(jeziora);
ShowMessage('Nowy plik został utworzony!');
end;
end;
Seek(jeziora, FileSize(jeziora));
repeat
with rek do
begin
nazwa:=InputBox('Podaj dane','Podaj nazwe jeziora','');
powierz:=StrToInt(InputBox('Podaj dane','Podaj wielkosc jeziora',''));
glebok:=StrToInt(InputBox('Podaj dane','Podaj glebokosc',''));
dno:=InputBox('Podaj dane','Podaj rodzaj dna','');
dostep:=StrToInt(InputBox('Podaj dane','Ocen dostep do jeziora (1-6)',''));
brzegi:=InputBox('Podaj dane','Podaj typ brzegów','');
sprzet:=InputBox('Podaj dane','Podaj rodzaj wypozyczanego sprzetu','');
miejscowosc:=InputBox('Podaj dane','Podaj nazwe najblizszej miejscowosci','');
end;
Write(jeziora,rek);
wynik:=Application.MessageBox('czy wprowadzac dalej?','Wprowadzanie rekordu zakończono',MB_YesNo+MB_DefButton1);
if wynik=6 then znkon:='K' else znkon:='N';
until(znkon='N') or (znkon='n');
CloseFile(jeziora);
end;
procedure TForm1.Czytajdanezpliku1Click(Sender: TObject);
begin
AssignFile(jeziora,'jeziora.dat');
{$I-}
Reset(jeziora);
CloseFile(jeziora);
{$I+}
if IOResult<>0 then
begin
ShowMessage('Plik nie istnieje!');
end
else
begin
Reset(jeziora);
ile:=0;
while not eof(jeziora) do
begin
Read(jeziora,rek);
ile:=ile+1;
end;
Reset(jeziora);
StringGrid1.ColCount:=9;
StringGrid1.RowCount:=ile+1;
StringGrid1.Cells[0,0]:='Nr. rek';
StringGrid1.Cells[1,0]:='Nazwa';
StringGrid1.Cells[2,0]:='Powierzchnia';
StringGrid1.Cells[3,0]:='Głębokosc';
StringGrid1.Cells[4,0]:='Rodzaj dna';
StringGrid1.Cells[5,0]:='Dostępnosc';
StringGrid1.Cells[6,0]:='Brzegi';
StringGrid1.Cells[7,0]:='Wyp. sprzętu';
StringGrid1.Cells[8,0]:='Miejscowosc';
ile:=0;
while not eof(jeziora) do
begin
ile:=ile+1;
Read(jeziora, rek);
with rek do
begin
StringGrid1.Cells[0,ile]:=IntToStr(ile);
StringGrid1.Cells[1,ile]:=nazwa;
StringGrid1.Cells[2,ile]:=IntToStr(powierz);
StringGrid1.Cells[3,ile]:=IntToStr(glebok);
StringGrid1.Cells[4,ile]:=dno;
StringGrid1.Cells[5,ile]:=IntToStr(dostep);
StringGrid1.Cells[6,ile]:=brzegi;
StringGrid1.Cells[7,ile]:=sprzet;
StringGrid1.Cells[8,ile]:=miejscowosc;
end;
end;
CloseFile(jeziora);
end;
end;
procedure TForm1.Kasujdanezpliku1Click(Sender: TObject);
begin
AssignFile(jeziora,'jeziora.dat');
{$I-}
Reset(jeziora);
{$I+}
if IOResult<>0 then
begin
ShowMessage('Plik nie istnieje!');
end
else
begin
Reset(jeziora);
ile:=0;
while not eof(jeziora) do
begin
Read(jeziora,rek);
ile:=ile+1;
end;
Reset(jeziora);
StringGrid1.ColCount:=9;
StringGrid1.RowCount:=ile+1;
StringGrid1.Cells[0,0]:='Nr. rek';
StringGrid1.Cells[1,0]:='Nazwa';
StringGrid1.Cells[2,0]:='Powierzchnia';
StringGrid1.Cells[3,0]:='Głębokosc';
StringGrid1.Cells[4,0]:='Rodzaj dna';
StringGrid1.Cells[5,0]:='Dostępnosc';
StringGrid1.Cells[6,0]:='Brzegi';
StringGrid1.Cells[7,0]:='Wyp. sprzętu';
StringGrid1.Cells[8,0]:='Miejscowosc';
ile:=0;
while not eof(jeziora) do
begin
ile:=ile+1;
Read(jeziora, rek);
with rek do
begin
StringGrid1.Cells[0,ile]:=IntToStr(ile);
StringGrid1.Cells[1,ile]:=nazwa;
StringGrid1.Cells[2,ile]:=IntToStr(powierz);
StringGrid1.Cells[3,ile]:=IntToStr(glebok);
StringGrid1.Cells[4,ile]:=dno;
StringGrid1.Cells[5,ile]:=IntToStr(dostep);
StringGrid1.Cells[6,ile]:=brzegi;
StringGrid1.Cells[7,ile]:=sprzet;
StringGrid1.Cells[8,ile]:=miejscowosc;
end;
end;
AssignFile(jeziora_pomoc,'pomoc.dat');
Reset(jeziora);
Rewrite(jeziora_pomoc);
kas_pozycja:=InputBox('','Podaj nazwe kasowanej pozycji','');
while not eof(jeziora) do
begin
Read(jeziora, rek);
if kas_pozycja<>rek.nazwa then Write(jeziora_pomoc,rek);
end;
CloseFile(jeziora);
CloseFile(jeziora_pomoc);
{$I-}
Erase(jeziora);
{$I+}
RenameFile('pomoc.dat','jeziora.dat');
end;
end;
end.
W którym miejscu jak wpiszesz literę?
np.
glebok:=StrToInt(InputBox('Podaj dane','Podaj glebokosc',''));
to ci spowoduje, jezeli chcesz przeprowadzic konwersje ze stringa na integera (StrToInt), a w stringu nie bedzie liczby to doataniesz taki rezultat.
A zeby tego uniknac to zmodyfikuj twoj rekord
spis=record
nazwa:String[45];
powierz:Integer;
glebok:Integer;
dno:String[50];
dostep:Integer;
brzegi:String[50];
sprzet:String[50];
miejscowosc:String[40];
end;
Czyli zamiast Integer zadeklaruj cos innego, np String;
Do LUDOMIRA:
Jak skompiluję program i zacznę dodawać wpis, wtedy jak np. mam podać głębokość jeziora (w liczbach) zamiast tego powiedzmy pomylę się i wpiszę literę to wyskakuje błąd i program się wiesza.
Do WOLVERINE:
Ale jak zadeklaruję zamiast integer stringa to będą to musiały być litery a nie liczby prawda? A ja jednak muszę mieć liczby:-/
Zrób własnego "InputBox" tak aby dało się wpisywać tylko liczby.
Albo
http://4programmers.net/Forum/viewtopic.php?id=51258
a może by tak użyć zmiennej variantowej? później dopiero sprawdzać czy jest liczba czy literka.
Ale jak zadeklaruję zamiast integer stringa to będą to musiały być litery a nie liczby prawda? A ja jednak muszę mieć liczby
Ale String to liczby + znaki... Wiec mozesz wpisac liczbe, tylko po prostu trudniej zrobin na tym jakies operacje np dodawanie.
trudniej nie trudniej. wystarczy zutowanie i zmiana typów i elegancko wychodzi, tyle, że trzeba w tedy uważać na wyjątki, które mogą przyspożyć kłopotu.