Autor Téma: Univerzální přiřazení FieldGetTextEvent  (Přečteno 259 krát)

Offline egroups

  • Nováček
  • *
  • Příspěvků: 34
  • Karma: 0
Univerzální přiřazení FieldGetTextEvent
« kdy: 19-10-2020, 11:02:39 »
Zdravím vespolek,narazil jsem na problém z kterého jsem nějak paf.

Snažím se překonvertovat určité hodnoty z datasetu do DBGridu,podle určitých pravidel.
Když použiji toto:
Kód: Delphi [Vybrat]
  1. DS.DataSet.FieldByName('Uhrada').OnGetText:=DateOnGetText;
a dále v kódu stejné třídy (obecně by se dalo říct Formu) mám něco takového:
Kód: Delphi [Vybrat]
  1. procedure TFP_Faktury.DateOnGetText(Sender: TField; var Text: string;
  2.     DisplayText: Boolean);
  3. begin
  4. ........
  5. end;
  6.  
tak to funguje korektně.

Jenže já potřebuji toto zobecnit,takže jsem udělal interface:
Kód: Delphi [Vybrat]
  1.   IFieldDisplayFormatter=interface(IInvokable)
  2.     ['{C21CA5D7-0BDA-4C5D-A495-F7C34B0D3E3A}']
  3.     procedure OnGetText(Sender: TField; var Text: string; DisplayText: Boolean);
  4.   end;
  5.  
a následně implementaci:
Kód: Delphi [Vybrat]
  1.   TCacheDateFieldFormater=class(TInterfacedObject,IFieldDisplayFormatter)
  2.   public
  3.     procedure OnGetText(Sender: TField; var Text: string; DisplayText: Boolean);
  4.   end;
  5.  

Jenže,když pak chci přiřadit v tom formu tuto proceduru třeba takto:
Kód: Delphi [Vybrat]
  1. var
  2.   Formater:IFieldDisplayFormatter
  3.  
  4.   DS.DataSet.FieldByName('Uhrada').OnGetText:=Formater.OnGetText;
  5.  

tak mi to Delphi nepřeloží,protože neodpovídají definice,ale proč?Tomu nerozumím.Běžně Eventy takto přiřazuji.
Ví někdo příčinu?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Univerzální přiřazení FieldGetTextEvent
« Odpověď #1 kdy: 19-10-2020, 12:28:08 »
tak mi to Delphi nepřeloží,protože neodpovídají definice,ale proč?Tomu nerozumím.Běžně Eventy takto přiřazuji.
Ví někdo příčinu?
Bezna event je definovana jako
Kód: Delphi [Vybrat]
  1. procedure(...) of object
a to metoda IFieldDisplayFormatter.OnGetText neni.
A i kdyz je prirozene, ze by to priradit jit melo, tak AFAIK Delphi tohle neresil. Ale zkus se zeptat na SO nebo nekde na foru, kde se skalni Delfisti srocuji, jestli nedoslo k nejakemu posunu nebo neexistuje nejaky hack.

Ja si pro sebe pred lety odnesl, ze interfejsy v Delphi maji dve omezeni: nedaji se priradit k udalosti a nepodporuji class methods.
« Poslední změna: 19-10-2020, 12:36:20 od pf1957 »

Offline egroups

  • Nováček
  • *
  • Příspěvků: 34
  • Karma: 0
Re:Univerzální přiřazení FieldGetTextEvent
« Odpověď #2 kdy: 19-10-2020, 13:52:35 »
Hmm,to je blbé,chtěl jsem to napasovat ke svým službám ohledně datasetu,aby to u specifických polí formátovalo automaticky.Takhle bych to jedině musel přidat do předka všech mých formulářů a v každém formuláři,který by používal tahle pole,bych to musel extra přiřadit,což mi přijde jako úplná prasárna.
Není nějaký jiný způsob,jak toho dosáhnout?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Univerzální přiřazení FieldGetTextEvent
« Odpověď #3 kdy: 19-10-2020, 17:39:54 »
Hmm,to je blbé,chtěl jsem to napasovat ke svým službám ohledně datasetu,aby to u specifických polí formátovalo automaticky.Takhle bych to jedině musel přidat do předka všech mých formulářů a v každém formuláři,který by používal tahle pole,bych to musel extra přiřadit,což mi přijde jako úplná prasárna.
Není nějaký jiný způsob,jak toho dosáhnout?
No musi formater interface? Nestaci jen plain object?

Offline egroups

  • Nováček
  • *
  • Příspěvků: 34
  • Karma: 0
Re:Univerzální přiřazení FieldGetTextEvent
« Odpověď #4 kdy: 20-10-2020, 07:07:53 »
Jelikož se snažím co nejvíce používat interface a registrovat je v containeru,tak jsem to upřednosťoval.No,zkusím použít nějaký object,uvidím,co to udělám.Akorát budu muset extra hlídat životnost takového objectu.