Autor Téma: Trieda, ktorá vráti rôzne typy komponentov  (Přečteno 771 krát)

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1539
  • Karma: 37
    • Pepak.net
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #15 kdy: 23-01-2021, 21:11:22 »
Jo, teď jsi to fakt "objasnil". Takže ne 75-25, ale 95-5. No ale to už je tvůj boj. Já jsem ti nástin řešení dal a až si ujasníš, co vlastně chceš, tak ho jistě dokážeš adaptovat i na svoje požadavky. Takhle spatra bych řekl, že to budeš mít dokonce jednodušší, protože ti odpadne potřeba pole DbxxxKomponent (i když teda nechápu, proč jsi o nich vůbec psal, když je nepotřebuješ) a tedy i přepočet indexu do toho pole.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #16 kdy: 23-01-2021, 21:14:08 »
Zoberme tento príklad
Kód: Delphi [Vybrat]
  1. procedure TfrmPlannerRole.advsedDayScaleChange(Sender: TObject);
  2. var
  3.   SpinEdit: TAdvSpinEdit;
  4. begin
  5.   SpinEdit := TAdvSpinEdit(Sender);
  6.   dbplDay.Display.Displayscale := SpinEdit.Value;
  7. end;
Na túto udalosť je napojených (či opačne?) 8 Spinedit. Nie je problém, lebo dbplDay sa nemení. Ja chcem to isté, ale miesto "dbplDay" tam potrebujem dosadzovať komponent dynamicky.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #17 kdy: 23-01-2021, 21:16:09 »
Jo, teď jsi to fakt "objasnil". Takže ne 75-25, ale 95-5. No ale to už je tvůj boj. Já jsem ti nástin řešení dal a až si ujasníš, co vlastně chceš, tak ho jistě dokážeš adaptovat i na svoje požadavky. Takhle spatra bych řekl, že to budeš mít dokonce jednodušší, protože ti odpadne potřeba pole DbxxxKomponent (i když teda nechápu, proč jsi o nich vůbec psal, když je nepotřebuješ) a tedy i přepočet indexu do toho pole.
Ja ich potrebujem.
Asi to necháme tak. Za tie nervy a námahu to nestojí. A tých prípadov nie až tak veľké množstvo. A meniť sa to nebude.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #18 kdy: 23-01-2021, 21:21:18 »
ale miesto "dbplDay" tam potrebujem dosadzovať komponent dynamicky
No to spis nepujde nez pujde - to budes muset nejak namapovat

Citace
a mám   TViews = (vwMultiDay, vwPeriod, vwHalfDayPeriod, vwMonth, vwMultiMonth, vwTimeLine, vwActiveDay, vwActiveDayPeriod);
No a nemuzes udelat neco ve smyslu, jak naznacil pepak tj. napr.
Kód: Delphi [Vybrat]
  1.   ...
  2.   case TViews(Sender.Tag) of
  3.     vsMultiDay := Dbx.Y.Z := spinEdit.Value;
  4.     vsPeriod := Dby.Y.Z := spinEdit.Value;
  5.     ...
  6.     else raise ....
  7.   end;
  8.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #19 kdy: 23-01-2021, 21:37:07 »
Hm, tak to by išlo. Len tam pošlem patričnú hodnotu. Ja ten Sender.Tag nepotrebujem. Vystačím si s ComboBox.ItemIndex.
Ďakujem všetkým za trpezlivosť a uzatváram to.
.

Tých metód bude trochu viac, ale nič moc.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1539
  • Karma: 37
    • Pepak.net
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #20 kdy: 23-01-2021, 21:37:46 »
Dlouhá zkušenost mi říká, že pokud s nějakým problémem nemohu pohnout, vyplatí se ho zformulovat tak, aby ho pochopil někdo zcela nezúčastněný. Někdy přímo dokáže poradit řešení jiným způsobem, než jak jsem nad tím uvažoval sám. Většinou na ten jiný přístup přijdu sám už na základě toho, že jsem se zastavil, poodstoupil a problém popsal jinými slovy. Tady máme IMHO opačný případ - Stanislav je zablokovaný ve své představě, kterou ale neumí ani sám sobě, natož někomu dalšímu, popsat, co vlastně obsahuje, a v důsledku toho se pořád motá dokola nad přístupem k řešení, který mu připadá jediný možný. On možná jediný možný je, ale možná ne; to nejde ani odhadnout, protože prostě pořád nikdo z nás, ani S., neví, o čem je ten problém.

