Autor Téma: MyError s variants record - nedokážem ho naplniť hodnotami  (Přečteno 856 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Kód: Delphi [Vybrat]
  1. type
  2.   ECategoryMembers = (Database, Json, Vst);
  3.   EGroupMembers = (Calculation, Connection, PrimaryKey, Query, Report, Table);
  4.   EActionMembers = (Act1, Act2, Act3, Act4, Act5, Act6, Act7);
  5. .
  6.   TErrorCode = packed record
  7.     case Integer of
  8.       0:(Category: ECategoryMembers;  
  9.         Group: EGroupMembers;  
  10.         Action: EActionMembers);
  11.       1:(Value: Cardinal);  
  12.   end;
  13. .
  14.   EDB_Table_Delete = TErrorCode;  // Neviem či to je správne
  15.   ...
Moja predstava je, že EDB_Table_Delete a spol budem odovzdávať ako parameter
Kód: Delphi [Vybrat]
  1.   constructor Create(AErrorCode: TErrorCode; const AMessage: string); virtual;
Ale to ich už musím mať k dispozícii aj s hodnotami. A to neviem zrealizovať. V časti interface to nejde. Aspoň mne. V Create to je už neskoro. Preberám niečo ako parameter a to niečo ešte neexistuje.
Všetky uvedené príklady sú typu:
Kód: Delphi [Vybrat]
  1. var r: TErrorCode
  2. r.Category := AValue
Ale kde to má byť netuším. Bol by som rád, aby sa vytváralo len jediný raz. Preto mám pokusy v interface.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #1 kdy: 16-07-2019, 19:41:57 »
Chcem nahradiť konštanty pomocou variants record ako mi to tu bolo odporúčané.
Kód: Delphi [Vybrat]
  1.   EDB_0Mask = $01000000;
  2.   EDB_Table = $006000;
  3.   EDB_Table_Delete = EDB_0Mask or EDB_Table or $002;
S nimi nemám najmenší problém. Poslednú konštantu chcem urobiť pomocou variants record a ostatné vyhodiť. Moja prvá ukážka je v interface.
Ja potrebujem
Kód: Delphi [Vybrat]
  1. var
  2. EDB_Table_Delete = TErrorCode; // ???
  3. EDB_Table_Edit = TErrorCode; // ???
  4. EDB_Table_Insert = TErrorCode; // ???
  5. ...
Medzitým mi prišlo na um, že si môžem definovať samostatnú funkciu, ktorá zaistí naplnenie hodnôt a spustím ju pri štarte programu.
.
Až teraz som si všimol Tvoju definíciu. To budem musieť zakaždým opakovať celú definíciu TErrorCode? Nejde to nejako skrátene ako to mám vyššie s otáznikmi?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #2 kdy: 16-07-2019, 20:07:26 »
Asi už naozaj starnem. Trepem piate cez deviate. Tvoja konštanta nie je variants record. To mi trvalo dlho než som si to uvedomil.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #3 kdy: 16-07-2019, 20:13:40 »
Pravdepodobne mi to už asi došlo ako to funguje.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #4 kdy: 17-07-2019, 08:17:11 »
Tvoja odpoveď bola úplne v poriadku. Len ja som si to prečítal povrchne >:(  a podstata mi ušla. Konkrétne mi významom ušlo čo je tu napísané
Kód: Delphi [Vybrat]
  1. ConstErrorCodeOne: TErrorCode
S tými konštantami som úplne spokojný ;) Nad tým dynamickým vytváraním som uvažoval len preto, lebo som nevedel vytvoriť konštanty. Len premenné.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #5 kdy: 17-07-2019, 12:56:37 »
Hele, nechci vám do toho kecat, ale fakt vám připadá jako dobrý nápad hnát člověka, který nic neví o vnitřnostech implementace, do toho, aby ty vnitřnosti implementace využíval a závisel na nich? Nebylo by lepší do objektu události dát třeba deset proměnných, které podrobněji specifikují, proč chyba nastala? A to ještě s podotknutím, že dost možná YAGNI - až na výjimky mi vždycky stačilo tu informaci rozlišit čistě jen podle hierarchie výjimek, bez dalších údajů.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #6 kdy: 17-07-2019, 13:22:35 »

Pripomienka je veľmi trefná. V každom prípade mi to rozpitvávanie problému čosi dalo ;)
Citace
až na výjimky mi vždycky stačilo tu informaci rozlišit čistě jen podle hierarchie výjimek, bez dalších údajů.
Ja na to tak vlastne idem od samého začiatku. Ani som ináč nedokázal rozmýšľať. Momentálne som zrušil variant record a ponechal klasický record.
Je pravda, že stále neviem na čo mi je dobrý variant record. Viem/pochopil, že všetky hodnoty ukladá na jedno miesto pamäte. Ale tá variantnosť mi stále uniká :'(
S momentálnym stavom som spokojný. Hlavne viem čo a prečo to tam mám. Konečne môžem začať riešiť samotné výnimky - oznamy.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 516
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #7 kdy: 17-07-2019, 13:51:02 »
Je pravda, že stále neviem na čo mi je dobrý variant record. Viem/pochopil, že všetky hodnoty ukladá na jedno miesto pamäte. Ale tá variantnosť mi stále uniká :'(
Ak potrebuješ napríklad 10 záznamov.
Dopredu však nevieš, ktorý z nich má aký typ.
Povedzme, že prichádzajú do úvahy:
  • Double
  • DateTime
  • Int64
