Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI - сохранение и востановления [D7, WinXP]


AdminSKBZ ©   (2006-09-27 11:27:00) 

У меня такой вопросик. Надо написать программу, которая содержит главное окно MDI и дочерние. В дочерних окнах находятся компоненты Edit, CommoBox, Button. И при нажатии кнопки второй раз данные с  Edit, CommoBox заносятся в базу данных. Но вопрос стоит так чтоб при первом нажатии кнопки данные с Edit, CommoBox сохранялись, где ни будь, я организовал сохранение в базу данных, отличную от той в которую вносятся при втором нажатии кнопки. Далее если при случайном закрытии программы, данные которые сохранились при нажатии первый раз кнопки, восстанавливались в дочерние MDI окна вновь запущенную программу, если сбоя или закрытия программы не произошло, то удалялись при нажатии второй раз кнопки из базы данных, которая сохраняет эти данные.
Организацию сохранения и удаления при сбоя организовал, осталось при сбое их вернуть в дочерние окна. Заранее благодарю!


MsGuns   (2006-09-27 14:00:00) [1]

1. Править информацию БД в MDI-режиме - штука опасная и требует как минимум понимания основ хранения и доступа в СУБД (в частности такие вещи, как конфликты, транзакции, блокировки и т.д.). Рекомендую интерфейс изменения в БД реализовать в модальном режиме, в котором обеспечится принцип "пока не подтвердил или не отменил, уйти с формы нельзя".
2. Форма для правки (та самая, где расположены указанные в сабже "Edit, CommoBox", а говоря проще - визуальные контролы для ввода значений в таблицы БД) должна иметь у себя (в секции Public) переменные, куда вызывающий модуль перед ShowModal помещает значения полей записи перед правкой.
Например, в главной форме:

procedure TForm1.ButtonEditClick(Sender: TObject);
begin
 with TUpdateForm.Create(Self) do
   try
     sFldTN := Table1.FieldByName('TN').AsString;
     sFldFIO := Table1.FieldByName('FIO').AsString;
     nFldRng := Table1.FieldByName('Rng').AsFloat;
     InitControls;
     ShowModal;
   finally
     Free;
   end;
end;


В "правочной" форме написать:

type
 TUpdateForm = Class(Tform);
  ....
 public
    sFldTN := String;
    sFldFIO := String;
    nFldRng := double;
    procedure InitControls;
    function CheckControls: boolean;
 end;

implementation

procedure TUpdateForm.ButtonCancel(Sender: TObject);
begin
 InitControls;  // Отмена изменений и восстановление исходных значений полей
end;

procedure TUpdateForm.ButtonPost(Sender: TObject);
begin
 // Формирование запроса на изменение данных в таблице
 Close;
end;

procedure TUpdateForm.ButtonClose(Sender: TObject);
begin
 Close;
end;

procedure TUpdateForm.InitControls;
// Данные из "буферных" переменных разносятся по визуальным контролам
begin
 Edit1.Text := sFldTN;
 Edit2.Text := sFldFIO;
 ...
end;

function TUpdateForm.CheckControls: boolean;
// Контроль корректности введенных (измененных) данных
begin
 result := false;
 with Edit1 do
    if Length(Trim(Text))<5 then
      begin
       ShowMessage('Ошибка в фамилии');
       SelectAll;
       SetFocus;
       exit;
      end;
 with Edit2 do
     ....  
 result := true;
end;    

   end; := sFldTN;
 Edit2.Text := sFldFIO;
 ...
end;


ЮЮ   (2006-09-27 11:43:00) [2]

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

Проще защититься от "случайного" закрытия окна, чем изобретать такое


Наверх

Титульная страница Поиск, карта сайта Написать письмо