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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 16:26   #1
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию Назначить обработчик события на кнопку form2 из form1 программно

Вопрос в следующем:

Имеем приложение БД.
ado+access

Вопрос: Как из формы Form1 назначить обработчик события OnClick на кнопке в Form2 ??

т.е. необходимо при нажатии кнопки "Новая" на форме №1 - открывалась форма №2 и назначить обработчик собития OnClick кнопки "Сохранить" на форме №2. Событие - добалвение записи в БД

та же ситуация только с кнопкой "изменить" на форме №1 (назначить обработчик собития OnClick кнопки "Сохранить" на форме №2. Событие - редактирование записи в БД)


=================================== =====================

Код:
//------------------------------------------------------------------------------
function NotEmptySet(inSet:TDataSet): boolean; // не пусто, функция проверки на наличие записей в сете
begin
Result := Not (inSet.Bof and inSet.eof);
end;

procedure DelRec(inSet:TDataSet); // процедура удаление записи
begin
if (NotEmptySet(inSet)) then
begin
if MessageDlg(PChar('Удалить запись? - '+Form1.ADOQuery1.FieldByName('Фамилия').AsString),mtConfirmation, mbOKCancel, 0) = mrOK then
inSet.Delete
end
else
begin
MessageDlg('Нет записей для удаления!',mtInformation,[mbCancel], 0);
Exit;
end;
end;

procedure AddRec; // процедура открытия диалога для добавления записи
var form2: TForm2;
begin
form2:=TForm2.Create(Form1);
form2.ShowModal;
end;

procedure EdtRec(inSet:TDataSet); // процедура редактирование записи
var form2: TForm2;
begin
if (NotEmptySet(inSet)) // если сет пустой - незачем выводить запрос
then //ну а если не пуста - открываем диалог редактирования
begin
form2:=TForm2.Create(Form1);
form2.Edit1.Text:=Form1.ADOQuery1.FieldByName('Фамилия').Text;
form2.Edit2.Text:=Form1.ADOQuery1.FieldByName('Имя').Text;
form2.ShowModal;
end
else
begin
MessageDlg('Нет записей для редактирования!',mtInformation,[mbCancel], 0);
Exit;
end;
end;
//------------------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject); //открываем диалог для новой записи
begin
AddRec;
end;

procedure TForm1.Button2Click(Sender: TObject); // кнопка редактирования записи (диалог)
begin
EdtRec(DataSource1.DataSet);
end;



procedure TForm1.Button3Click(Sender: TObject);
begin
DelRec(DataSource1.DataSet);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Application.Terminate; // убиваем приложение
end;



procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_DELETE then // кнопка Delete - удаление записи
begin
DelRec(DataSource1.DataSet); // используем процедуру удаления
end;
if Key = VK_INSERT then // кнопка Insert - добавление записи
begin
AddRec; // используем процедуру добавления
end;
if Key = VK_RETURN then // кнопка Enter - редактирование записи
begin
EdtRec(DataSource1.DataSet); // используем процедуру редактирования
end;
if Key = VK_LEFT then // кнопка <- - первая запись
begin
DataSource1.DataSet.First;
end;
if Key = VK_RIGHT then // кнопка -> - последняя запись
begin
DataSource1.DataSet.Last;
end;
end;



procedure TForm1.FormActivate(Sender: TObject);
begin
DBGrid1.SetFocus; //получение гридом фокуса
end;

------------------------------------------------------------------