Můj odhad je, že to řešení existuje a je dost jednoduché.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #21 kdy: 23-01-2021, 21:44:35 »
Máš svätú pravdu. Nie som výnimka, aj ja tak fungujem. Preto niekedy napíšem príspevok, ale nepošlem ho. A riešenie mi príde na um.
V tomto prípade som situáciu považoval za tak jednoduchú a zrozumiteľnú, že som až v miernom šoku z výsledku. A to isté sa mi udialo na D-Praxis. Takže to nie je náhoda. Ešteže sa môžem vyhovoriť na svoje šediny ;)
Už mám večierku. Dobrú noc.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 308
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #22 kdy: 25-01-2021, 02:11:23 »
Problém je v
Kód: Delphi [Vybrat]
  1. private
  2.     SeznamDbxxxKomponent: array of TDbxxxKomponenta;
  3.       // Nebo TDirectory, TObjectList atd.
TDbxxxKomponenta je vždy iný typ. Viď príspevok nižšie. To je celé jadro problému. Pochádzajú síce z TDBItems, ale to mi nijako nepomôže.
Preto to neviem vyriešiť. V mieste použitia by som to musel pretypovať a tým to je celé v háji.

Stando, TMS komponenty neznám, ale pokud chceš mít nějaký univerzální handler OnChange() a v něm nastavovat konkrétní property (např. ten "MonthIncrement") pro více různých komponent, tak z toho přeci vyplývá, že ty komponenty musejí mít společného předka, ne?
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #23 kdy: 25-01-2021, 09:26:01 »
Problém je v
Kód: Delphi [Vybrat]
  1. private
  2.     SeznamDbxxxKomponent: array of TDbxxxKomponenta;
  3.       // Nebo TDirectory, TObjectList atd.
TDbxxxKomponenta je vždy iný typ. Viď príspevok nižšie. To je celé jadro problému. Pochádzajú síce z TDBItems, ale to mi nijako nepomôže.
Preto to neviem vyriešiť. V mieste použitia by som to musel pretypovať a tým to je celé v háji.

Stando, TMS komponenty neznám, ale pokud chceš mít nějaký univerzální handler OnChange() a v něm nastavovat konkrétní property (např. ten "MonthIncrement") pro více různých komponent, tak z toho přeci vyplývá, že ty komponenty musejí mít společného předka, ne?
Veď som písal, že majú. Problém je v tom, žeby som ich v mieste použitia musel vždy pretypovať. Viac menej robím to isté, len som to presunul do triedy. Aby som to nemal vo formulári.
No, už mi to tak nemyslí ???  A niekedy vôbec :)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 308
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #24 kdy: 25-01-2021, 09:33:20 »
No jasně že musel, ale všechny jen na toho společného předka, to snad není problém, ne? Pořád by ti to asi nahradilo handlery pro každý spinedit extra.
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #25 kdy: 25-01-2021, 15:42:56 »
No jasně že musel, ale všechny jen na toho společného předka, to snad není problém, ne? Pořád by ti to asi nahradilo handlery pro každý spinedit extra.
Veď to mám v jedinom SpinEdit. Mám to na spôsob aký navrhol pf1957 v #9
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #26 kdy: 25-01-2021, 17:05:20 »
No jasně že musel, ale všechny jen na toho společného předka, to snad není problém, ne? Pořád by ti to asi nahradilo handlery pro každý spinedit extra.
To prave problem je, protoze ten spolecny predek nema vlastnosti, ktere Standa potrebuje a musel by udelat type cast podle nejakeho diskriminatoru. A jednoduse to nepujde ani pomoci namapovani disktriminatoru na tridu, protoze se neda napsat (z pepakova prikladu):
Kód: Delphi [Vybrat]
  1. var
  2.   someClass: TClass;
  3. begin
  4.   someClass := SeznamDbxxxKomponent[Index].GetClassType;
  5.   someClass(SeznamDbxxxKomponent[Index]).MonthIncrement := SpinEdit.Value;
  6.  
