Autor Téma: Moje MCVE - pripomienky a návrhy  (Přečteno 680 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Moje MCVE - pripomienky a návrhy
« kdy: 19-05-2019, 09:11:35 »
Viď https://forum.delphi.cz/index.php/topic,16665.0.html príspevok #20
Citace
No (co se tyce toho puvodniho MCVE kodu z jineho dotazu), zacal bych tim jak si z tech TMS komponent vyrobit (tak trochu) "DB aware" komponenty nez mastit neco tak neprehledneho a komplikovaneho (delajiciho ve vysledku vice nez ma).
Vytvoriť "DB awareP bol jediný dôvod pre napísanie tohto riešenia. To už mi bolo vytknuté. Som si toho stavu vedomý. Ja som to vtedy ináč nevedel a na tom sa zatiaľ nič nezmenilo :'(  Dokonca som rád/hrdý, že sa mi vôbec niečo podarilo dať dokopy.
Aj preto som tam napísal, že beriem akékoľvek pripomienky.
PS:
To Delfin - ja som dúfal, veril a túžobne očakával, že urobíš kostru MCV (Model - riadenie - pohľad) z ktorej budem vychádzať. Aj si začal, ale potom som už nedostal žiadnu informáciu. Pozor! Nič nevyčítam. Veď si nič nesľúbil, čo bolo aj z oboch strán zdôraznené. Pracoval si aj na tom, aby si pri VST obišiel record.
Na internete som našiel len teóriu, ale podľa nej to nespravím. Keby bol nejaký príklad, tak snáď.
« Poslední změna: 19-05-2019, 09:24:07 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #1 kdy: 19-05-2019, 09:28:00 »
Ešte dodatok.
Mám dva projekty. Uvedené MCV (PoBeS) a správu bytov. Pri PoBeS by som to asi nechal tak ako to je. Nie je to veľký projekt. Tá správa bytov je už iná káva a tam by som to teda prerobil.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #2 kdy: 19-05-2019, 18:57:09 »
Jenze jsi skoncil de-facto s vlastni implementaci DB aware komponent (pripadne chovani LiveBindings). Jen tezkopadnou, bez vyuziti datalinku. Co mas ted je separatni objekt v nemz strezis odkaz na vizualni objekt a odkaz na typ DB pole spolu s jeho nazvem. Zjednodusene:

Kód: Delphi [Vybrat]
  1. type
  2.   TDBEditCtrl = class(TObject)
  3.   strict private
  4.     FEditWinCtrl: TWinControl;
  5.     FFieldType: TFieldType;
  6.     FNameField: string;
  7.   public
  8.     property EditWinCtrl: TWinControl read FEditWinCtrl write FEditWinCtrl;
  9.     property FieldType: TFieldType read FFieldType write FFieldType default ftString;
  10.     property NameField: string read FNameField write FNameField;
  11.   end;

A objekt ktery obsahuje kolekci TDBEditCtrl, instanci TFDTable a predava data z a do vizualnich komponent a obsluhuje cteni, vkladani, editaci a mazani zaznamu v objektu tabulky. Zjednodusene napr.:

Kód: Delphi [Vybrat]
  1. type
  2.   TCustomDB = class
  3.   strict private
  4.     procedure ReadAdvOfficeCheckBox;
  5.     procedure ReadCheckBox;
  6.     procedure ReadtcCheckBox;
  7.     procedure ReadtcComboBox;
  8.     procedure WriteAdvComboBox;
  9.     procedure WritetcCheckBox;
  10.     procedure WritetcCheckBoxBoolean;
  11.     procedure WritetcCheckBoxInteger;
  12.     procedure WritetcComboBox;
  13.   strict protected
  14.     FTable: TFDTable;
  15.     FDBEditCtrls: TObjectList<TDBEditCtrl>;
  16.   public
  17.     procedure DeleteRec(const AAutoCommit: Boolean); virtual;
  18.     procedure EditRec; virtual;
  19.     procedure InsertRec; virtual;
  20.   end;

To vse uz ovsem umi DB aware komponenty a dataset (pripadne LiveBindings) skrze datalink. Tim nechci rict ze se DB aware komponent nebo LiveBindings zastavam; naopak, nemam je rad a nikdy jsem je pro novy projekt nepouzil. Vydal bych se cestou implementace datalinku.
« Poslední změna: 19-05-2019, 19:12:41 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #3 kdy: 19-05-2019, 20:05:36 »
S DB aware komponentami som veľmi rýchlo narazil na problémy, ktoré by som riešil ťažko. Ak vôbec. Túto moju skúsenosť potvrdilo niekoľko ľudí. Takže ich nechcem. Mojim riešením som ich obišiel a naplno využívam vlastnosti klasických komponentov (TMS), ktorých je podstatne viac a fungujú bez chýb.
Citace
Vydal bych se cestou implementace datalinku.
Konečne niečo konkrétne :)  Idem sa pozrieť o čo vlastne ide.
.
Moje InsertRecord a EditRecord vôbec nepracujú s DB. Len nastavia príznak. V Post, po vykonaní kontroly údajov, na základe toho príznaku volám Table.Insert alebo Table.Edit. Hneď nasleduje Table.Post.
.
Akurát sa mi nepáči jedna vec. Pri tvorbe formulára si otvorím Table -> ReadOnly. A mám ju otvorenú až do zrušenia formulára. Kvôli pohybu v nej na základe vybraného záznamu vo VST. Keby som toto vedel odstrániť, tak by som bol napojený na tabuľku len v čase tvorby formulára (naplnenie VST, pokiaľ nepoužijem SQL query - a to je väčšina prípadov). To naplnenie VST môžem bez nejakých problémov urobiť natvrdo pomocou SQL query.
.
Raz si mi písal, že otvorená tabuľka nie je problém. Mne sa dostal pod ruky materiál, kde sa riešila optimalizácia výkonu aplikácie. Pre FB bolo jedno z odporúčaní uzatvoriť Table. Z toho sa vymotať neviem. Nezdá sa mi, žeby som mal pri každom pohybe v tabuľke volať Table.Open - Table.Locate() - Table.Close. Vychádzajme z predpokladu, že budem s programom úspešný ;D :o ::)  a v tabuľkách budú 10-tisíce záznamov.
.
OT: prečo mi to automatické formátovanie vždy hodí dva prázdne riadky namiesto jedného. Hurá, vyriešil som to bodkami 8)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #4 kdy: 19-05-2019, 20:26:00 »
Tak narýchlo som čosi našiel na internete. Až jeden príklad pre mňa. Ale tam si zo štandardného komponentu urobil DB. Touto cestou nechcem ísť. To by som po každej aktualizácii TMS musel všetko znova kompilovať. A ktovie ako by som to zvládol. Môj obľúbený TAdvEdit podporuje niekoľko vstupov. Preto som si ho obľúbil:
text, dátum + čas, celé číslo, mena, float, hexa... Ako by som toto ošetril. Tomu neverím, že by som to zvládol.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #5 kdy: 19-05-2019, 20:31:39 »
Ja nikde, okrem FastReport, nepoužívam DataSource. To je zas nejaká medzivrstva čo si niečo ukrojí zo systémových prostriedkov.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #6 kdy: 20-05-2019, 08:19:03 »
Citace
Vydal bych se cestou implementace datalinku.
Môžeš mi vysvetliť ako to myslíš? Všetko čo som o datalink našiel, bola vždy premena komponentu na DB komponentu.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #7 kdy: 20-05-2019, 09:02:54 »
Citace
Vydal bych se cestou implementace datalinku.
Všetko čo som o datalink našiel, bola vždy premena komponentu na DB komponentu.

