Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Coloreando una parte del Texto en TreeView (https://www.clubdelphi.com/foros/showthread.php?t=57819)

enecumene 28-06-2008 00:30:22

Coloreando una parte del Texto en TreeView
 
Saludos Compañero, he estado haciendo lo siguiente para poder colorear una parte del texto en un TreeView, pero no me funciona:

Código Delphi [-]
procedure TFSelInfC.FormCreate(Sender: TObject);
Var
    Nodo:Packed Array[0..99] of TTreenode;
    NodoValor:Packed array[0..99] of Variant;
begin
  ZDpto.Open;
    trvDptos.Items.Clear;
    ZDpto.First;
    While not ZDpto.Eof do
    begin
        if NodoValor[0]<> ZDpto.Fields[0].Value then begin
     With ZDpto.Fields[2] do
      begin
        Canvas.Font.Color := clBlue;
      end;
             Nodo[0]:=trvDptos.Items.Add(nil,Vartostr(ZDpto.Fields[0].Value+' ('+ZDpto.Fields[2].AsString+')'));
          NodoValor[0]:=ZDpto.Fields[0].Value;
      Nodo[0].Data := pointer(ZDpto.FieldByName('DPTOID').AsInteger);
     end;
    ZDpto.next;
    end;
end;

Quisiera Quedara así:

Departamentos de Compras (18)

He intentado varias formas, pero no llego.

Saludos.

enecumene 28-06-2008 02:04:34

Lo último que he hecho (un disparate) no funcionó, ya no tengo más ideas:

Código Delphi [-]
procedure TFSelInfC.FormCreate(Sender: TObject);
Var
    Nodo:Packed Array[0..99] of TTreenode;
    NodoValor:Packed array[0..99] of Variant;
  Total: TLabel;
begin
  ZDpto.Open;
    trvDptos.Items.Clear;
    ZDpto.First;
  Total.Caption := ZDpto.Fields[2].AsString;
  Total.Font.Color := ClBlue;
    While not ZDpto.Eof do
    begin
        if NodoValor[0]<> ZDpto.Fields[0].Value then begin
             Nodo[0]:=trvDptos.Items.Add(nil,Vartostr(ZDpto.Fields[0].Value+' ('+Total.Caption+')'));
          NodoValor[0]:=ZDpto.Fields[0].Value;
      Nodo[0].Data := pointer(ZDpto.FieldByName('DPTOID').AsInteger);
     end;
    ZDpto.next;
    end;
end;

Saludos.

roman 28-06-2008 02:11:44

Hola, ando algo ajuma'o así que no es mucho lo que voy a decir. ¿Qué para pintar nodos de un TreeView no debería usarse uno de sus eventos OnCustomDrawItem u OnAdvancedCustomDrawItem?

// Saludos

enecumene 28-06-2008 02:15:48

¡Hip!, como ves, vengo de la fiesta ¡Hip! aquella ¡Hip!, pero, ¿esos eventos no son para el item completo?, porque lo que quiero darle a una sola parte del texto no todo, digo ¡hip!, eso creo yo.

Salu..¡Hip!..dos.

roman 28-06-2008 02:21:08

Pos' sip, son para el ítem entero, o sea, que tienes que pintarlo todo tú solito pa' q' salga como quieres.

Y que viva méxico!

Ay guey, no, eso era en el otro salón

// Saludos

enecumene 28-06-2008 02:24:25

Cita:

Empezado por roman (Mensaje 296900)
Ay guey, no, eso era en el otro salón

// Saludos

:D :D :D,

Bueno deja,e acell e inten ¡hip! to.

enecumene 28-06-2008 20:14:00

Bueno, aquí vuelvo con una resaca, y todavía no he logrado nada, por favor, algún alma caritativa que me ayude. ;)

Saludos. (Por favor hablen bajito)

enecumene 30-06-2008 01:35:37

Hola, pues vuelvo con otro invento que no funcionó,

Código Delphi [-]
procedure TFSelInfC.trvDptosCustomDraw(Sender: TCustomTreeView;
  const ARect: TRect; var DefaultDraw: Boolean);
begin
with trvDptos.Items[0] do
  begin
      if ZDpto.Fields[2].Value then begin
        Canvas.Font.Color := clBlue;
    end;
  end;
end;

Ya no sé que hacer :(

Saludos.

enecumene 01-07-2008 02:59:27

Bueno, con la ayuda de Eduarcol (Todo), hicimos(él hizo) este pedazo de código:

Código Delphi [-]
procedure TFSelInfC.trvDptosCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
   rc: TRect;
begin
   DefaultDraw := False;
   with trvDptos do
   begin
      Canvas.Brush.Style := bsClear;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      rc :=  Node.DisplayRect(False);
      Canvas.TextOut(rc.Left, rc.Top, Copy(Node.Text, 1, Pos('(', Node.Text)));
      Canvas.Refresh;
      Canvas.Font.Color := clRed;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextHeight(Copy(Node.Text, 1, Pos('(', Node.Text) - 1)), rc.Top, EntreValores(Node.Text, '(', ')'));
      Canvas.Refresh;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextHeight(Node.Text) - 1, rc.Top, Copy(Node.Text, 1, Pos(')', Node.Text)));
 end;
end;

Resultado:

http://img237.imageshack.us/img237/8...sultadouv7.jpg

Sin comentarios.

Saludos.

eduarcol 01-07-2008 12:29:22

pero veo que aun sigue montado el texto, no se soluciono eso? :confused:

enecumene 01-07-2008 13:44:16

Cita:

Empezado por eduarcol (Mensaje 297384)
pero veo que aun sigue montado el texto, no se soluciono eso? :confused:

