Autor Téma: Kódy chýb - zistiť masku a skupinu  (Přečteno 1249 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Kódy chýb - zistiť masku a skupinu
« kdy: 09-07-2019, 14:54:16 »

Mám, okrem ďalších, definované
Kód: Delphi [Vybrat]
  1. EDB_0Mask = $10000000 // Mask
  2. EDB_Table =    $1000000  // Group
  3. EDB_Table_Delete = EDB_0Mask or EDB_Table or $0002;
Teraz potrebujem zistiť z kódu chyby Mask a Group. Neviem prísť nato ako sa to robí.

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:Kódy chýb - zistiť masku a skupinu
« Odpověď #1 kdy: 09-07-2019, 16:37:33 »

Mám, okrem ďalších, definované
Kód: Delphi [Vybrat]
  1. EDB_0Mask = $10000000 // Mask
  2. EDB_Table =    $1000000  // Group
  3. EDB_Table_Delete = EDB_0Mask or EDB_Table or $0002;
Teraz potrebujem zistiť z kódu chyby Mask a Group. Neviem prísť nato ako sa to robí.
Ja tomu tvemu zapisu nejake nerozumim: maskou se oznacuje skupina '1', ktera definuje skupinu bitu, ktera me zajima a maskuje vsechny ostatni nezajimave bity, takze priklad:
Kód: Delphi [Vybrat]
  1. EGroupMembers = (Table=1, x=2, y=3, z=4);
  2. EDB_Table = ord(EGroupMembers.Table) shl 8;
  3. EDB_x      = ord(EGroupMembers.x) shl 8;
  4. EDB_y      = ord(EGroupMembers.y) shl 8;
  5. EDB_z      = ord(EGroupMembers.z) shl 8;
  6.  
  7. EDB_GroupMask = $7 shl 8;
  8. EDB_CodeMask = $FF;
  9.  
  10. Group := EGroupMembers((ErrCode  and EDB_GroupMask) shr 8);
  11. Code := ErrCode and EDB_CodeMask;
  12.  
  13.  


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:Kódy chýb - zistiť masku a skupinu
« Odpověď #2 kdy: 09-07-2019, 19:14:09 »

Mám, okrem ďalších, definované
Kód: Delphi [Vybrat]
  1. EDB_0Mask = $10000000 // Mask
  2. EDB_Table =    $1000000  // Group
  3. EDB_Table_Delete = EDB_0Mask or EDB_Table or $0002;
Teraz potrebujem zistiť z kódu chyby Mask a Group. Neviem prísť nato ako sa to robí.
Ja pracujem s Enumerations a Enumeration Set:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Simple_Types_(Delphi)#Enumerated_Types
Myslím že to je plné náhrada za Mask & spol.
Čitateľné a pre laika veľmi zrozumiteľné.
Nezabudnúť na operátory pre Enum-Sets:  +, -, *
Interne mi to nahrádza "celú problematiku s maskovaním".
Navyše, každý Enum, ale aj Enum-Set sa dá previesť na číslo, alebo naopak.
Takže je možné ich ukladanie do "settings"/"ini" súborov.
Jediný krát, keď Enum-Set neviem použiť priamo, ale musím si ho premeniť na konštantu, je v prípade
"Case .. of"
Aj keď Enum-Set je konštanta (číslo), nedá sa u "Case .. of" využiť. Vtedy si "niekde vedľa" prevediem set [abc, bcd] na číselnú konštantu, do poznámky si dám aký to je set a ide aj to..
A to nevravím o RTTI, kde sa dá enum previesť aj na text.
« Poslední změna: 09-07-2019, 19:21:44 od miroB »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #3 kdy: 09-07-2019, 19:34:17 »
Myslím že to je plné náhrada za Mask & spol.
Čitateľné a pre laika veľmi zrozumiteľné.
Plna nahrada to neni, protoze to lze pouzit jen na 1 hodnotu v promenne, zatimco na binarni urovni lze do hodnoty zakodovat nekolik enumu a pomoci masek je izolovat. Delphi jako jazyk nema zadnou strukturu pro praci s bity jako struc  v C-like jazykach - tam to nepotrebujes maskovat a primo se odkazujes na cleny o velikosti nekolika bitu.

Citace
A to nevravím o RTTI, kde sa dá enum previesť aj na text.
To funguje jen u implicitne cislovanych members, pro explicitni hodnoty clenu introspekce v Delphi nefunguje.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #4 kdy: 09-07-2019, 19:42:19 »

Citace
Ja tomu tvemu zapisu nejake nerozumim: maskou se oznacuje skupina '1', ktera definuje skupinu bitu, ktera me zajima a maskuje vsechny ostatni nezajimave bity, takze priklad
Je to presne podľa tvojho príkladu pre vytvorenie číselníka chýb. V komentári za hodnotou mám čo to znamená. Trochu som upravil hodnoty. Aby sa dal kontrolovať výsledok.
Kód: Delphi [Vybrat]
  1. EDB_0Mask = $10000000 // Mask
  2. EDB_Table = $2000000  // Group
  3. EDB_Table_Delete = EDB_0Mask or EDB_Table or $0003;
Ja sa chcem dopracovať k výsledku kde:
Kód: Delphi [Vybrat]
  1. Mask = 1;
  2. Group = 2;
Teraz sa mi prvý krát stalo, že vysvetleniu totálne nerozumiem a neviem si ho ani upraviť. :( :( :(  Poďme podľa riadkov
1. EGroupMembers - vymenovaný typ. Načo to je dobré? Mňa zaujíma začiatok a nie koniec. 7 a 6 pozícia zprava (počítam od 0).
2. - 5. EDB_Table...EDB_z - konštanty, ktoré v príklade nie sú nikde použité. Ani som sa nedovtípil načo by mi boli. Ak to majú byť Group, tak to len zdvojuje to čo už mám
7. - 8 - To sú opäť konštatnty. Prečo sú tam práve také hodnoty vôbec netuším.
10. - out of bound. Ako to mám vyskladať, keď nemám ErrCode. Tak som namiesto ErrCode použil EDB_Table_Delete
11 - Keďže 10 je zle...
.
Pozrel som si čo je shl. Ale ako mám počítať bity v hexa som nepochopil :(
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #5 kdy: 09-07-2019, 19:47:28 »
Citace
Jediný krát, keď Enum-Set neviem použiť priamo, ale musím si ho premeniť na konštantu, je v prípade"Case .. of"
Myslíš niečo také?
Kód: Delphi [Vybrat]
  1. type
  2.  
  3.   {$SCOPEDENUMS ON}
  4.   TvstPart = (Name, HeightUp, FloorUpCount, HeightUn, FloorUnCount, IsNew);
  5.   {$SCOPEDENUMS Off}
Použitie
Kód: Delphi [Vybrat]
  1.   case TvstPart(Column) of
  2.     TvstPart.Name: CellText := NodeData.PartName;
  3.     TvstPart.HeightUp: CellText := CurrToStrPrec(NodeData.PartFireHeightUp);
  4.  
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #6 kdy: 09-07-2019, 20:05:13 »
Citace
Jediný krát, keď Enum-Set neviem použiť priamo, ale musím si ho premeniť na konštantu, je v prípade"Case .. of"
Myslíš niečo také?
Kód: Delphi [Vybrat]
  1. type
  2.  
  3.   {$SCOPEDENUMS ON}
  4.   TvstPart = (Name, HeightUp, FloorUpCount, HeightUn, FloorUnCount, IsNew);
  5.   {$SCOPEDENUMS Off}
Použitie
Kód: Delphi [Vybrat]
  1.   case TvstPart(Column) of
  2.     TvstPart.Name: CellText := NodeData.PartName;
  3.     TvstPart.HeightUp: CellText := CurrToStrPrec(NodeData.PartFireHeightUp);
  4.  
To je bežné, myslím CASE .. OF pre Enum-Set.
Teda asi takto (symbolicky ):
Kód: Delphi [Vybrat]
  1.   case MyColumnSet of
  2.     [FloorUpCount, HeightUn, FloorUnCount] : CellText := NodeData.PartName;
  3.     [FloorUpCount, HeightUn]: CellText := CurrToStrPrec(NodeData.PartFireHeightUp);
  4.  
Je však cesta, ako zistíš číselnú konštantu. Napr. z [FloorUpCount, HeightUn] a tú už môžeš v Case .. of využiť.
« Poslední změna: 09-07-2019, 20:07:00 od miroB »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #7 kdy: 09-07-2019, 20:19:42 »
Aha, tak už viem čo si myslel pod Enum-Set :)
Citace
Je však cesta, ako zistíš číselnú konštantu.
Viem o tom*. Ale ja som si vytvoril Enum preto, aby som žiadne konštanty nepoužíval.
* - mám to použité pri priraďovaní štýlov v TMS pre jednotlivé xxStyler. Ale tam si potrebujem zistiť názov štýlu.

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:Kódy chýb - zistiť masku a skupinu
« Odpověď #8 kdy: 09-07-2019, 20:42:40 »
EDB_0Mask = $10000000 // Mask
EDB_Table = $2000000  // Group
EDB_Table_Delete = EDB_0Mask or EDB_Table or $0003;[/code]
Ja sa chcem dopracovať k výsledku kde:
Kód: Delphi [Vybrat]
  1. Mask = 1;
  2. Group = 2;
[/code]
Na tehle definic me mate:
1. cemu rikas Mask = 1 bit - k cem u je to dobre.
2. definice EDB_Table = 2. Kde jsou dalsi vyctove hodnoty (alternativy) k te table, aby se dalo urcit, kolik bitu potrebujes na jejich zakodovani a tim i definovat jejich masku a ev. dalsi operace pro slozeni/rozlozeni hodnoty. To jsi nejak ten puvodni priklad vubec nepochopil.



To, co jsem ti posilal, nemelo nic spolecneho s tvymi hodnotami, ale melo ti naznacit, co je to maskovani  a jak se skladaji/extrahuji  bity v nejake hodnote. Analogicky se tam daji nastrkat dalsi "rozmery"  :-[

Citace
1. EGroupMembers - vymenovaný typ. Načo to je dobré? Mňa zaujíma začiatok a nie koniec. 7 a 6 pozícia zprava (počítam od 0).
Tohle je vzorova skupina hodnot, ktere chces zakodovat v nekolika bitech uvnitr zakodovane hodnoty

Citace
2. - 5. EDB_Table...EDB_z - konštanty, ktoré v príklade nie sú nikde použité. Ani som sa nedovtípil načo by mi boli. Ak to majú byť Group, tak to len zdvojuje to čo už mám
Tohle jsou definice, ktere umisti hodnoty enumu EGroupMembers  na pozice bitu 8-10:

  11  10   9   8   7   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+---+---+---+
|   | x : x : x |   :   :   :   :   :   :   |
+---+---+---+---+---+---+---+---+---+---+---+
       EDB_xxx           ErrCode


Citace
2. - 5. EDB_Table...EDB_z - konštanty, ktoré v príklade nie sú nikde použité. Ani som sa nedovtípil načo by mi boli.
Na zakodovani EGroupMembers potrebujes 3 bity, takze toje binarne 111 = $7, na zakodovani ErrCode 8 bitu 11111111 = $FF.
A tohle jsou ty masky ktere definuji, jakych bitu si v te hodnote vsimat, kdyz chces tu hodnotu dostat ven.

To udelas ve dvou krocich:
1. zamaskujes bity, ktere te zajimaji  cilil bity = hodnota and maska
2. posunes bity tak, aby LSB byl b0 (pro kompozici obracene b0 na pozadovanou pozici b8, to je v tom prihladu delano operacemi posunu bitu vlevo/vpravo o 8)
3. Je to komutativni, takze na poradi maskovani a posunu nezalezi, pokud si ohlidas rozsahy hodnot, se kterymi operujes.



« Poslední změna: 09-07-2019, 20:44:34 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #9 kdy: 09-07-2019, 20:46:40 »
Pokúsim sa to nejako pochopiť :)
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #10 kdy: 09-07-2019, 20:54:42 »
Citace
Na tehle definic me mate:
1. cemu rikas Mask = 1 bit - k cem u je to dobre.
2. definice EDB_Table = 2. Kde jsou dalsi vyctove hodnoty (alternativy) k te table, aby se dalo urcit, kolik bitu potrebujes na jejich zakodovani a tim i definovat jejich masku a ev. dalsi operace pro slozeni/rozlozeni hodnoty. To jsi nejak ten puvodni priklad vubec nepochopil.
Chcem to použiť na zostavenie vlastného textu pre výnimku. Ten budem zobrazovať pomocou TAdvTaskDialog, ktorý má 5 textových reťazcov
Kód: Delphi [Vybrat]
  1.     FConten: string;
  2.     FExpandedText: string;
  3.     FFooter: string;
  4.     FInstruction: string;
  5.     FTitle: string;
Napr.
  • Mask = 1 je Table
  • Mask = 2 je Query
  • ...
To použijem napr. pre FTitle. Podobne to je so skupinami
  • Group = 1 Delete
  • Group = 2 InsertInto
  • ...
Pre masku nepredpokladám viac ako 9 položiek. Je to "primitívny" spôsob, ale ten zvládnem. O inom nateraz neviem.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #11 kdy: 09-07-2019, 21:17:09 »
Myslím že to je plné náhrada za Mask & spol.
Čitateľné a pre laika veľmi zrozumiteľné.
Plna nahrada to neni, protoze to lze pouzit jen na 1 hodnotu v promenne, zatimco na binarni urovni lze do hodnoty zakodovat nekolik enumu a pomoci masek je izolovat. Delphi jako jazyk nema zadnou strukturu pro praci s bity jako struc  v C-like jazykach - tam to nepotrebujes maskovat a primo se odkazujes na cleny o velikosti nekolika bitu.
..
No a taketo nejake moznosti:
Kód: Delphi [Vybrat]
  1. if enuSet * [ prvy, stvrty] = [ ] then..
  2. if enuSet * [ prvy, stvrty] <> [ ] then..
  3. if enuSet * [ prvy, stvrty] = [ stvrty ] then..
alebo aj takto:
Kód: Delphi [Vybrat]
  1. if Byte( [ prvy, osmy] ) or .. then
Neviem teraz, či to ide už ako konštanta priamo Cast-núť, alebo až v rámci premennej.
Pri Enum-Set Cast je treba dodržať počet bytov, ale inak celý set prehodiť na číslo ide.
Enum-sety pracujú s bitmi a sú pekne výpovedné. Na rozdiel od čísel, na ktoré treba mať niekde prevodník..

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #12 kdy: 09-07-2019, 21:23:30 »
Kód: Delphi [Vybrat]
  1. EDB_0Mask = $10000000 // Mask
  2. EDB_Table = $2000000  // Group
  3. EDB_Table_Delete = EDB_0Mask or EDB_Table or $0003;
Ja sa chcem dopracovať k výsledku kde:
Kód: Delphi [Vybrat]
  1. Mask = 1;
  2. Group = 2;

Stanislave, přiznám se, že vůbec netuším čeho ve výsledku chceš dosáhnout, nicméně pokusím se pomoci.
Nuže, když uděláš logický součet $10000000 or $2000000 or $3, dostaneš číslo $12000003
Pokud z něj chceš vyextrahovat zpět informace, které jsi do něj zakódoval, tak nějak takhle:
Kód: Delphi [Vybrat]
  1. Mask := ($12000003 and $F0000000) shr $1C;  // = 1
  2. Group := ($12000003 and $F000000) shr $18;  // = 2
  3. Delete := $12000003 and $F;  // = 3
  4.  
Pokud tomu chceš porozumět, chtělo by to nastudovat reprezentace čísel ve dvojkové a šestnáctkové soustavě a bitové operace.

EDIT: v podstatě jde o to, že máš k dispozici třeba 32bitový integer a je jen na tobě, jak těch 32 bitů využiješ. Můžeš použít třeba horní 4 bity jako nějaký hlavní identifikátor (4 bity ti dají rozsah 0..15, takže tam můžeš zakódovat 16 různých typů), dál použiješ třeba jen 3 bity jako identifikaci akce (rozsah 0..7), pak třeba dalších 6 bitů (rozsah 0..63) jako identifikátor řekněme třeba formuláře atd... Tohle ti v podstatě psal už pf1957
« Poslední změna: 09-07-2019, 21:38:28 od Morrison »
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #13 kdy: 09-07-2019, 22:03:08 »
Ještě bych ten příklad zjednodušil, aby to šlo snadněji pochopit.
Takže máš k dispozici 32bitový integer, t.j. 4 bajty a budeš si chtít do každého z těch bajtů uložit nějakou informaci (řekněme TYP, FORMULÁŘ, TABLE, AKCE).

Kód: Delphi [Vybrat]
  1. const
  2.   TYP_NONE = 0;
  3.   TYP_FATAL_ERROR = 1;
  4.   TYP_WRONG_USER_INPUT = 2;
  5.   TYP_ACCESS_DENIED = 3;
  6.   ...
  7.  
  8.   FORM_NONE = 0;
  9.   FORM_ABC = 1;
  10.   FORM_DEF = 2;
  11.   ...
  12.  
  13.   TABLE_NONE = 0;
  14.   TABLE_ABC = 1;
  15.   TABLE_DEF = 2;
  16.   TABLE_GHI = 3;
  17.   ...
  18.  
  19.   ACT_NONE = 0;
  20.   ACT_SELECT = 1;
  21.   ACT_EDIT = 2;
  22.   ACT_DELETE = 3;
  23.   ACT_UPDATE = 4;
  24.   ...
  25.  

Takhle z výše uvedených konstant sestavíš 32b integer:
Kód: Delphi [Vybrat]
  1. var
  2.   Code: Integer;
  3.   ...
  4.   Code := (TYP_WRONG_USER_INPUT shl 24) or // TYP bude první bajt zleva
  5.                (FORM_DEF shl 16) or // FORMULÁŘ bude zakódován do druhého bajtu
  6.                (TABLE_ABC shl 8) or // TABLE je ve třetím bajtu
  7.                ACT_UPDATE; // nejnižší bajt celého integeru
  8.  

A takhle to pak z něj zase dostaneš nazpátek:
Kód: Delphi [Vybrat]
  1. var
  2.   Typ: Byte;
  3.   Form: Byte;
  4.   Table:  Byte;
  5.   Action: Byte;
  6.   ...
  7.   Typ := (Code and $FF000000) shr 24;
  8.   Form := (Code and $FF0000) shr 16;
  9.   Table := (Code and $FF00) shr 8;
  10.   Action := Code and $FF;
  11.  
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #14 kdy: 09-07-2019, 22:14:16 »
Kódu od Morrisona rozumiem :) Chcem pochopiť aj kód pf1957. Pracujem na tom.
Aspoň viem, že sa k výsledku dopracujem.
.
To Morrison: stoličku si si kúpil?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #15 kdy: 09-07-2019, 22:27:51 »
Možná budu psát něco, co už znáš, tak to případně ignoruj. Maska je to, čím z toho velkého čísla vymaskuješ jen to, co tě právě zajímá. V tom mém příkladu třeba když chci z "code" vytáhnout "Table", tak na něj použiju masku and $FF00, čímž řeknu, že mě zajímají z celého čísla jen bity 8 až 15. Pak už se tahle hodnota jen posune o 8 bitů doprava a je z toho původní bajt, třeba "TABLE_ABC".

OT: Zatím nekoupil, rvu prachy převážně do auta a do dovolených. A utěšuji se tím, že vlastně čím horší židle, tím lépe pro zdraví, protože to nutí člověka se zvednout a jít se třeba chvíli projít :)
« Poslední změna: 09-07-2019, 22:41:28 od Morrison »
nil

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #16 kdy: 09-07-2019, 22:38:46 »
Excellent
Rated 1 time
Taky se dá použít "record with variant parts":

Kód: Delphi [Vybrat]
  1. type tZaznam=packed record
  2.       case integer of
  3.        0: ( Typ: Byte;
  4.             Form: Byte;
  5.             Table:  Byte;
  6.             Action: Byte; );
  7.        1: ( Value: cardinal; );
  8.      end;
  9.  

Hodnoty zapsané do Typ, Form, Table a Action se ihned promítají do Value, protože jsou v paměti na stejném místě. Totéž naopak - hodnota zapsaná do Value se projeví v těch ostatních.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #17 kdy: 09-07-2019, 22:50:03 »
No a taketo nejake moznosti:
Kód: Delphi [Vybrat]
  1. if enuSet * [ prvy, stvrty] = [ ] then..
jsou k nicemu v pripade, ze potrebujes dve a vice disjunktnich mnozit enuSet1, enuSet2, enuSet3 nasackovat do jednoho skalaru a operovat s nimi...

Typ set je v Delphi max. 256 hodnot ulozenych az v 32 bytech, ale jen pro jednu mnozinu, zatimco kdyz si to sklada rucne (to je to, o co se snazi), tak vlastne nema omezeni a tech mnozin si tam muze naskladat kolik chce. Ale nema pro to podporu na urovni jazyka, musi to delat rucne.

Jinak samozrejme cela aplikace by vnitrne mela byt napsana pomoci enumu a jejich mnozin, protoze prekladac tak ohlida silnou typovou kontrolu. To mapovani a skladani do nejakeho vlastniho kodu by mela byt otazka jen vnejsiho rozhrani napr. to sestavovani chybovych kodu. Obvykle se skladaji do jednoho skalaru, zpravidla dword, ktery poskytuje dostatecny rozsah i pro rozsahle systemy a strukturovat kod do 3-4 kategorii, ale klidne by se dal ten kod vyjadrit nekolika skalary, jen se to bezne nedela.


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #18 kdy: 09-07-2019, 22:53:00 »
Pre masku nepredpokladám viac ako 9 položiek.
No hlavne bys tomu asi nemel rikat maska, kdyz to nema funkci masky, ta bude mit 4 bity, ktere potrebujes na zakodovani tech 9 polozek.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #19 kdy: 09-07-2019, 22:55:09 »
Taky se dá použít "record with variant parts":
Bohuzel je na hranici bytu, protoze Delphi nema struct

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #20 kdy: 10-07-2019, 07:52:09 »
Citace
No hlavne bys tomu asi nemel rikat maska, kdyz to nema funkci masky, ta bude mit 4 bity, ktere potrebujes na zakodovani tech 9 polozek.
Máš pravdu. Ja som to prebral automaticky bez rozmýšľania. Aj tak rozmýšľam, že "prvej položke" vyhradím 2 pozície a druhej 3. Človek nikdy nevie. Hlavne ak to budem používať aj v iných programoch.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #21 kdy: 10-07-2019, 08:09:54 »
Citace
No hlavne bys tomu asi nemel rikat maska, kdyz to nema funkci masky, ta bude mit 4 bity, ktere potrebujes na zakodovani tech 9 polozek.
Máš pravdu. Ja som to prebral automaticky bez rozmýšľania. Aj tak rozmýšľam, že "prvej položke" vyhradím 2 pozície a druhej 3. Človek nikdy nevie. Hlavne ak to budem používať aj v iných programoch.
Zkus se zamyslet nad tim variantnim recordem, co posilal Vandrovnik s tim, jestli bys nemohl misto byte pouzit enum (o velikosti byte) a z tech max. 4 polozek neposkladal ten kod, ev. co by se stalo, kdybys ten kod rozsiril z 32 na 64 bitu a ten pocet polozek jeste zvysil ev. nekterym enumum nezvedl velikost direktivou $Z

To by ti umoznilo bez nejakeho matlani bitiku nastrkat do clenu recordu rovnou hodnoty enumu a vysledek si precist z te variantni casti a obracene, stracit tam kod a jednotlive hodnoty si brat v celenech te druhe varianty.

Tim by se ti to cele zjednodusilo a program by byl spolehlivejsi a udrzovatelnejsi, jen bys nesmel v budoucnu vytect z velikosti toho kodu. Ale myslim, ze dneska neni duvod to neudelat 64bitove.
« Poslední změna: 10-07-2019, 08:13:44 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #22 kdy: 11-07-2019, 20:44:23 »

V kuse nad tým sedím a spojazdnil som príklad od Morrisona. Snáď aj nejako pochopil.
Kód: Delphi [Vybrat]
  1. procedure TfrmForTesting.btnMorrisonClick(Sender: TObject);
  2. var
  3.   Mask: Byte;
  4.   Group, Group2, Group3: Byte;
  5.   Delete , Delete2, Delete3, Delete4: Byte;
  6. begin  ///  OK
  7. // Mask Group Delete
  8. //  $8  765    9753
  9.   Mask := (EDB_Detail and  $F0000000) shr 28;  // = 8
  10.   Group3 := (EDB_Detail and $F000000) shr 24;  // = 7
  11.   Group2 := (EDB_Detail and  $F00000) shr 20;  // = 6
  12.   Group := (EDB_Detail and    $F0000) shr 16;  // = 5
  13.   Delete4 := (EDB_Detail and   $F000) shr 12;  // = 9
  14.   Delete3 := (EDB_Detail and    $F00) shr 8;   // = 7
  15.   Delete2 := EDB_Detail and      $F0  shr 4;   // = 5
  16.   Delete := EDB_Detail and        $F;          // = 3
  17. end;
Ukážku od pf1957 nedokážem nijako sfunkčniť a už vôbec nie pochopiť :'(  Netuším načo tam sú konštanty typu EDB_y. V konečnom výsledku to sú násobky čísla 256. (256, 512, 768, 1024). Ako to vidím ja, tak pre mňa nemajú výpovednú hodnotu.
Kód: Delphi [Vybrat]
  1. procedure TfrmForTesting.btnpf1957Click(Sender: TObject);
  2. var
  3.   Group: LongWord;
  4. begin
  5. // Mask Group Delete
  6. //  $8  765    9753
  7. //           $87659753        $7 shl 8
  8.   Group := (EDB_Detail and EDB_GroupMask);  // = 1972
  9. end;
Čo sa týka variantného recordu, tak viem akurát record
  • definovať
  • použiť ho vo VirtualStringTree. Lebo sa oň postará
Hlavne neviem pochopiť jednú vec. Priznávam sa, že som si o tom nič neprečítal, čo idem teraz napraviť. Ale aj tak. V case mám pod 0: štyri hodnoty a pod 1: len jednu. Netuším ako sa s tým má pracovať. Idem čítať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #23 kdy: 11-07-2019, 21:11:36 »
Hlavne neviem pochopiť jednú vec. Priznávam sa, že som si o tom nič neprečítal, čo idem teraz napraviť. Ale aj tak. V case mám pod 0: štyri hodnoty a pod 1: len jednu. Netuším ako sa s tým má pracovať. Idem čítať.

4 hodnoty po 1 bajtu a pak 1 hodnotu zabírající 4 bajty :-) Ten variantní záznam umí ty 4 "malé" hodnoty sloučit do jedné "velké" (projeví se to stejně jako bitový posun o 8, 16 a 24 bitů, ale nemusí se nad tím bádat, prostě se to "stane samo").

Pokud by pro nějaký údaj nestačil jeden bajt, tak jak psal myslím pf1957, tu jednu "velkou" hodnotu změnit třeba na UInt64 a ty malé podle potřeby zvětšit třeba na Word (jejich celková velikost by pak mohla být až 8 bajtů).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #24 kdy: 11-07-2019, 21:20:36 »
Ďakujem. Našiel som príklad aj použitím. To by malo pomôcť.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #25 kdy: 12-07-2019, 09:26:35 »
Ukážku od pf1957 nedokážem nijako sfunkčniť a už vôbec nie pochopiť :'(  Netuším načo tam sú konštanty typu EDB_y.
Ty konstanty jsou tam proto, kdybys definoval dalsi konstanty, aby se vsechno psalo prave jednou. Pokud si myslis, ze je k nicemu nepotrebujes a budes pouzivat vyhradne enumy, pak ti staci definovat pro kazdou hodnotu
  1. enum
  2. masku
  3. bitovy posun

tj.napr.
Kód: Delphi [Vybrat]
  1. type EGroupMembers  = (Table, x, ...);
  2. const EDB_GroupShift = 8;
  3. const EDB_GroupMask = $7 shl EDB_GroupShift;
  4.  
a pak ty operace vypadaji:
Kód: Delphi [Vybrat]
  1. var code: dword;
  2. ...
  3. code := (code and not EDB_GroupMask) or ((ord(AValue) shl EDB_GroupShift) and EDB_GroupMask);
  4.  
a inverzni
Kód: Delphi [Vybrat]
  1. var value: EGroupMembers;
  2. ...
  3. value := EGroupMembers((ACode and EDB_GroupMask) shr EDB_GroupShift);
  4.  

Variantni record by pak mohl vypadat (s tim, ze na Group bude zabrano 8 bitu a ne 3 a to jeste za podminky definicie EGroupMembers jako $Z1 - min Pascal neumi):
Kód: Delphi [Vybrat]
  1. TErrCode = packed record
  2.   case integer of
  3.      0: (Error: byte;
  4.           Group: EGroupMembers;
  5.           Unused:  word;
  6.          );
  7.      1: (Value: dword);
  8. end;
  9.  
a analogicke operace
Kód: Delphi [Vybrat]
  1. var r: TErrorCode;
  2. var code: dword;
  3. ...
  4. r.Group := AValue;
  5. code := r.Value;
  6.  
a obracene
Kód: Delphi [Vybrat]
  1. var r: TErrorCode;
  2. var group: EGroupMembers;
  3. ...
  4. r.Value := ACode;
  5. group := r.Group;
  6.  

Jinak uz nevim, jak bych ti to vysvetlil, protoze to jsou uplne zaklady, ktere se AFAIK, doctes na prvnich par desitkach stranek prirucky jazyka.


« Poslední změna: 12-07-2019, 09:56:58 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #26 kdy: 12-07-2019, 09:50:53 »
Citace
Jinak uz nevim, jak bych ti to vysvetlil, protoze to jsou uplne zaklady, ktere se AFAIK, doctes na prvnich par desitkach stranek prirucky jazyka.
Ďalej to už vysvetľovať nemusíš. Buď to zvládnem alebo nie. Bodka.
Ja som o tom čítal, ale žiaľ to je nad moje schopnosti, ktoré som dostal do vienka pri narodení :( :( :(  V tomto smere sa víly veľmi nečinili >:( Ja som si myslel, že si to už so mnou vzdal ;D
Ďakujem.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #27 kdy: 12-07-2019, 12:57:14 »
Citace
Pokud si myslis, ze je k nicemu nepotrebujes a budes pouzivat vyhradne enumy, pak ti staci definovat pro kazdou hodnotu
Práve, že ja neviem načo tam sú a ako sa majú použiť. Možno to s posledným príspevkom #25 pochopím.
Idem bojovať.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #28 kdy: 12-07-2019, 15:03:21 »
Práve, že ja neviem načo tam sú a ako sa majú použiť.
Ja zase nevim, co je cilem tveho snazeni. Udelal sis nejakou analyzu, ze ktere ti vylezl strom informaci o chybe, ktere chces nejak zakodovat a v aplikaci s nimi pracovat.

1. Prvni je taxonomie vyjimek, ktere rozsiris o ty informace. A tim to muze skoncit. Informace budou na urovni enumu a kodovat se nebudou a predavat se budou v instanci vyjimky. Pripadny chybovy kod lze metodou exception vyrenderovat. Cilil bezna prace s objekty.

2. Pokud by ta skladba informaci byla natolik heterogenni, ze by se spatne navrhovaly spolecni predkove vyjimek resp. by to bylo neprehledne ev. nesrozumitelne,
lze pouzit nejake zakodovani do jedne hodnoty, ktera by se pak predavala a pri praci se zase zpatky dekodovala apod (asi nema smysl uvazovat, ze by to nemusela byt nutne jedina hodnota, ale mohlo by jich byt nekolik)

3. Pokud by se informace musela/mela kodovat, zalezi, jakeho rozsahu jsou ty informace a jestli se ti vsechny vejdou treba do UInt64 s nejmensi jednotkou informace 1. byte. Pak je IMHO vhodne pouzit ten variantni record a enumy.

4. Pokud se nevejdou a bude nutne matlat bitiky, no tak si to budes muset rucne poskladat. Na jedne strane se nabizi reseni s enumy - tj. uplna silna typova kontrola v aplikaci tj. to, co jsem ti ted naznacoval naposledy, na opacne strane jsou normalni ciselne konstanty, to bude zrejme nejaky ten uplne prvni stary priklad error subsystemu.

A z toho se odviji, jake konstanty potrebujes nadefinovat. A definovat bys je mel tak, aby se vsechno definovalo jen jednou a aby kdyz zmenis nekde neco, aby se to automaticky promitlo do vsech ostatnich definic a nemusel jsi rucne prepisovat buhvi co vsechno.








Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #29 kdy: 12-07-2019, 21:10:23 »
Veľmi sa čudujem, že vlastne nikto nevie čo chcem :o . Idem to vysvetliť. Možno mi navrhnete aj iné riešenie. Jednoduchá štruktúra chýb:
  • Category - DB, JSON, VST...
  • Group - pre DB: Table, Query...
  • Detail - pre Table: Insert, Edit, Post...
  • ErrorCode = Category or Group or Detail
potom v kóde:
Kód: Delphi [Vybrat]
  1. try
  2.   MyTable.Post;
  3. except on E: Exception
  4. do
  5.   MyError.Create(ErrorCode_Table_Post, ...)  // Chcem využiť vnorenie chýb. S tým bude najťažší boj.
  6.    // Ak sa dá, tak ošetriť chybu
  7.   ...
  8.   raise;
  9. end;
Potom v MyError rozložím ErrorCode späť na Category, Group a Detail. Podľa jednotlivých hodnôt poskladám textové reťazce pre oznam (AdvTaskDialog - 5 x string) a log. Budú sa skladať z vlastných textov a Message jednotlivých chýb. Podľa situácie zapíšem chybu do logu/DB a prípadne si ju pošlem.
To je všetko.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #30 kdy: 12-07-2019, 22:05:05 »
A proč je vlastně nutné to spojovat do jedné hodnoty a pak zase rozdělovat? Nemůžeš to prostě pořád nechat jako 4 samostatné hodnoty?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #31 kdy: 13-07-2019, 07:46:04 »
Môžem ;D
Jedno veľké číslo zamaskované za meno vyzerá lepšie ako 4-6 malých čísel. Vychádzal som z toho čo mi nadhodil pf1957. Pritom som nerozmýšľal nad inými možnosťami, spôsobmi či variantmi.
V takom prípade ten ErrorCode asi urobím ako triedu. To je pre mňa najjednoduchšie.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #32 kdy: 13-07-2019, 09:02:28 »
  • Category - DB, JSON, VST...
  • Group - pre DB: Table, Query...
  • Detail - pre Table: Insert, Edit, Post...
  • ErrorCode = Category or Group or Detail
Tak s tim se musis vejit do toho variantniho recordu a budes mit k dispozici oboje: jak jednotlive slozky, tak celkovy kod.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #33 kdy: 13-07-2019, 19:24:34 »
Stále nad tým špekulujem. Nateraz mi vychádza:
  • hexadecimálny zápis. Spôsob spracovania od Morrisona
  • decimálny zápis. Len vynechám znak $ v tu uvedených kódoch. Nevidím dôvod ho nepoužiť. Ten viem spracovať
  • variants record - tu mám jeden veľký problém. Musím vytvoriť inštanciu rekordu. Kedy a kde? V mieste vyvolania výnimky to je nezmysel. Alebo budem mať toľko inštancií koľko bude ErrorCode? To bude o dosť viac kódu voči číslám
Z môjho pohľadu nevidím nijakú výhodu hexadecimálneho zápisu voči decimálnemu. Mne úplne postačuje 10 hodnôt na jednej pozícii voči 16 hexa. Tie by som aj tak zo strachu nepoužil :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #34 kdy: 13-07-2019, 20:20:07 »
Nebo uživateli prostě zobraz kód chyby ve tvaru 1:15:3:10. Lidem se to bude líp diktovat, Ty nebudeš muset nic skládat a rozkládat, když Ti zavolají a budou chybu diktovat, tak hned podle čísel budeš vědět, v jaké oblasti ta chyba je, všichni spokojeni :-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #35 kdy: 14-07-2019, 10:35:17 »
Máš pravdu. Načo sa ešte babrať s nejakým Message a nedajbože logmi :o ::)
Aj tak by som rád dostal krátku jednoduchú odpoveď na "Kedy a kde?". Ja viem, oni spolu súvisia.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #36 kdy: 14-07-2019, 10:38:45 »
Teď nevím, jestli jsi mne dobře pochopil :-)
Uživateli je samozřejmě dobré zobrazit nějaký kloudný text, ze kterého pochopí, v čem je problém. Ale jak jsi pořád operoval s tím, že chceš poskládat 4 číselné hodnoty do jednoho chybového kódu, tak by možná bylo jednodušší to prostě nechat jako 4 samostatné hodnoty a zobrazit třeba oddělené tečkou, dvojtečkou apod. Do logu si to můžeš zapsat, jak chceš - pokud bude log v databázi, tak klidně na ty čtyři hodnoty mít čtyři pole, alespoň podle nich budeš moci snadno filtrovat, řadit...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #37 kdy: 14-07-2019, 17:13:12 »
Citace
Teď nevím, jestli jsi mne dobře pochopil
Myslím si, že áno. Z mojej strany bol úvod reakcie irónia. Veď je nedeľa.
Tu otázku Kedy a kde som mal na mysli len vo vzťahu k variants record.
Ako to myslím. Budem mať definovaných 1000 ErrorCode. Pri vyvolaní výnimky použijem napr.
Kód: Delphi [Vybrat]
  1. MyErrror.Create(ErrorCode999, ...)
To sa nedá použiť na variants record. Podľa mňa by mal existovať len jediný variants record. Možno to je chyba v mojej predstave. Otázku môžem zmeniť aj na:
Mám si definovať 1000 x MyVariantsRecord?
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #38 kdy: 14-07-2019, 18:21:13 »
Budem mať definovaných 1000 ErrorCode. Pri vyvolaní výnimky použijem napr.
Kód: Delphi [Vybrat]
  1. MyErrror.Create(ErrorCode999, ...)
Ano, to je jedna z cest, kdy to ridis Error codem. Ale zrovna tak muzes psat
Kód: Delphi [Vybrat]
  1. MyErrror.Create(Category.X, Group.Y, Detail.Z, ErrorCode, E)

A pokud se ti nebude prilis lisit struktura resp. to bude v nejjednoduzsim pripade vzdy Category, Group, Detail a ErrorCode, tak ti na vsechno staci jeden variantni record:
 - 1. varianta pro jednotlive hodnoty Category, Group, Detail a ErrorCode
 - 2. varianta pro vysledek, ve kterem budou hodnoty Category, Group, Detail a ErrorCode nasackovany na hranicich bytu do uint32/uint64

Z hlediska prace s chybou je uplne jedno, jestli tu chybu vyrenderujes jako napr. decimalni hodnoty oddelene dvojteckou Category:Group:Detail:ErrorCode nebo uint32/64 renderovanty do desitkove nebo sestnactkove soustavy... Akorat ze desitkouvou soustavu pouzivaji jen strikaci ;)

Kdyz bude struktura tech Error code nesouroda, tak teprve pak se vyplati nadefinovat si tech 1000 error kodu (=konstant) a predavat to jako jediny parametr do konstruktoru a vsude dal to predavat jako parametr s tim, ze kdyz to nekde budes potrebovat, tak si to budes muzes zpetne rozlozit na jednotlive slozky

Ale to uz jsem ti vsechno psal...

Do DB bych nelogoval, protoze k tomu musis mit funkcni nezanedbatelnou infrastrukturu aplikace, muzes mit potrebu logovat nekde uprostred rozpadajici se / zotavovane DB transkace etc... Logovaci subsystem by mel vyzadovat co nejmene zavislosti, idealne jen I/O subsystem OS.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #39 kdy: 14-07-2019, 18:40:57 »
Ja si teraz šrotujem hlavu len myšlienkou, Kde a kedy vytvoriť variants record. Či bude jeden alebo 1000.
Ak by som ho mal vytvárať pri vyvolaní výnimky, tak je jednoduchšie poslať jednotlivé kódy - MyErrror.Create(Category.X, Group.Y, Detail.Z, ErrorCode, E).
Lenže ja si nijako neviem predstaviť, žeby som vytvoril jeden jediný variants record v TMyErrror! Momentálne to je môj hlavný problém. O tom je aj otázka Kde a kedy.
Vytvoriť ich 1000 považujem prinajmenšom za somarinu. Jedine, žeby som ich mal v samostatnej jednotke v nejakom zozname. Aby sa z behu programu vytvorili len raz. A v prípade potreby ich odtiaľ ťahať.
To by funkčne zodpovedalo definíciám ErrorCode.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #40 kdy: 14-07-2019, 18:42:35 »
Alebo ErrorCode definovať ako variants record?
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #41 kdy: 14-07-2019, 18:51:55 »
Excellent
Rated 1 time
Alebo ErrorCode definovať ako variants record?
ja uz nevim, jak ti to napsat. Nakresli si na papir obdelnik na vysku jako pamet, ktera predstavuje n-bytu (treba 8 ) a je uvnitr variantniho recordu. Zleva si napis pod sebe ty tvoje Category, Group, Detail a buhvi co jeste tak, aby nezabraly vice nez tech n-bytu. A zprava jedinou hodnotu, ktera obsahne ten obdelnik na vysku - to bude tvuj vysledny kod. Vlevo je ta varianta 1, vpravo varianta 2 variantniho recordu tj. ruznych pohledu na stejny zmolek pameti. A kdyz budes predpokladat napr. uint64 (qword), tak je v MyError prece uplne jedno, jestli ma member variable typu qword nebo spravne napsanou verzi variantniho recordu, ktera predstavuje v pameti take qword a umozni ti jedine: pracovat napr. s temi 64 bity pokazde jinak podle poctu variant.

Ale uz fakt mlcim,

« Poslední změna: 14-07-2019, 19:00:50 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Kódy chýb - zistiť masku a skupinu
« Odpověď #42 kdy: 14-07-2019, 19:36:21 »
Tak trocha začínať šípiť o čom píšeš. Len som si to ešte nenakreslil :)
Už tu dám pokoj. Niečo z toho dostanem.
Všetkým ďakujem.
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:Kódy chýb - zistiť masku a skupinu
« Odpověď #43 kdy: 14-07-2019, 20:15:18 »
Zhrniem to ako to chápem ja:
  • Category, Group, Detail, ErrorCode = Category or Group or Detail
  • ErrorCode = VariantsRecord(Field: Category, Group, Detail)
Ja to chápem tak, že MyError sa vytvorí až v okamihu vyvolania výnimky. To znamená, že sa v rámci Create definuje všetkých 1000 ErrorCode.
Alebo to je ináč?
Keďže ErrorCode sú v časti interface, tak sú definované v okamihu načítania jednotky,  nasúkajú sa do pamäte, a zaniknú až pri ukončení aplikácie. Opakovanie sa volá len Create.
Keď som to napísal, tak som za podčiarknuté. Už sa mi rysuje v hlave aj tá práca/princíp s variants record.
Ach jaj, máte so mnou ťažké. Veď ja nerozumiem sám sebe ???
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.