Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 11:59   #1
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
Вопрос Delphi7. Простая БД

Помогите, пожалуйста... программа записывает только данные клиента, который введен последним, а должна записывать всех

Вот код:
procedure TForm1.button1Click(Sender: TObject);
var bill: Tbill;
rest: word;

begin
AssignFile(f,'D:\ bill.db');
{$I-}
Reset(f);
{$I+}
if IOResult=0
then button1.Enabled:=true
else
begin
rest:=MessageDlg('Файл базы данных не найден.'+
'Создать новую БД', mtInformation,[mbYes,mbNo],0);
if rest=mrYes then
begin
{$I-}
write(f);
{$I+}
if IOResult=0
then button1.enabled:=true
else ShowMessage('Ошибка создания файла БД');
end;
end;
begin
with bill do
begin
Number:=StrToInt(Edit1.Text);
Name:=Edit2.Text;
Address:=Edit3.Text;
Balance:=StrToInt(Edit4.Text);
end; write(f,bill);
end;
CloseFile(f);
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 12:15   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

В Edit1, Edit2, ... находятся данные по одному клиенту, а где данные по всем остальным клиентам?
Скандербег вне форума Ответить с цитированием
Старый 17.12.2009, 12:25   #3
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

В Edit1, Edit2 я сама ввожу данные о клиенте, а затем после щелчка на кнопку ДОБАВИТЬ программа должна записать их в файл базы данных bill.db и очистить поля Edit1, Edit2, Edit3, Edit4, после очистки я могу записать данные еще об одном клиенте и т.д.

Последний раз редактировалось LeDиNkо; 17.12.2009 в 12:29.
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 12:27   #4
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

вот так и работает, но вот записывает только последнего клиента

Последний раз редактировалось LeDиNkо; 17.12.2009 в 12:30.
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 12:46   #5
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Нет, что-то не склеивается объяснение ваше.
Если после щелчка на кнопку ДОБАВИТЬ программа записывает данные ОДНОГО клиента, после вводятся данные по другому клиенту, опять нажимаем кнопку ДОБАВИТЬ чтобы записать данные о другом клиенте и т.д., то о каких ВСЕХ клиентах речь то идет? Так по очереди они все и будут записаны в базу.
Или хотите сказать, что в файл БД попадают данные только по одному клиенту, независимо от того сколько нажимается кнопка ДОБАВИТЬ?
Скандербег вне форума Ответить с цитированием
Старый 17.12.2009, 12:52   #6
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

да, записываются данные только по одному клиенту (последнему введенному), даже если я ввведу их пять, запишутся данные только о пятом клиенте... видимо программа при каждом щелчке на кнопку ДОБАВИТЬ перезаписывает данные в файле, а не добавляет их туда.. а мне надо сделать, чтобы она добавляла...только вот не знаю как
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 13:07   #7
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

ведь эта процедура написана у меня для кнопки ДОБАВИТЬ, а Reset как раз и открывает для перезаписи, поэтому и при каждом щелчке на кнопку, программа перезаписывает данные...изменила немного программу, теперь выводит ошибку, после нажатия на кнопку ДОБАВИТЬ. Посмотрите, пожалуйста... что-то тут не так
вот код всей программы:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
button1: TBitBtn;
BitBtn1: TBitBtn;
procedure button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TBill=record
Number:integer;
Name:string[30];
Address:string[40];
Balance:integer;
end;

var
Form1: TForm1;
f: file of TBill;
var bill: Tbill;
rest: word;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
AssignFile(f,'D:\ bill.db');
{$I-}
Reset(f); // îòêðûòü ôàéë äëÿ äîáàâëåíèÿ
{$I+}
if IOResult=0
then button1.Enabled:=true
else
begin
rest:=MessageDlg('Ôàéë áàçû äàííûõ íå íàéäåí.'+
'Ñîçäàòü íîâóþ ÁÄ', mtInformation,
[mbYes,mbNo],0);
if rest=mrYes
then
{$I-}
write(f);
{$I+}
if IOResult=0
then button1.enabled:=true
else ShowMessage('Îøèáêà ñîçäàíèÿ ôàéëà ÁÄ.');

end; end;



procedure TForm1.button1Click(Sender: TObject);
begin
with bill do
begin
Number:=StrToInt(Edit1.Text);
Name:=Edit2.Text;
Address:=Edit3.Text;
Balance:=StrToInt(Edit4.Text);
end; write(f,bill);

CloseFile(f);
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;

end.
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 13:13   #8
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

В коде первого поста (этот последний не разбирал еще) нужно исправить
{$I-} write(f); {$I+}
на
{$I-} rewrite(f); {$I+}

А чтобы новые данные дописывались в конец файла, а не заменяли уже существующие необходимо "указатель" в файле сдвигать на его конец. Т.е. добавить (перед with bill do):
Код:
  Seek(f, FileSize(f));
  with bill do
  ...
Да, еще, проверку на наличие и создание файла базы надо вешать на событие FormCreate, а не на FormActivate.

Последний раз редактировалось Скандербег; 17.12.2009 в 13:22.
Скандербег вне форума Ответить с цитированием
Старый 17.12.2009, 13:18   #9
LeDиNkо
Пользователь
 
Аватар для LeDиNkо
 
Регистрация: 17.12.2009
Сообщений: 18
По умолчанию

Всё, заработала!!!! Очень признательна Вам....Огромнейшее спасибо....
LeDиNkо вне форума Ответить с цитированием
Старый 17.12.2009, 13:28   #10
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Не за что, обращайтесь.
А FormActivate главной формы при работе программы может вызываться несколько раз и только FormCreate - один раз, при запуске программы.
Скандербег вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простая замена IP NSvirus Безопасность, Шифрование 7 12.08.2010 14:45
Простая задача по Delphi7, но.... StudentMarat Помощь студентам 9 14.05.2009 17:53
Простая процедура mirawoo Microsoft Office Excel 5 02.10.2008 11:01