No funcionó amigo Eduardo :(

eduarcol 01-07-2008 14:05:58

bueno, esperemos que llegue algun maestro del canvas a ver que hace con esto.... Recuerda que te dije que no estoy muy puesto en el tema :cool:

eduarcol 01-07-2008 14:17:40

Listo, no era nada del canvas ni eso... un simple error por el cansancio de ayer

Código Delphi [-]
procedure TForm1.trvDptosCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
   rc: TRect;
begin
   DefaultDraw := False;
   with trvDptos do
   begin
      Canvas.Brush.Style := bsClear;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      rc :=  Node.DisplayRect(False);
      Canvas.TextOut(rc.Left, rc.Top, Copy(Node.Text, 1, Pos('(', Node.Text)));
      Canvas.Refresh;
      Canvas.Font.Color := clRed;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextWidth(Copy(Node.Text, 1, Pos('(', Node.Text))), rc.Top, EntreValores(Node.Text, '(', ')'));
      Canvas.Refresh;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextWidth(Node.Text) - 1, rc.Top, Copy(Node.Text, Pos(EntreValores(Node.Text, '(', ')'), Node.Text) + Length(EntreValores(Node.Text, '(', ')')), Pos(')', Node.Text)));
 end;
end;

si te fijas cambian las formulas que calculan los valores del texto :D IMAGEN

roman 01-07-2008 16:16:16

Eso está muy bien. Yo había intentado hacerlo llegando más o menos a lo mismo pero no podía cambiar el color (por eso no había dicho nada). Veo que lo han resuelto con un Refresh. Estupendo.

// Saludos

enecumene 01-07-2008 16:28:10

¡Vale!, Me ha funcionado de maravillas, he quitado el canvas.Brush.style, porque al estar en bsClear no me muestra la selección del item. Muchas gracias Eduarcol, eres un master :D.

Saludod.

eduarcol 01-07-2008 16:44:17

Cita:

Empezado por roman (Mensaje 297445)
Eso está muy bien. Yo había intentado hacerlo llegando más o menos a lo mismo pero no podía cambiar el color (por eso no había dicho nada). Veo que lo han resuelto con un Refresh. Estupendo.

// Saludos

Pues eso es de mi epoca cuando trabajaba en Pascal o C con la BGI, para que cambiara el color del texto habia que darle un clrscr, y buscando eso encontre el refresh funciono y sorpresa :D


Por cierto primera vez que trabajo con la canvas.

roman 01-07-2008 16:49:58

Yo había hecho un ejemplo a dos colores pero en un DBGrid y sin necesidad del Refresh, por ello no me pasó por la mente, aunque en realidad ya no me pasaba nada por la mente :D
Qué bueno que encontraste la forma. Ahora ya sabemos algo más :)

// Saludos

xEsk 02-07-2008 14:29:50

He probado el ejemplo "final", y siento decir, que pierde la gracia del TTreeView xD Los SubItems aparecen en el nivel 0

Aquí un pequeño parche xD

Código Delphi [-]
procedure TForm2.trvDptosCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
   rc: TRect;
   // Details: TThemedElementDetails; // ESTO ES basura de una prueba, lo comento en lugar de borrarlo, para que se entienda el mensaje de enecumene xD

begin
   DefaultDraw := False;
   with trvDptos do
   begin
      Canvas.Brush.Style := bsClear;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      rc :=  Node.DisplayRect(False);
      // sub-niveles
      rc.Left:=(Node.Level + 1) * TTreeView(Sender).indent;
      // miramos si esta seleccionado
      if Node.Selected then
          Canvas.Brush.Color:=clSilver
      else
          Canvas.Brush.Color:=clWindow;
      // pintamos texto
      Canvas.TextOut(rc.Left, rc.Top, Copy(Node.Text, 1, Pos('(', Node.Text)));
      Canvas.Refresh;
      Canvas.Font.Color := clRed;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextWidth(Copy(Node.Text, 1, Pos('(', Node.Text))), rc.Top, EntreValores(Node.Text, '(', ')'));
      Canvas.Refresh;
      Canvas.Font.Color := clBlue;
      Canvas.Font.Name := 'Tahoma';
      Canvas.Font.Size := 10;
      Canvas.TextOut(rc.Left + Canvas.TextWidth(Node.Text) - 3, rc.Top, Copy(Node.Text, Pos(EntreValores(Node.Text, '(', ')'), Node.Text) + Length(EntreValores(Node.Text, '(', ')')), Pos(')', Node.Text)));
 end;
end;

Saludos.

enecumene 02-07-2008 14:39:32

¡Vaya!, excelente, una cosa, ¿donde utilizas la variable Details?, no lo encuentro en el código.

Saludos.

roman 02-07-2008 16:50:49

Una pregunta xEsk:

El rc ¿no se puede obtener directamente si en lugar de usar Node.DisplayRect(False) usamos Node.DisplayRect(True)?

// Saludos

xEsk 04-07-2008 16:59:11

Cita:

Empezado por enecumene (Mensaje 297730)
¡Vaya!, excelente, una cosa, ¿donde utilizas la variable Details?, no lo encuentro en el código.

Saludos.

Ops, es un error, es basura de una prueba que realicé! xDD

Ahora lo borraré! :P

xEsk 04-07-2008 17:06:59

Cita:

Empezado por roman (Mensaje 297768)
Una pregunta xEsk:

El rc ¿no se puede obtener directamente si en lugar de usar Node.DisplayRect(False) usamos Node.DisplayRect(True)?

// Saludos

Cierto, cambiándolo a true se soluciona :p

Saludos


La franja horaria es GMT +2. Ahora son las 18:15:38.

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