Ano, to je jeho primarni poslani. Jeho uzitecnost se da ocenit v propagaci zmeny datasetu. Princip ktery jsem mel na mysli je, ze bys (z te sve tridy TCustomDB) ovladal dataset tedy vkladal zaznamy, editoval, mazal, skroloval atd. a pomoci datalinku naslouchal reakcim na tyto akce a podle typu zmen menil stav nebo hodnoty vizualnich komponent. Cimzto se tedy vracime k "DB aware" principu. Jen by sis jej mohl ohnout pro zve potreby i bez pouziti dodavanych DB aware komponent.

Reci MVC by se pak (s trochou nadsazky) dal datalink povazovat za model, vizualni komponenty za view a ovladac datasetu za controller.
« Poslední změna: 20-05-2019, 09:21:22 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #8 kdy: 20-05-2019, 12:31:32 »
Citace
Princip ktery jsem mel na mysli je, ze bys (z te sve tridy TCustomDB) ovladal dataset tedy vkladal zaznamy, editoval, mazal, skroloval atd. a pomoci datalinku naslouchal reakcim na tyto akce a podle typu zmen menil stav nebo hodnoty vizualnich komponent.
To som predpokladal, ale netuším ako by som to mal zrealizovať.
.
Pozrel som si všetky DB TMS. Vychádzajú zo základných, ktoré dopĺňajú o datalink. Tým pádom predpokladám, že by s nimi nemal byť žiaden problém ako u štandardných DB komponentov. Plus sú tam aj iné. Niektoré vyzerajú naozaj veľmi zaujímavo. Len mne sú skoro všetky nanič.

Teraz k môjmu riešeniu z pohľadu DB TMS. Mám
Kód: Delphi [Vybrat]
  1.  
  2.   TDBEditControl = class(TObject)
  3. *    FAllowZero: Boolean;  // Nemajú to. Musel by som to riešiť
  4. *    FDesired: Boolean;  // Pre mňa dôležité. Musel by som to riešiť. Existuje niečo čo by mi to nahradilo?
  5. *    FEditWinCtrl: TWinControl;  // V princípe bezpredmetné. Pre kontrolu údajov požadované
  6.     FFieldType: TFieldType;  // To si viem zistiť
  7.     FLocalName: string;  // Pokiaľ si dobre pamätám, tak sa to dá nastaviť v DataSet-e.
  8. *    FMinLength: Word;  // To by som musel riešiť
  9.     FNameField: string;  // To sa zadáva v DB komponente
  10.     FOnlyPositive: Boolean;  // Majú to implementované
  11.     FTypeCtrl: TTypeCtrl;  // Teraz sa už obídem bez toho
  12.  
Ak by som použil DB komponenty, tak by som musel riešiť 3-4 * položky a poradie kontroly jednotlivých prvkov pri základnej automatickej kontrole údajov.
Robiť potomkov z ich DB komponentov sa mi naozaj nechce.
.
Je možné tú kontrolu aj s dodržaním poradia (TabOrder) zrealizovať ináč?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #9 kdy: 20-05-2019, 12:32:26 »
Podotýkam, že s windows správami nemám žiadne skúsenosti.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #10 kdy: 20-05-2019, 16:29:38 »
Základ by mal byť niečo také?
Kód: Delphi [Vybrat]
  1. procedure TfrmMainForm.DataChange(Sender: TObject);
  2.  
  3. begin
  4.   if (DataLink.Field <> nil) then
  5.     TAdvEdit(DataLink.Control).Text := DataLink.Field.AsWideString;
  6. end;
  7. .
  8. procedure TfrmMainForm.FormCreate(Sender: TObject);
  9. begin
  10.   DataLink := TFieldDataLink.Create;
  11.   DataLink.Control := advedt1;
  12.   DataLink.FieldName := 'FullName';
  13.   DataLink.DataSource := ds1;
  14.   DataLink.OnDataChange := DataChange;
  15. end;
Hlavne ma zaujíma, či je správne navrhnutá a použitá funkcia DataChange.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #11 kdy: 20-05-2019, 16:46:10 »
To jde o field datalink. Ne datalink datasetu. Mel jsem na mysli ze bys mohl vyuzit datalink datasetu ve Tve tride TCustomDB ke sledovani zmen celych zaznamu (radku), ne jen hodnot zaznamu (bunek). Kolekci tech komponent (view) by sis tak mohl nechat tam kde je. Je otazkou jak na ten view vyrobit efektivne binding.

Nemam ted cas (ani Delphi) a tohle je na delsi povidani :(
« Poslední změna: 20-05-2019, 16:58:05 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #12 kdy: 20-05-2019, 16:57:02 »
Mne ide o nakopnutie ako na to. V mojej literatúre som sa dočítal, že DataLink je v podstate abstraktná trieda a priamo sa používa len výnimočne.
DataLink vytvorím a čo ďalej :(  No, idem ho študovať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #13 kdy: 20-05-2019, 17:00:46 »
Asi sa mám odvíjať od toho - príloha. Ale tam nie je žiaden popis. Pozri si Hruška zdroják!
Edit:

Hm, tam je
Kód: Delphi [Vybrat]
  1.   protected
  2.     property DataLinks: TList<TDataLink> read FDataLinks;
  3.  
Tým pádom sa k tomu neviem dostať.
« Poslední změna: 20-05-2019, 17:07:49 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Moje MCVE - pripomienky a návrhy
« Odpověď #14 kdy: 20-05-2019, 17:15:54 »
Mne ide o nakopnutie ako na to. V mojej literatúre som sa dočítal, že DataLink je v podstate abstraktná trieda a priamo sa používa len výnimočne.
DataLink vytvorím a čo ďalej :(  No, idem ho študovať.

Je, ale duvod proc nepouzivas DB aware komponenty je protoze si chces prizpusobit funkcionalitu, nebo k tomu mas jiny duvod? Datalink slouzi k propagaci zmen datasetu. Predstav si, ze bys mel v te Tve tride TCustomDB metody jako (pseudokod, mam fakt napilno, pisu v browseru):

Kód: Delphi [Vybrat]
  1. type
  2.   TCustomDB= class
  3.   private
  4.     FDataSet: TDataSet;
  5.     FControls: TList<TDBControl>; // kde TDBControl je trida jiz se da snadno predat a precist hodnota z bufferu afektovaneho radku zmeny
  6.   protected
  7.     procedure DataRowUpdated; virtual; // metoda vyvolana datalinkem datasetu po uprave zaznamu
  8.     procedure DataRowDeleted; virtual; // metoda vyvolana datalinkem datasetu po smazani zaznamu
  9.     procedure DataRowInserted; virtual; // metoda vyvolana datalinkem datasetu po pridani zaznamu
  10.   end;

V metodach takove tridy si pak muzes proiterovat kolekci vizualnich prvku FControls a upravit jejich stav a hodnoty k zobrazeni (da se reagovat na vice udalosti, napr. specifickych "bunkam radku"). No a kazda zmena datasetu FDataSet je pak bude pro Tebe vyvolavat. To byla pointa myslenky kterou jsem mel na mysli.
« Poslední změna: 20-05-2019, 17:19:07 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!