a stejne by tam musela byt nejaka selekce podle hodnoty diskriminatoru.

A kdyby nemely vsechny DBxxx komponenty property MonthIncrement, tak by se ten setter musel dal hledat introspekci  a muselo by se vedet, jak se jmenuje, takze zase nejaka mapa...

#

No a v pripade proste selekce, jak jsem nastinil, je samozrejme otazka, co je vyhodnejsi: jestli ten case (diskriminant) of ve spolecnem handleru a nebo se na to vybodnout a nadelat hafo jednoduchych OnChange handleru, kde by v kazdem byla vlastne spravna hodnota z vetve toho case prikazu. Ten case by mel snad jedinou vyhodu, ze by bylo na jednom miste videt, co se kde dela a clovek by se nemusel brodit srackama v design time.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 308
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #27 kdy: 25-01-2021, 20:29:05 »
Pořád se v tom asi moc neorientuju a v poslední době mi přijde, že jsem bohužel čím dál tím blbější, ale stejně to zkusím ještě okomentovat:
Typecast podle diskriminátoru ano, ale nemusel by přeci castit na nějakého konečného potomka, ale na nejnižšího společného předka, který má požadovanou property. I to by mu snad ušetřilo nějaký ten handler. Přeci snad nechce Standa naslepo nastavovat nějakou property, aniž by věděl, jestli ji ten objekt vůbec má.
V podstatě bych to viděl nějak jako
Kód: Delphi [Vybrat]
  1. if MyObjectArray[(Sender as TComboBox).ItemIndex] is TDBxxWithPropertyMonthIncrement then
  2.   TDBxxWithPropertyMonthIncrement(MyObjectArray[TComboBox(Sender).ItemIndex]).MonthProperty := Value;
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #28 kdy: 25-01-2021, 21:19:16 »
Všetky odpovede sú v podstate správne.
Urobil som si analýzu z ktorej vyplynulo, že to prakticky potrebujem len pre jedinú udalosť. Čo ma zaskočilo. A tú dokonca teraz ani nepoužívam ;D Ale keby v budúcnosti...
Neskúmal som, či ten spoločný predok má práve požadovanú vlastnosť. Nebol dôvod.
Kód: Delphi [Vybrat]
  1. procedure TRolePlanner.GetNumberOfResources(AItemIndex, Value: Integer);
  2. var
  3.   Form: TfrmPlannerRole;
  4. begin
  5.   Form := TfrmPlannerRole(FForm);
  6. .
  7.   case TViews(AItemIndex) of
  8.     vwMultiDay: Form.dbdysrMultiDay.NumberOfResources := Value;
  9.     vwPeriod: Form.dbprsrPeriod.NumberOfResources := Value;
  10.     vwHalfDayPeriod: Form.dbhldyprsrHalfDayPeriod.NumberOfResources := Value;
  11.     vwMonth: Form.dbmnsrMonth.NumberOfResources := Value;
  12. //    vwMultiMonth: Form.dbmlmnsrMultiMonth. Neexistuje := Value;
  13.     vwTimeLine: Form.dbtmlnsrTimeLine.NumberOfResources := Value;
  14.     vwActiveDay: Form.dbacdysrActiveDay.NumberOfResources := Value;
  15.     vwActiveDayPeriod: Form.dbacdyprsrActiveDayPeriod.NumberOfResources := Value;
  16.   end;
  17. end;
Takže takto nejako si programujem :o
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Trieda, ktorá vráti rôzne typy komponentov
« Odpověď #29 kdy: 25-01-2021, 23:52:11 »
ale na nejnižšího společného předka, který má požadovanou property.
No pokud takovy spolecny predek existuje, tak neni co resit. Ja tu mnozinu komponent neznam, ale Standa vsude psal, ze spolecny predek je TDBItems, ktery potrebne property nema a proto by musel delat type cast na konkretni typ, protoze jinak by ho vubec delat nemusel.

Take by si mohl definovat spolecny interface a pak ho v kazde te tride DBxxx implementovat, ale to jsem mu radsi ani nenavrhoval.