Autor Téma: VirtualStrintTree - zmiznutie textu pri prechode myšou  (Přečteno 196 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Kód: Delphi [Vybrat]
  1. procedure TfrmsubPart.jstvstTblPartBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  2.   Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
  3. const
  4.   IsOld = $007DDFFF;
  5. var
  6.   NodeData: PtblPartData;
  7. begin
  8.   NodeData := Sender.GetNodeData(Node);
  9.   if not NodeData.IsNew then
  10.   begin
  11.     TargetCanvas.Brush.Color := IsOld;
  12.     TargetCanvas.FillRect(CellRect);
  13.   end;
  14. end;
Text mi zmizne len pre riadky, kde som zmenil pozadie - not IsNew. Neviem to napraviť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #1 kdy: 05-05-2019, 11:43:14 »
Ono sa mi to akosi stále viac bortí. Už mi text mizne vždy. VST sa celkove správa divne. Kliknem na uzol a OnChange nezbehne.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #2 kdy: 05-05-2019, 11:50:58 »
Už so to našiel, ale trocha tomu nerozumiem
Kód: Delphi [Vybrat]
  1.   FVst.BeginUpdate;
  2.   FVstChangeEvent := FVst.OnChange;
  3.   FVst.OnChange := nil;
  4.   FVst.Clear;
  5.   FVst.ClearSelection;
  6.   FVst.BeginUpdate;  // Omylom ešte raz
  7.  
Mal som tam 2 x FVst.BeginUpdate. Ja žijem v tom, že je to obyčajný prepínač. Ale zjavne nie. Ako keby sa vytváral ich zoznam a ja som likvidoval len jeden.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #3 kdy: 05-05-2019, 14:09:17 »
Mimochodem, vis ze bys mel kontrolovat rezim kresleni CellPaintMode a kreslit jen pri cpmPaint?
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ů: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #4 kdy: 05-05-2019, 14:11:38 »
Mimochodem, vis ze bys mel kontrolovat rezim kresleni CellPaintMode a kreslit jen pri cpmPaint?
Celkom isto viem, že neviem o čom píšeš ;D
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #5 kdy: 05-05-2019, 14:24:25 »
Mimochodem, vis ze bys mel kontrolovat rezim kresleni CellPaintMode a kreslit jen pri cpmPaint?
Celkom isto viem, že neviem o čom píšeš ;D

;D:

Kód: Delphi [Vybrat]
  1. procedure TfrmsubPart.jstvstTblPartBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  2.   Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
  3. begin
  4.   if CellPaintMode = cpmPaint then
  5.   begin
  6.     // tady kresli; rezim cpmGetContentMargin je totiz pro mereni odsazeni obsahu bunky
  7.   end;
  8. end;

A proc vlastne nepouzijes pro barveni "radku" udalost OnBeforeItemErase? Ta je pro tento ucel primo popsana; manual VTV zminuje:

Paint cycles and stages

before item erase

This stage is also entered only once per node and allows to customize the node's background. This stage and its associated event is usually used to give the node a different background color or erase the background with a special pattern which is different to what the tree would draw.


OnBeforeCellPaint je urcena mj. spis pro kresleni jednotlivych bunek. Jinymi slovy, pokud chces zmenit (barvu) pozadi "radku", pouzij OnBeforeItemErase; pokud chces (barevne) rozlisit i "bunky" v "radku", pouzij OnBeforeCellPaint.
« Poslední změna: 05-05-2019, 14:37:56 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ů: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #6 kdy: 05-05-2019, 15:01:05 »
Citace
A proc vlastne nepouzijes pro barveni "radku" udalost OnBeforeItemErase? Ta je pro tento ucel primo popsana; manual VTV zminuje:
Lebo už dávno som nečítal návod. A nie je písaný najšťastnejšie. Aby som to zistil niečo také, tak by som si musel prečítať všetky udalosti. Vieš čo by som si pamätal ;)  Samotný názov navádza myšlienky iným smerom. Ja predsa nič nemažem :) , ani nepotrebujem na takú udalosť niečo naviazať.
Samozrejme, že si to zmením.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #7 kdy: 05-05-2019, 15:11:22 »
Aby som to zistil niečo také, tak by som si musel prečítať všetky udalosti.

Nemusel. Kreslici faze jsou popsany v sekci Paint cycles and stages.

Vieš čo by som si pamätal ;)  Samotný názov navádza myšlienky iným smerom. Ja predsa nič nemažem :)

Ten nazev OnBeforeItemErase bude zrejme odvozen z nazvu zpravy WM_ERASEBKGND, jenz se vyuziva pro kresleni pozadi oken (viz. Window Background).
« Poslední změna: 05-05-2019, 15:14:38 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!

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #8 kdy: 05-05-2019, 16:09:19 »
Už so to našiel, ale trocha tomu nerozumiem
Kód: Delphi [Vybrat]
  1.   FVst.BeginUpdate;
  2.   FVstChangeEvent := FVst.OnChange;
  3.   FVst.OnChange := nil;
  4.   FVst.Clear;
  5.   FVst.ClearSelection;
  6.   FVst.BeginUpdate;  // Omylom ešte raz
  7.  
Mal som tam 2 x FVst.BeginUpdate. Ja žijem v tom, že je to obyčajný prepínač. Ale zjavne nie. Ako keby sa vytváral ich zoznam a ja som likvidoval len jeden.

Chovani metody BeginUpdate je podobne jako napr. u zamku Delphi kolekci. Interne se inkrementuje pocet zamku a s kazdym volanim EndUpdate se tento pocet dekrementuje. Jakmile dosahne s volanim EndUpdate pocet zamku nulu, VTV se odemkne a provede se jeho refresh. Pro kazde zamceni tedy musi existovat parove odemceni.

Doporucil bych Ti pouzit try..finally blok (nejen ze si tim zajistis odemceni i v pripade vyvolani vyjimky, ale hlavne tim ziskas citelnejsi kod):

Kód: Delphi [Vybrat]
  1. FVst.BeginUpdate;
  2. try
  3.   FVstChangeEvent := FVst.OnChange;
  4.   FVst.OnChange := nil;
  5.   FVst.Clear;
  6.   // FVst.ClearSelection; neni treba; metoda Clear interne vola ClearSelection
  7.   ...
  8. finally
  9.   FVst.BeginUpdate;
  10. end;
« Poslední změna: 05-05-2019, 16:13:44 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ů: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #9 kdy: 05-05-2019, 18:31:19 »
V takýchto prípadoch sa bez try ... finally nehnem. Len tu som to kvôli stručnosti nedal.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #10 kdy: 05-05-2019, 18:37:53 »
V takýchto prípadoch sa bez try ... finally nehnem. Len tu som to kvôli stručnosti nedal.

Toho by sis odsazenim kodu vsiml, ne? Samozrejme nema smysl v jednom bloku kodu strom zamykat vicekrat. Btw. v tom poslednim prispevku mam preklep (omlouvam se, psal jsem narychlo v prohlizeci). Melo to byt samozrejme:

Kód: Delphi [Vybrat]
  1. FVst.BeginUpdate;
  2. try
  3.   FVstChangeEvent := FVst.OnChange;
  4.   FVst.OnChange := nil;
  5.   FVst.Clear;
  6.   // FVst.ClearSelection; neni treba; metoda Clear interne vola ClearSelection
  7.   ...
  8. finally
  9.   FVst.EndUpdate; // omlouvam se za preklep
  10. end;

P.S. zvazil bych i try..finally blok pro zmenu prirazeni metod udalosti, tj.:

Kód: Delphi [Vybrat]
  1. FVstChangeEvent := FVst.OnChange;
  2.  
  3. FVst.OnChange := nil;
  4. try
  5.   ...
  6. finally
  7.   FVst.OnChange := FVstChangeEvent;
  8. end;
« Poslední změna: 05-05-2019, 18:44:47 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ů: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #11 kdy: 05-05-2019, 19:15:33 »
Dá sa v OnBeforeItemErase nejako pri zobrazení stromu dosiahnuť, aby bol podfarbený len text a nie celý riadok? Mne sa nepáči.
Pri OnBeforeCellPaint som to mal.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4325
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #12 kdy: 05-05-2019, 19:19:59 »
To try ... finally mám správne. BeginUpdate a EndUpdate s FVst.OnChange := FVstChangeEvent; sú volané v rámci samostatných funkcií. A tie volania sú obalené jedným try ... finally. Čo tu samozrejme nevidieť a bolo by nezmyslom dávať tu celý kód, keď sa netýka tej chyby.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1812
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:VirtualStrintTree - zmiznutie textu pri prechode myšou
« Odpověď #13 kdy: 05-05-2019, 19:42:24 »
Dá sa v OnBeforeItemErase nejako pri zobrazení stromu dosiahnuť, aby bol podfarbený len text a nie celý riadok? Mne sa nepáči.
Pri OnBeforeCellPaint som to mal.

Pro pripad podbarveni vetvi stromove struktury (ne celych "radku" stromu v rezimu gridu) je urcite vhodne provest kresleni v udalosti OnBeforeCellPaint.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!