Každý z tých typov tuším zaberá 8 bytov pamäti.
Ak by si chcel pokryť 10 záznamov neznámeho typu (presnejšie jedného z tých troch), potreboval by si teda
  • 3 ( nevieš dopredu ktorý z typov ) x
  • 8 (miesto, ktoré zaberá v pamäti) x
  • 10 ( počet záznamov)
Spolu 240 bajtov.

Ak použiješ variantný záznam, stačí ti v tomto prípade:
  • 1 (lebo variant, môžeš si vybrať aký typ použiješ, nepotrebuješ všetky tri) x
  • 8 (miesto, ktoré zaberá v pamäti) x
  • 10 ( počet záznamov)
Spolu iba 80 bajtov. (+-. Možno niečo málo zaberie skrytá réžia)
V tomto ideálnom prípade to teda dáš na tretinu (lebo všetky tri typy potrebujú akurát po 8 bajtov).
Čosi by si však ušetril aj keď by si potreboval kombinovať Byte, Integer, či SmallInt a pod.

Samozrejme počas využívania/napĺňania poľa, už musíš poznať typ. Takže sa prepínaš pomocou CASE typ of.. To v oboch prípadoch. Variantný record tú informáciu typu nesie so sebou.
Konkrétne využitie:
  • Databázy (pri čítaní SQL výsledkov)
  • Excel (tam môžeš v stĺpci miešať jablká z hruškami)

Ak si používal ADO, tam všetky data išli cez Variant ( nie je to presne ten istý Variantný záznam ako sa tu riešil, ale pole Variantov ). Zmysel je podobný. Namiesto XY.AsInteger použíješ XY.Value. V prípade Value môže byť kľudne aj Blob.
« Poslední změna: 17-07-2019, 14:11:15 od miroB »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #8 kdy: 17-07-2019, 14:21:43 »
Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #9 kdy: 17-07-2019, 14:27:25 »
Hele, nechci vám do toho kecat, ale fakt vám připadá jako dobrý nápad hnát člověka, který nic neví o vnitřnostech implementace, do toho, aby ty vnitřnosti implementace využíval a závisel na nich? Nebylo by lepší do objektu události dát třeba deset proměnných, které podrobněji specifikují, proč chyba nastala?
Jen kecej, od toho diskuse jsou :).  Ale ono nejde jen o tenhle thread: Myslim, ze jsem se mu docela trpelive nekolik dni snazil vysvetlit i okolnosti, za kterych ma smysl se zabyvat chybovymi kody, kdy si ma nadefinovat hexa konstanty, pouzit multifaktorialni reseni tj. predat ty enumy do kontruktoru nejake zapouzdrujici exception a v nem je nasackovat do preoperties etc... K tem variantnim recordum to sklouzlo jako alternativa pro nahrazeni matlani bitiku a stejne do sklouzlo pres vsechno vysvetlovani do nejake divne polohy  :o