procedure TForm2.Button1Click(Sender: TObject);
begin
if (Edit1.Text='') and (Edit2.Text='') then // *** если едиты пустые то ***
if (Edit1.Text)='' then // если пустой первый едит (фамилия)
begin
MessageDlg('Введите фамилию!',mtInformation,[mbOK], 0); // сообщаем что фамилия не указана
Edit1.Text:=''; // очищаем на всякий первый едит
Edit1.SetFocus; // ставим на него фокус
Exit; // выходим из месыджа
end;
if (Edit2.Text)='' then // если пустой второй едит (имя)
begin
MessageDlg('Введите имя!',mtInformation,[mbOK], 0); // сообщаем что имя не указано
Edit2.Text:=''; // очищаем на всякий второй едит
Edit2.SetFocus; // ставим на него фокус
Exit; // выходим из месыджа
end; // *** иначе, если эдиты не пустые - сохраняем значение едитов в базе ***
//Form1.ADOQuery1.Edit;
//Form1.ADOQuery1.FieldByName('Фамилия').Text:=Edit1.Text;
//Form1.ADOQuery1.FieldByName('Имя'). Text:=Edit2.Text;
//Form1.ADOQuery1.Insert;// .Append; //.Post;
//Form1.ADOQuery1.Post;
Close; // закрываем форму ввода данных
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if CharInSet(Key,['0'..'9','A'..'Z','a'..'z',#13]) then key:=#0;
end;

procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if CharInSet(Key,['0'..'9','A'..'Z','a'..'z',#13]) then key:=#0;
end;
Изображения
Тип файла: jpg 1.jpg (45.5 Кб, 120 просмотров)
Тип файла: jpg 2.jpg (16.2 Кб, 112 просмотров)

Последний раз редактировалось Stilet; 13.07.2010 в 08:38.
golopjatov вне форума Ответить с цитированием
Старый 12.07.2010, 19:18   #2
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

А почему бы тебе не использовать специализированные компоненты вместо обычных Edit'ов??? Существуют же DBEdit, DBComboBox и т.д.. К тому же тебе AdoQuery сейчас явно не нужен (Используй ADOTable).
А при открытии второй формы просто переводить таблицу либо в режим редактирования, либо в режим добавления записи:
Код:
procedure TForm1.Button2Click(Sender: TObject); // кнопка редактирования записи (диалог)
begin
 ADOTable.edit;
 form2.ShowModal;
end;

procedure TForm1.Button1Click(Sender: TObject); // кнопка добавления записи (диалог)
begin
 ADOTable.Insert;
 form2.ShowModal;
end;


//и при нажатии кнопок во второй форме:
procedure TForm2.Button1Click(Sender: TObject);//кнопка сохранить
begin
 ADOTable.post;
 form2.close;
end;

procedure TForm2.Button2Click(Sender: TObject);//кнопка отменить
begin
 ADOTable.CancelUpdates;
 form2.close;
end;
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 12.07.2010, 19:29   #3
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию

хм... сейчас попробуем..
golopjatov вне форума Ответить с цитированием
Старый 12.07.2010, 19:51   #4
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию

Спасибо. Отлично.

//На вставку новой записи:

procedure TForm1.Button1Click(Sender: TObject); // Новая запись
var form2: TForm2;
begin
form2:=TForm2.Create(Form1);
ADOTable1.Insert;
form2.ShowModal;
end;



//На редактирование записи:

procedure TForm1.Button2Click(Sender: TObject); // Редактирование
begin
form2:=TForm2.Create(Form1);
form2.Edit1.Text:=Form1.ADOTable1.F ieldByName('Фамилия').Text;
form2.Edit2.Text:=Form1.ADOTable1.F ieldByName('Имя').Text;
ADOTable1.edit;
form2.ShowModal;
end;


=======

//Сохраняем изменения:

Желательно дописать проверку на пустые значения Edit1,Edit2 чтобы не сохранялись пустые записи в БД. (если пусто - отмена изменений (добавить/редактировать) if...then)

procedure TForm2.Button1Click(Sender: TObject); //Сохранить изменения (новая либо изменения)
begin
Form1.ADOTable1.FieldByName('Фамилия').Text:=Edit1.Text;
Form1.ADOTable1.FieldByName('Имя'). Text:=Edit2.Text;
Form1.ADOTable1.post;
close;
end;

//Отмена редактирования

procedure TForm2.Button2Click(Sender: TObject); // Отмена изменений (добавления/изменения записи)
begin
Form1.ADOTable1.CancelUpdates;
close;
end;

end.

Отлично все получается.

Последний раз редактировалось golopjatov; 12.07.2010 в 20:15.
golopjatov вне форума Ответить с цитированием
Старый 13.07.2010, 06:09   #5
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

А не проще написать одну процедуру с параметром типа INT и передавая в него либо 1, либо 0 переводить дата сет в едит либо в инсерт.
Ну а перед Post еще сделать проверку состояния.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 13.07.2010, 19:03   #6
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
А не проще написать одну процедуру с параметром типа INT и передавая в него либо 1, либо 0 переводить дата сет в едит либо в инсерт.
Ну а перед Post еще сделать проверку состояния.
А смысл? это лишняя память и процессорное время...
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 13.07.2010, 20:22   #7
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию

procedure AddRec(inSet:TDataSet); // процедура открытия диалога для добавления записи
var Form2: TForm2;
begin
Form2 := TForm2.Create(Form1);
try
Form1.ADOQuery1.Insert;
Form2.Caption:='Новая запись';
Form2.ShowModal;
finally
Form2.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
AddRec(Form1.DataSource1.DataSet);
end;

Последний раз редактировалось golopjatov; 13.07.2010 в 22:58.
golopjatov вне форума Ответить с цитированием
Старый 13.07.2010, 20:51   #8
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию

procedure EdtRec(inSet:TDataSet); // процедура редактирование записи
var Form2: TForm2;
begin
if (NotEmptySet(inSet)) // если сет пустой - незачем выводить запрос
then //ну а если не пуста - открываем диалог редактирования
begin
Form2:=TForm2.Create(Form1);
try
Form2.Edit1.Text:=Form1.ADOQuery1.F ieldByName('Фамилия').Text;
Form2.Edit2.Text:=Form1.ADOQuery1.F ieldByName('Имя').Text;
Form1.ADOQuery1.Edit;
Form2.Caption:='Редактирование записи';
Form2.ShowModal;
finally
Form2.Free;
end;
end
else
begin
MessageDlg('Нет записей для редактирования!',mtInformation,[mbCancel], 0);
Exit;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
EdtRec(Form1.DataSource1.DataSet);
end;

Последний раз редактировалось golopjatov; 13.07.2010 в 21:11.
golopjatov вне форума Ответить с цитированием
Старый 13.07.2010, 20:56   #9
golopjatov
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 13
По умолчанию

procedure DelRec(inSet:TDataSet); // процедура удаление записи
begin
if (NotEmptySet(inSet)) then
begin
if MessageDlg(PChar('Удалить запись? - '+Form1.ADOQuery1.FieldByName('Фамилия').AsString),mtConfirmation, mbOKCancel, 0) = mrOK then
inSet.Delete
end
else
begin
MessageDlg('Нет записей для удаления!',mtInformation,[mbCancel], 0);
Exit;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
DelRec(Form1.DataSource1.DataSet); // используем процедуру удаления
end;

-----------------------------------------------
Функция проверки наличия записей в DataSet

function NotEmptySet(inSet:TDataSet): boolean; // не пусто, функция проверки на наличие записей в сете
begin
Result := Not (inSet.Bof and inSet.eof);
end;

Последний раз редактировалось golopjatov; 13.07.2010 в 21:05.
golopjatov вне форума Ответить с цитированием
Старый 13.07.2010, 21:24   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

просто замечание.
у DataSet можно проверить на пустоту через IsEmpty (и не надо городить огород через свою функцию NotEmptySet....):
Код:
if Not inSet.IsEmpty then
begin
...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переменные form2 на form1 motaro Общие вопросы Delphi 16 28.09.2009 07:49
Form1 & Form2 Alex Cones Общие вопросы Delphi 4 31.07.2009 21:50
Управление элементами Form2 из Form1 Niodar Общие вопросы Delphi 4 25.03.2009 04:22
Delphi. Form1 и Form2. Xeon332 Общие вопросы Delphi 8 01.11.2008 15:52
form1 и form2 SLIMMUS Общие вопросы Delphi 3 29.10.2008 01:15