Конференция "Начинающим" » Получить ссылку на объект по его методу [D7, D2005, XP, 2003]
 
  • Дмитрий (08.08.17 18:10) [0]
    Имею датасет в модуле данных.
    Имею функцию, которая создает стандартные формы-таблицы.
    Создаю такую форму, которая среди прочего содержит метод FilterRecord, который присваиваю датасету в процессе инициализации формы.

    Как пользуясь ссылкой FilterRecord, получить ссылку на форму?
  • Игорь Шевченко © (08.08.17 18:48) [1]
    TMethod(FilterRecord).Data ?
  • Дмитрий (08.08.17 19:30) [2]
    Благодарю, сработало.
  • Германн © (09.08.17 01:01) [3]

    > Создаю такую форму, которая среди прочего содержит метод
    > FilterRecord

    Любому методу формы передается неявный параметр Self, содержащий ссылку (указатель) на конкретный экземпляр данного класса формы, в котором вызван сей метод. Может это та самая печка, от которой и нужно плясать в данной задаче?
  • Rouse_ © (09.08.17 13:51) [4]
    Сереж, а если инстанс класса не является наследником формы, то что ему приходится делать? :)
  • Дмитрий (09.08.17 18:17) [5]

    > Любому методу формы передается неявный параметр Self,

    Насколько я понимаю, для этого нужно вызвать метод формы и изнутри параметр Self будет доступен.
    Указатель требуется вне контекста формы для ее активации.
    Ее вообще может еще не быть, тогда она создается.
    Если она есть, по указателю форма выводится  на передний план.
  • Германн © (10.08.17 00:54) [6]

    > Rouse_ ©   (09.08.17 13:51) [4]

    Саш, в топике чётко было указано, что FilterRecord это метод формы. Если автору использование Self не подходит по неким соображениям, то это его дело.

    P.S. Мне только не очень нравится, что некий датасет в модуле данных в качестве обработчика своего события имеет метод некоей формы, которая может быть ещё и не создана. А если и создана, то неизвестно когда, зачем и почему? И её приходится искать по ссылке на метод.
    Но это только моё ИМХО.
  • Дмитрий (11.08.17 16:44) [7]
    Мне самому не очень нравится.
    На тот момент иначе не придумал.
    Какая-то проблема с присвоением процедурного типа.
    Привязал метод к форме.
  • Дмитрий (11.08.17 17:48) [8]
    Переменные связанные только с формой тоже используются в фильтрации.
  • Leonid Troyanovsky © (13.08.17 13:54) [9]

    > Дмитрий   (11.08.17 16:44) [7]

    > Какая-то проблема с присвоением процедурного типа.

    Проблем нет: присваивают  метод, а не обычную (регулярную) процедуру.

    Ну, и датамодулю знать о формах необязательно.
    Проще наоборот:  формы используют (uses) датамодуль.

    Да, и если где-то хранятся ссылки на то, что может быть уничтожено,
    необходимо пользоваться механизмом Notification, RTFM.

    --
    Regards, LVT.
  • Германн © (14.08.17 01:31) [10]

    > Проще наоборот:  формы используют (uses) датамодуль.

    В данном случае даже не только проще, но и логичнее. О каком OnFilterRecord может идти речь, если нет формы, в которой пользователь может задать параметры фильтра?
  • Дмитрий (14.08.17 15:31) [11]
    Когда пользователь задает параметр фильтра форма уже есть.
    Иначе у пользователя не выйдет.

    Ссылки не хранятся, но возможна попытка повторного создания формы с использованием того же датасета.
    Когда-то планировалась такая возможность, из которой путного не выросло.
  • Германн © (15.08.17 03:01) [12]

    > Дмитрий   (14.08.17 15:31) [11]
    >
    > Когда пользователь задает параметр фильтра форма уже есть.
    >
    > Иначе у пользователя не выйдет.
    >
    > Ссылки не хранятся, но возможна попытка повторного создания
    > формы с использованием того же датасета.
    > Когда-то планировалась такая возможность, из которой путного
    > не выросло.
    >

    Вот насчёт "повторного создания формы с использованием того же датасета" стоит объясниться.
    Эти формы сами что-ли живут своей жизнью и создаются, когда им вздумается?
  • Inovet © (15.08.17 03:57) [13]
    > [11] Дмитрий   (14.08.17 15:31)
    > но возможна попытка повторного создания формы с использованием
    > того же датасета

    А нужен ли датамодуль в этом случае. Размещай датасеты на форме.
  • Дмитрий (15.08.17 18:42) [14]
    Есть у меня набор функций, которые создают типовую форму-таблицу.
    В том числе список для выбора.
    Датасет передается как аргумент в функцию, сам может лежать где угодно.
  • Германн © (16.08.17 02:25) [15]

    > Дмитрий   (15.08.17 18:42) [14]
    >
    > Есть у меня набор функций, которые создают типовую форму-
    > таблицу.
    > В том числе список для выбора.

    Очень похоже на описание конструктора Lego. Но не на программу.
  • Дмитрий (17.08.17 14:07) [16]
    Разумеется, ведь модульность это только для Лего.
    Стандартизация вообще к программированию никак и нигде.
  • Leonid Troyanovsky © (17.08.17 14:45) [17]

    > Дмитрий   (17.08.17 14:07) [16]

    > Стандартизация вообще к программированию никак и нигде.

    Не знаю как тут со стандартизацией, но  в  [14] подход явно не "наш".

    Бо, обычно объекты создают не функциями (регулярными), а
    конструкторами (пусть даже наборами конструкторов).

    Вот когда определен правильный дизайн, тогда и становится неважным,
    где  находится нофелет, т.к. для формы  важнее  источник данных.

    --
    Regards, LVT.
  • Германн © (18.08.17 01:54) [18]

    >  Дмитрий   (17.08.17 14:07) [16]
    >
    > Разумеется, ведь модульность это только для Лего.
    > Стандартизация вообще к программированию никак и нигде.
    >

    Вот такая "модульность" это как раз Лего. Когда тупо смотришь на модуль и думаешь как бы его пристроить, чтобы получилось хоть что-то.
    В программировании всё-таки "модули" создаются осознанно. Для конкретных целей.
  • Дмитрий (23.08.17 20:25) [19]
    У меня вполне достаточно косяков, чтобы было о чем поелозить.
    Вспоминать Лего просто смешно.


    > Не знаю как тут со стандартизацией, но  в  [14] подход явно
    > не "наш".Бо, обычно объекты создают не функциями (регулярными),
    >  аконструкторами (пусть даже наборами конструкторов).

    Поясните, в чем "ненашподход"?
    Почему функция не может вызвать конструктор, настроить объект и предоставить для дальнейшего использования?
  • Leonid Troyanovsky © (24.08.17 10:23) [20]

    > Дмитрий   (23.08.17 20:25) [19]

    > Почему функция не может вызвать конструктор, настроить объект
    > и предоставить для дальнейшего использования?

    Нет нужды в такой функции, все это может/должен конструктор.
    Может это другой конструктор, or override or overload,
    м.б. к.-л. дополнительный метод инициализации.
    Метод, а не регулярная функция.

    Такое вот ООП.

    --
    Regards, LVT.
  • Дмитрий (25.08.17 15:05) [21]
    Function SelectCompanyID () : integer;
    var
     xF : txForm;
    begin
     xF :=txForm.Create;
     xF.Init1;
     ...
     xF.Init10;

     result :=xF.ShowModal;
     FreeAndNil(xf);  
    end;

  • Leonid Troyanovsky © (25.08.17 19:25) [22]

    > Дмитрий   (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.
  • Юрий Зотов © (25.08.17 20:22) [23]
    > Дмитрий   (23.08.17 20:25) [19]

    > Почему функция не может вызвать конструктор, настроить объект
    > и предоставить для дальнейшего использования?


    Может. Но зачем нужна такая функция? Она же лишняя. Все это может сделать сам конструктор. Лишние усложнения, лишние вызовы - зачем они?
  • Игорь Шевченко © (26.08.17 14:35) [24]

    > Caption := IntToStr(TFormXX.CreateWith10Inits(nil).ExecSelectId);


    Фу.
  • Дмитрий (29.08.17 18:30) [25]

    > Лишние усложнения, лишние вызовы - зачем они?

    Функция-оболочка для удобства обращения.


    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 ?
  • Дмитрий (29.08.17 18:30) [25]

    > Лишние усложнения, лишние вызовы - зачем они?

    Функция-оболочка для удобства обращения.


    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 ?
  • Дмитрий (31.08.17 20:21) [27]
    костыль для рудимента
 
Конференция "Начинающим" » Получить ссылку на объект по его методу [D7, D2005, XP, 2003]
Есть новые Нет новых   [118241   +24][b:0][p:0.001]