-
Имею датасет в модуле данных.
Имею функцию, которая создает стандартные формы-таблицы.
Создаю такую форму, которая среди прочего содержит метод FilterRecord, который присваиваю датасету в процессе инициализации формы.
Как пользуясь ссылкой FilterRecord, получить ссылку на форму?
-
TMethod(FilterRecord).Data ?
-
Благодарю, сработало.
-
> Создаю такую форму, которая среди прочего содержит метод
> FilterRecord
Любому методу формы передается неявный параметр Self, содержащий ссылку (указатель) на конкретный экземпляр данного класса формы, в котором вызван сей метод. Может это та самая печка, от которой и нужно плясать в данной задаче?
-
Сереж, а если инстанс класса не является наследником формы, то что ему приходится делать? :)
-
> Любому методу формы передается неявный параметр Self,
Насколько я понимаю, для этого нужно вызвать метод формы и изнутри параметр Self будет доступен.
Указатель требуется вне контекста формы для ее активации.
Ее вообще может еще не быть, тогда она создается.
Если она есть, по указателю форма выводится на передний план.
-
> Rouse_ © (09.08.17 13:51) [4]
Саш, в топике чётко было указано, что FilterRecord это метод формы. Если автору использование Self не подходит по неким соображениям, то это его дело.
P.S. Мне только не очень нравится, что некий датасет в модуле данных в качестве обработчика своего события имеет метод некоей формы, которая может быть ещё и не создана. А если и создана, то неизвестно когда, зачем и почему? И её приходится искать по ссылке на метод.
Но это только моё ИМХО.
-
Мне самому не очень нравится.
На тот момент иначе не придумал.
Какая-то проблема с присвоением процедурного типа.
Привязал метод к форме.
-
Переменные связанные только с формой тоже используются в фильтрации.
-
> Дмитрий (11.08.17 16:44) [7]
> Какая-то проблема с присвоением процедурного типа.
Проблем нет: присваивают метод, а не обычную (регулярную) процедуру.
Ну, и датамодулю знать о формах необязательно.
Проще наоборот: формы используют (uses) датамодуль.
Да, и если где-то хранятся ссылки на то, что может быть уничтожено,
необходимо пользоваться механизмом Notification, RTFM.
--
Regards, LVT.
-
> Проще наоборот: формы используют (uses) датамодуль.
В данном случае даже не только проще, но и логичнее. О каком OnFilterRecord может идти речь, если нет формы, в которой пользователь может задать параметры фильтра?
-
Когда пользователь задает параметр фильтра форма уже есть.
Иначе у пользователя не выйдет.
Ссылки не хранятся, но возможна попытка повторного создания формы с использованием того же датасета.
Когда-то планировалась такая возможность, из которой путного не выросло.
-
> Дмитрий (14.08.17 15:31) [11]
>
> Когда пользователь задает параметр фильтра форма уже есть.
>
> Иначе у пользователя не выйдет.
>
> Ссылки не хранятся, но возможна попытка повторного создания
> формы с использованием того же датасета.
> Когда-то планировалась такая возможность, из которой путного
> не выросло.
>
Вот насчёт "повторного создания формы с использованием того же датасета" стоит объясниться.
Эти формы сами что-ли живут своей жизнью и создаются, когда им вздумается?
-
> [11] Дмитрий (14.08.17 15:31)
> но возможна попытка повторного создания формы с использованием
> того же датасета
А нужен ли датамодуль в этом случае. Размещай датасеты на форме.
-
Есть у меня набор функций, которые создают типовую форму-таблицу.
В том числе список для выбора.
Датасет передается как аргумент в функцию, сам может лежать где угодно.
-
> Дмитрий (15.08.17 18:42) [14]
>
> Есть у меня набор функций, которые создают типовую форму-
> таблицу.
> В том числе список для выбора.
Очень похоже на описание конструктора Lego. Но не на программу.
-
Разумеется, ведь модульность это только для Лего.
Стандартизация вообще к программированию никак и нигде.
-
> Дмитрий (17.08.17 14:07) [16]
> Стандартизация вообще к программированию никак и нигде.
Не знаю как тут со стандартизацией, но в [14] подход явно не "наш".
Бо, обычно объекты создают не функциями (регулярными), а
конструкторами (пусть даже наборами конструкторов).
Вот когда определен правильный дизайн, тогда и становится неважным,
где находится нофелет, т.к. для формы важнее источник данных.
--
Regards, LVT.
-
> Дмитрий (17.08.17 14:07) [16]
>
> Разумеется, ведь модульность это только для Лего.
> Стандартизация вообще к программированию никак и нигде.
>
Вот такая "модульность" это как раз Лего. Когда тупо смотришь на модуль и думаешь как бы его пристроить, чтобы получилось хоть что-то.
В программировании всё-таки "модули" создаются осознанно. Для конкретных целей.
-
У меня вполне достаточно косяков, чтобы было о чем поелозить.
Вспоминать Лего просто смешно.
> Не знаю как тут со стандартизацией, но в [14] подход явно
> не "наш".Бо, обычно объекты создают не функциями (регулярными),
> аконструкторами (пусть даже наборами конструкторов).
Поясните, в чем "ненашподход"?
Почему функция не может вызвать конструктор, настроить объект и предоставить для дальнейшего использования?
-
> Дмитрий (23.08.17 20:25) [19]
> Почему функция не может вызвать конструктор, настроить объект
> и предоставить для дальнейшего использования?
Нет нужды в такой функции, все это может/должен конструктор.
Может это другой конструктор, or override or overload,
м.б. к.-л. дополнительный метод инициализации.
Метод, а не регулярная функция.
Такое вот ООП.
--
Regards, LVT.
-
Function SelectCompanyID () : integer;
var
xF : txForm;
begin
xF :=txForm.Create;
xF.Init1;
...
xF.Init10;
result :=xF.ShowModal;
FreeAndNil(xf);
end;
-
> Дмитрий (25.08.17 15:05) [21]
type
TFormXX = class(TFormX)
..
public
function ExecSelectId: Longint;
procedure DoClose(var Action: TCloseAction); override;
constructor CreateWith10Inits(AOwner: TComponent); virtual;
end;
procedure TFormXX.DoClose;
begin
inherited;
Action := caFree;
end;
constructor TFormXX.CreateWith10Inits;
begin
inherited Create(AOwner);
..
end;
function TFormXX.ExecSelectId;
begin
Result := -1;
if ShowModal = mrOK then
Result := ..;
end;
Например:
Caption := IntToStr(TFormXX.CreateWith10Inits(nil).ExecSelectId);
--
Regards, LVT.
-
> Дмитрий (23.08.17 20:25) [19]
> Почему функция не может вызвать конструктор, настроить объект
> и предоставить для дальнейшего использования?
Может. Но зачем нужна такая функция? Она же лишняя. Все это может сделать сам конструктор. Лишние усложнения, лишние вызовы - зачем они?
-
> Caption := IntToStr(TFormXX.CreateWith10Inits(nil).ExecSelectId);
Фу.
-
> Лишние усложнения, лишние вызовы - зачем они?
Функция-оболочка для удобства обращения.
function SelectID (ds : TDataSet; FieldName : string) : Longint;
var
xF :TxForm;
begin
xF :TxForm.Create();
...
end;
procedure SetCompany;
begin
CompanyID:=SelectID(CompanyDataSet, 'CompanyID');
...
end;
procedure SelectKlient;
begin
KlientID:=SelectID(KlientDataSet, 'KlientID');
...
end;
procedure SelectProduct;
begin
ProductID:=SelectID(ProductDataSet, 'ProductID');
...
end;
Какой смысл изображать ее методом TxForm.SelectID ?
-
> Лишние усложнения, лишние вызовы - зачем они?
Функция-оболочка для удобства обращения.
function SelectID (ds : TDataSet; FieldName : string) : Longint;
var
xF :TxForm;
begin
xF :TxForm.Create();
...
end;
procedure SetCompany;
begin
CompanyID:=SelectID(CompanyDataSet, 'CompanyID');
...
end;
procedure SelectKlient;
begin
KlientID:=SelectID(KlientDataSet, 'KlientID');
...
end;
procedure SelectProduct;
begin
ProductID:=SelectID(ProductDataSet, 'ProductID');
...
end;
Какой смысл изображать ее методом TxForm.SelectID ?
-
костыль для рудимента