Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RFpro.ru: СУБД и Delphi


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Jimhucksly
Статус: 5-й класс
Рейтинг: 797
∙ повысить рейтинг »
LanK
Статус: Профессионал
Рейтинг: 371
∙ повысить рейтинг »
Шичко Игорь
Статус: Практикант
Рейтинг: 203
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Номер выпуска:547
Дата выхода:08.10.2009, 18:00
Администратор рассылки:Gh0stik, Модератор
Подписчиков / экспертов:360 / 96
Вопросов / ответов:1 / 1

Вопрос № 172867: Здравствуйте Уважаемые Эксперты! Помогите мне найти ошибку в коде программы. При запуске программы и вводе данных возникает ошибка и непозволяет ввести новые данные..., если просто нажать на кнопку добавления данных, не указывая их, то программа д...



Вопрос № 172867:

Здравствуйте Уважаемые Эксперты!
Помогите мне найти ошибку в коде программы. При запуске программы и вводе данных возникает ошибка и непозволяет ввести новые данные..., если просто нажать на кнопку добавления данных, не указывая их, то программа добавит непонятные данные и потом можно добавлять свои данные! Помогите мне убрать эту ошибку!
Код программы:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;

type
TForm3 = class(TForm)
Panel1: TPanel;
sg1: TStringGrid;
Button1: TButton; //Записать
Edit1: TEdit; // № зачетной книжки
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit; // ФИО
Label3: TLabel;
Edit3: TEdit; //Группа
Label4: TLabel;
ComboBox1: TComboBox; //Пол
Button2: TButton;
Button3: TButton; //Обновить
procedure F ormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

stud = record
nomer : integer;
fio : string[50];
pol : string[7];
gr : integer;
end;

var
Form3: TForm3;
f : file; //файл
x : stud; //переменная типа - запись
x1,fs : integer; {x1 - координата выделенной строки в StringGrid;
fs - переменная в которой хранится количество записей в файле}
mstud : array of stud; //динамический массив записей
implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var t : boolean; //внутренняя переменная для цикла While
a : integer; //внутренняя переменная для цикла While
begin
a:=1; t:=true;
while t and (a<=fs) do
if mstud[a].nomer=strtoint(Edit1.Text) then t:=false else inc(a);
if t then
begin
SetLength(mstud,fs+1);
if Edit1.Text<>'' then mstud[fs+1].nomer:=strtoint(Edit1.Text);
if Edit2.Text<>'' then mstud[fs+1].fio:=Edit2.Text;
mstud[fs+1].pol:=Combobox1.Text;
if Edit3.Text<>'' then mstud[fs+1].gr:=strtoint(Edit3.Text);
BlockWrite(f,mstud[fs+1],sizeof(x));
fs:=filesize(f) div sizeof(x);
sg1.RowCount:=fs+1;
sg1.Cells[0,fs]:=inttostr(mstud[fs].nomer);
sg1.Cells[1,fs]:=mstud[fs].fio;
sg1.Cells[2,fs]:=mstud[fs].pol;
sg1.Cells[3,fs]:=inttostr(mstud[fs].gr);
end
else
begin
showmessage('Error!');
Edit1.SelectAll;
Edit1.SetFocus;
end;
end;

procedure TForm3.Button2Click(Sender: TObject);
var t : boolean; //внутренняя переменная для цикла While
a : integer; //внутренняя переменная для цикла While
begin
x1:=sg1.Row;
a:=1; t:=true;
if mstud[x1].nomer=strtoint(sg1.Cells[0,x1]) then
mstud[x1].nomer:=strtoint(sg1.Cells[0,x1])
else
begin
while t and (a<=fs) do
if mstud[a].nomer=strtoint(sg1.Cells[0,x1]) then t:=false
else inc(a);
if t then mstud[x1].nomer:=strtoint(sg1.Cells[0,x1])
else showmessage('Error!');
end;
mstud[x1].fio:=sg1.Cells[1,x1];
mstud[x1].pol:=sg1.Cells[2,x1];
mstud[x1].gr:=strtoint(sg1.Cells[3,x1]);
Seek(f,(x1-1)*sizeof(x));
BlockWrite(f,mstud[x1],sizeof(x));
end;

procedure TForm3.Bu tton3Click(Sender: TObject);
begin
close;
end;

procedure TForm3.FormActivate(Sender: TObject);
var fname : string; //п еременная для в которой хранится имя файла
y : integer; //внутренняя переменная
begin
fname:='1';
if FileExists(fname)=false then
rewrite(f,'1') else
begin
AssignFile(f,fname);
reset(f);
end;
fs:=filesize(f) div sizeof(x);
sg1.Cells[0,0]:='№ зачетной книжки';
sg1.Cells[1,0]:='ФИО';
sg1.Cells[2,0]:='Пол';
sg1.Cells[3,0]:='Группа';
sg1.RowCount:=fs+1;
SetLength(mstud,fs);
for y:=1 to fs do
begin
blockread(f,mstud[y],sizeof(x));
with mstud[y] do
begin
sg1.Cells[0,y]:=inttostr(nomer);
sg1.Cells[1,y]:=fio;
sg1.Cells[2,y]:=pol;
sg1.Cells[3,y]:=inttostr(gr);
end;
end;

end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseFile(f);
end;

end.

Заранее Спасибо, Вам!

Отправлен: 03.10.2009, 17:44
Вопрос задал: Бойко Евгений Валерьевич, 1-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Selax, 3-й класс :
Здравствуйте, Бойко Евгений Валерьевич.
Индексы у динамических массивов начинаются с 0. В FormActivate у Вас должно быть:
1) AssignFile(f,fname); перенести выше, чтобы было
AssignFile(f,fname);
if not FileExists(fname) then
rewrite(f)
else
reset(f);
2) вместо
blockread(f,mstud[y],sizeof(x));
with mstud[y] do ...
заменить на:
blockread(f,mstud[y-1],sizeof(x));
with mstud[y-1] do ...

Соответственно нужно исправить и Button1Click
Индекс а начинать с 0 и исправить индексы массива
Исправленный вариант в приложении

Приложение:

Ответ отправил: Selax, 3-й класс
Ответ отправлен: 03.10.2009, 19:34

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254957 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.9 от 25.09.2009

    В избранное