Показать сообщение отдельно
  #28  
Старый 15.10.2013, 13:29
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Uniq!
Вызывать Диалог, в котором будут редактироваться данные нужно в AfterInsert?
Не-а, не угадал.

Весь смысл деления программы на интерактивные и пакетные потоки -- в том, чтобы не перемешивать "видимый" и "невидимый" код. Событие AfterInsert -- неинтерактивное, помещать в него вызов диалога -- нарушение декомпозиции. "Действие диалогом" должно выглядеть примерно так:

Код:
type
  TDataSetDialog = class(TForm)
    ...
    EditingSource: TDataSource; // назначен всем DB-компонентам
                                // и как MasterDataSet деталям
    ...
  public
    function Execute(DataSet: TDataSet): Boolean;
  end;

function TDataSetDialg.Execute(DataSet: TDataSet): Boolean;
begin
  EditingSource.DataSet := DataSet;
  Result := ShowModal = mrOK;
  if Result then
    DataSet.Post  // тут срабатывает AfterPost, делающий UpdateBatch деталей
  else
    DataSet.Cancel;
end;

// вызов
begin
  Tickets.Insert; // или Tickets.Edit
  with TTicketsDialog.Create do
  try
    Execute(Tickets);
  finally
    Free;
  end;
end;
Комментарий в коде подсказывает правильное использование AfterPost -- невизуальное событие для невизуальных действий.

Если редактирование деталей или доступ к справочникам требует какой-то дополнительной инициализации, вызов Post или Edit можно внести прямо в Execute, передавая ей вторым параметром команду:
Код:
type
  TDataSetCommand = (cmInsert, cmEdit);

  TDataSetDialog = class(TForm)
  public
    function Execute(DataSet: TDataSet; Command: TDataSetCommand): Boolean;
  end;

function TDataSetDialg.Execute(DataSet: TDataSet; Command: TDataSetCommand): Boolean;
begin
  EditingSource.DataSet := DataSet;
  // куча дополнительных инициализаций, в том числе через виртуальный метод в потомках
  if Command = cmInsert then
    DataSet.Insert
  else
    DataSet.Edit;
  ...
end;

Цитата:
Сообщение от Mrak
И еще небольшой вопросик для Freeman, использую DataModule и обращаюсь к Query на нем как через глобальную переменную
Не существует универсального ответа на все случаи. Нужно изучать архитектуру конкретного приложения и постановку задачи.

Цитата:
Сообщение от Uniq!
для Freeman прилепил два файла с GUI.
fMain(Главная форма) и fNewTicket(диалог)
Ну да, ну да, какой на фиг диалог? Такой дизайн может иметь боковая док-панель или фрейм внутри диалога, но не сам диалог. Диалог -- обязательно с диалоговыми кнопками.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием