Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Efectos en un TVirtualStringTree (https://www.clubdelphi.com/foros/showthread.php?t=94937)

Angel.Matilla 07-11-2020 11:22:33

Efectos en un TVirtualStringTree
 
Tengo un TVirtualStringTree y quisiera que una línea en concreto (en este caso al que lleva los totales) resaltara. De momento sólo he conseguido poner en negrita el texto pero me gsutaría cambiarle el fondo, por ejemplo en amarillo. Estoy usando este código en el evento OnPaintText:
Código:

void __fastcall TfDatos::DiariosPaintText(TBaseVirtualTree *Sender, const TCanvas *TargetCanvas, PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType)
{
    TargetCanvas->Brush->Color = ((PTreeDatos)Sender->GetNodeData(Node))->Concepto.Pos("TOTAL") != 0 ? clYellow : clWhite;
    TargetCanvas->Font->Color  = clBlack;
    TargetCanvas->Font->Style  = ((PTreeDatos)Sender->GetNodeData(Node))->Concepto.Pos("TOTAL") != 0 ? TFontStyles() << fsBold : TFontStyles() >> fsBold;
}

pero sólo consigo esto.

¿Qué me falta oen qué evento he de ponerlo? He probado en todos los que sugiere la ayuda (OnBeforePaint, OnBeforeItemPaint, OnBeforeItemErase, OnAfterItemErase, OnBeforeCellPaint, OnPaintText y OnAfterCellPaint) pero o me da error o no hace el efecto que busco.

Casimiro Notevi 07-11-2020 14:04:51

En el DrawText, ejemplo:
Código Delphi [-]
procedure TFcuentas.vstArbolDrawText(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  const Text: WideString; const CellRect: TRect; var DefaultDraw: Boolean);
var
  NodeData : PTrecBase;
begin
  inherited;
  NodeData := (Sender as TBaseVirtualTree).GetNodeData(Node);
  if iMaxDigitos = NodeData.Nivel then
    if column=1 then
    begin
      TargetCanvas.Font.Color := clYellow;
      TargetCanvas.Brush.Color := clRed;
      targetcanvas.FillRect(cellrect);
    end;
end;

Angel.Matilla 09-11-2020 09:47:09

En Builder el VST no tiene el evento OnDrawText, por eso lo estaba haciendo en el OnPaintText.

Casimiro Notevi 09-11-2020 10:03:04

Cita:

Empezado por Angel.Matilla (Mensaje 539017)
En Builder el VST no tiene el evento OnDrawText, por eso lo estaba haciendo en el OnPaintText.

Pero si el ejemplo lo he sacado de Builder :confused:
Y lo he adaptado a delphi.
¿Y CustomDraw, o algo así?

Angel.Matilla 09-11-2020 10:37:42

No; tal vez tenga que ver con que uso BCB 6. En la ayuda del VST cita los siguientes eventos:
Cita:

OnBeforePaint
OnBeforeItemPaint
OnBeforeItemErase
OnAfterItemErase
OnBeforeCellPaint
string trees only, OnPaintText
OnAfterCellPaint
OnAfterItemPaint
OnAfterPaint
Creo que los he probado todos, pero estoy volviendo a probar.

Angel.Matilla 09-11-2020 10:41:47

Es que lo que me llama la atención es que sí admita la letra en negrita pero no el cambio de fondo.

Casimiro Notevi 09-11-2020 20:53:47

Pues no sé, es que no tengo el Builder para probar.

Angel.Matilla 10-11-2020 12:16:29

Llevo desde ayer dándole vueltas y lo más que he conseguido ha sido esto:

con este código:
Código:

void __fastcall TfDatos::DesglosesBeforeItemPaint(TBaseVirtualTree *Sender,
      TCanvas *TargetCanvas, PVirtualNode Node, TRect &ItemRect,
      bool &CustomDraw)
{
    vsRect = ItemRect;   
}
//---------------------------------------------------------------------------

void __fastcall TfDatos::DesglosesPaintText(TBaseVirtualTree *Sender, const TCanvas *TargetCanvas, PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType)
{
    TargetCanvas->Font->Color  = clBlack;
    TargetCanvas->Font->Style  = ((PTreeDesglose)Sender->GetNodeData(Node))->Concepto.Pos("TOTAL") != 0 ? TFontStyles() << fsBold : TFontStyles() >> fsBold;
    TargetCanvas->Brush->Color = ((PTreeDatos)Sender->GetNodeData(Node))->Concepto.Pos("TOTAL") != 0 ? clYellow : clWhite;
    TargetCanvas->FillRect(vsRect);
}
//---------------------------------------------------------------------------

Evidentemente vsRec está definida a nivel de todo el formulario con TRect vsREct. Está claro que tiene que poderse pero no encuentro la forma. Seguiremos probando


La franja horaria es GMT +2. Ahora son las 09:07:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi