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


La franja horaria es GMT +2. Ahora son las 17:09:28.

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