Ale uz to nehodlam vecne resit. Muzes se toho ujmout  ;)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #10 kdy: 17-07-2019, 15:00:58 »
Hele, nechci vám do toho kecat, ale fakt vám připadá jako dobrý nápad hnát člověka, který nic neví o vnitřnostech implementace, do toho, aby ty vnitřnosti implementace využíval a závisel na nich? Nebylo by lepší do objektu události dát třeba deset proměnných, které podrobněji specifikují, proč chyba nastala?
Jen kecej, od toho diskuse jsou :) .  Ale ono nejde jen o tenhle thread: Myslim, ze jsem se mu docela trpelive nekolik dni snazil vysvetlit i okolnosti, za kterych ma smysl se zabyvat chybovymi kody, kdy si ma nadefinovat hexa konstanty, pouzit multifaktorialni reseni tj. predat ty enumy do kontruktoru nejake zapouzdrujici exception a v nem je nasackovat do preoperties etc... K tem variantnim recordum to sklouzlo jako alternativa pro nahrazeni matlani bitiku a stejne do sklouzlo pres vsechno vysvetlovani do nejake divne polohy  :o

Ale uz to nehodlam vecne resit. Muzes se toho ujmout  ;)
Nie je potrebné riešiť to vecne. To už je len na mne. Informácie sú kompletné. Ešte sám neviem ako to nakoniec dopadne.
To je prvýkrát čo niečo také robím. Vedomostí a skúsenosti niet. Ale viem o možnostiach. Aj keď všetkým nerozumiem :-[
.
Keby sa na e-mail dali posielať materiálne veci, tak by som Ti aj niečo poslal. Jedine, žeby si mi poslal číslo účtu (to myslím vážne, žeby som Ti niečim prispel). Aj keď si myslím, že pri Tvojom príjme by to vyzeralo ako posmech ;)  Ak by bol taký zázrak, že sa u nás dá niečo zohnať a v Česku nie (dokonca o jednom takom viem), tak nie je žiaden problém.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #11 kdy: 17-07-2019, 15:18:56 »
Jedine, žeby si mi poslal číslo účtu (to myslím vážne, žeby som Ti niečim prispel).
Zblaznil ses? Vsechny rady v diskuzich jsou z principu zdarma. Jen s tim, jak se blizi dopíčment, moje ochota resit v podstate cokoli z oblasti IT silne klesa  ;D

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #12 kdy: 17-07-2019, 15:26:22 »
Citace
Zblaznil ses? Vsechny rady v diskuzich jsou z principu zdarma.
Nie, ešte som sa nezbláznil. Viem, že rady sú zadarmo. Len tu je akosi ťažšie vyjadriť vďaku. To je všetko.
Ja mám akurát obavu, že o tých asi 20 dní tu už nebudeš chodiť a to bude pre nás citeľná strata. Doteraz tak urobili všetci, ktorí odišli do dôchodku.
« Poslední změna: 17-07-2019, 15:28:05 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Jirka

  • Plnoletý
  • ***
  • Příspěvků: 145
  • Karma: 8
    • Verze Delphi: XE2
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #13 kdy: 17-07-2019, 15:36:57 »
Jen s tim, jak se blizi dopíčment, moje ochota resit v podstate cokoli z oblasti IT silne klesa  ;D

Doufám že tomuto fóru přízeň zachováš  -aspoň do 70   ;)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:MyError s variants record - nedokážem ho naplniť hodnotami
« Odpověď #14 kdy: 17-07-2019, 15:53:16 »
Doufám že tomuto fóru přízeň zachováš  -aspoň do 70   ;)
Zrejme jen do te doby, co po me stavajici zamestnavatel bude loudit nejakou praci souvisejici s Delphi, abych byl v obraze, co se ve svete Delphi deje.