Цитата:
Сообщение от 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(диалог)
|
Ну да, ну да, какой на фиг диалог? Такой дизайн может иметь боковая док-панель или фрейм внутри диалога, но не сам диалог. Диалог -- обязательно с диалоговыми кнопками.