Ir al contenido


Foto

[RESUELTO] CheckListBox, quitar el texto resaltado?


  • Por favor identifícate para responder
11 respuestas en este tema

#1 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 02 diciembre 2010 - 04:20

Hola, Soy brasileño y no puedo hablar español, así que estoy usando un traductor. Puede  haber errores, mayor es mi duda: estoy aquí en CheckListBox componente  Delphi 7, donde no sé cuántos elementos van a aparecer porque lo estoy  llenando los datos que se realizan. Incluso  tan bueno, el problema es que tengo que calcular las coordenadas de la  "Rect.Top" en el componente OnDrawItem evento, así como los artículos  que vienen en CheckListBox lo lleva fuera de la posición de la casilla  de verificación. Y si es posible eliminar el resalte de todo el texto, porque esta en mi camino.
No tiene que ser exactamente en este caso, siempre que existan determinados. El tamaño de este CheckListBox con Altura = 137, ancho = 149.
Al  primero que quiero hacer es utilizar la barra que pone de relieve el  tamaño del texto del texto y no el tamaño de ItemHeight, porque soy el  cálculo de la distancia entre los elementos de línea dentro del  componente.

A modo de ejemplo:


delphi
  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, CheckLst, XPMan;
  6. type
  7.   TForm1 = class(TForm)
  8.     gbTributo: TGroupBox;
  9.     chklistTributo: TCheckListBox;
  10.     Button1: TButton;
  11.     procedure chklistTributoDrawItem(Control: TWinControl; Index: Integer;
  12.       Rect: TRect; State: TOwnerDrawState);
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20. var
  21.   Form1: TForm1;
  22. implementation
  23. {$R *.dfm}
  24. procedure TForm1.FormCreate(Sender: TObject);
  25. var
  26.   iItem: Integer;
  27. begin
  28.   with chklistTributo do
  29.     begin
  30.       ItemHeight := (Height div Items.Count);
  31.       iItem := ItemHeight;
  32.       ItemHeight := iItem -1;
  33.     end;
  34. end;
  35. procedure TForm1.chklistTributoDrawItem(Control: TWinControl;
  36.   Index: Integer; Rect: TRect; State: TOwnerDrawState);
  37. var
  38. iTotalItem: Integer;
  39. //Criei uma função para não repetir codigos sem necessidade
  40. function RetornaCoordenadas(chkLtBox: TCheckListBox; iTotItem: Integer):Integer;
  41. begin
  42.   with chkLtBox do
  43.   begin
  44.     case iTotItem of  //Verifica o total de itens para calcular o Rect.Top do checklistbox
  45.       08: Result := 01;
  46.       07: Result := 03;
  47.       06: Result := 05;
  48.       05: Result := 07;
  49.       04: Result := 09;
  50.       03: Result := 16;
  51.       02: Result := 27;
  52.       01: Result := 60;
  53.     end;
  54.   end;
  55. end;
  56. //
  57. begin
  58.   with (Control as TCheckListBox).Canvas do
  59.   begin
  60.     //Font.Color := clBlack;
  61.     Brush.Style := bsSolid;
  62.     iTotalItem :=  chklistTributo.Items.Count; //Conta a quantidade de itens dentro do ListBox e manda para variavel
  63.     TextOut(Rect.Left + 4, Rect.Top + (RetornaCoordenadas(chklistTributo,iTotalItem)),(Control as TCheckListBox).Items[Index]);
  64.   end;
  65. end;
  66. procedure TForm1.Button1Click(Sender: TObject);
  67. var
  68.   i : integer;
  69. begin
  70.   with chklistTributo do
  71.   begin
  72.     for i := -1 + Items.Count downto 0 do
  73.     if Selected then Items.Delete(i) ;
  74.   end;
  75. end;
  76. end.



O DFM
[/]


delphi
  1. object gbTributo: TGroupBox
  2.   Left = 8
  3.   Top = 24
  4.   Width = 153
  5.   Height = 154
  6.   Caption = 'Tributo'
  7.   TabOrder = 0
  8.   object chklistTributo: TCheckListBox
  9.     Left = 2
  10.     Top = 15
  11.     Width = 149
  12.     Height = 137
  13.     Align = alClient
  14.     BevelInner = bvNone
  15.     BevelOuter = bvNone
  16.     BorderStyle = bsNone
  17.     Color = clBtnFace
  18.     ItemHeight = 16
  19.     Items.Strings = (
  20.       'Test'
  21.       'Test2'
  22.       'Test3'
  23.       'Test4'
  24.       'Test5')
  25.     Style = lbOwnerDrawFixed
  26.     TabOrder = 0
  27.     OnDrawItem = chklistTributoDrawItem
  28.   end
  29. end
  30. object Button1: TButton
  31.   Left = 168
  32.   Top = 72
  33.   Width = 75
  34.   Height = 25
  35.   Caption = 'Del Item'
  36.   TabOrder = 1
  37.   OnClick = Button1Click
  38. end



Así que esta forma de trabajar allí, más es difícil saber cuántos elementos tienen con CheckListBox. Y si me voy a poner el clavo Reparate las coordenadas de Rect.Top como la cantidad de elementos. (Esto no es factible)[/]
Como aquí en Brasil no pude conseguir a nadie que me ayude, por lo que estoy buscando la ayuda de otras naciones.Gracias a quien me pueda ayudar.Adriano.

Descuple, estou using Google o tradutor

  • 0

#2 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 03 diciembre 2010 - 02:10

Hola Adriano, no está claro qué es lo que quieres hacer realmente.

Si quieres dibujar el texto de cada elemento del TCheckListBox por tu cuenta, el parámetro Rect te indica el area para pintar encima, ¿por qué usas esa función tan rara llamada RetornaCoordenadas? Además, no entiendo por qué esta función devuelve esos valores tan diferentes para cada elemento. Parece que quieras pintar fuera del rectángulo Rect.

Dices:

más es difícil saber cuántos elementos tienen con CheckListBox

No lo entiendo, tú mismo usas chklistTributo.Items.Count para averiguar el número de elementos del TCheckListBox.

Por desgracia, creo que el traductor de Google no es suficiente para expresar exactamente lo que deseas.
:embarrassed:

Saludos

  • 0

#3 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 03 diciembre 2010 - 04:21

Olá Andreas,
  Gracias por responder amigo.

lo siento, no hablo español.

Además, no entiendo por qué esta función devuelve esos valores tan diferentes para cada elemento.

Es porque estoy tratando de CheckListBox evento DrawItem, y está haciendo una diferencia con Check el Text.

Pero lo que realmente necesita es quitar el realse de todo el texto, que esta inquietante.

En resumen, tratar de salir de la CheckListBox como el radiogroupbox. (No  los comandos, pero la distancia entre los elementos, si se observa la  ReadioGroup hace sin la necesidad de programar una sola línea).

Nota: Se quiser ver como fiz o checklistbox deixei ai no forum o DFM e o PAS disponível.

Gracias amigo.

Vejam a imagem
Imagen Enviada
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 04 diciembre 2010 - 10:34

Hola amigo, como te va con el ingles?
  • 0

#5 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 04 diciembre 2010 - 02:04

Hola amigo, como te va con el ingles?

Only  with the translator if you can also ... More paste the DFM and PAS I  posted in Delphi, you'll see that my problem is with the realse around  the text (as shown in image above), I cut it and I can not, the  problem of the coordinates can work around this with the function that i  did, the more that there realse bypassing this text in my way.

Thanks friend, for help.

****Em espanhol*****

Sólo con el traductor si también puede ... Más  pegar el DFM y PAS que ha escrito en Delphi, verá que mi problema es  con el realse de todo el texto (como estas image arriba), la corté y no puedo, el problema se  puede evitar este coordinar con la función que hice, la más que realse pasar por este texto en mi camino.



Gracias amigo, en busca de ayuda.
  • 0

#6 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 04 diciembre 2010 - 03:01

¿Cómo puedo mostrar lo que quiero ... Me  muestran dos imágenes que no desea mostrar la última imagen y  CheckListBox (OK) sin límite y con la barra de realse azul alrededor del  texto.

Estas imágenes no son para lo que quiero.Imagen Enviada

Esta imagen que quiero que el CheckListBox ser idénticos.
Imagen Enviada

El ejemplo de la DFM y PAS es lo que he publicado arriba

Saludos

Nota: Sí  alguien sabe una manera de hacer esto con CHECKBOX  dentro de GROUPBOX, también puede ser, no tiene por qué ser  exactamente CheckListBox.


  • 0

#7 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 06 diciembre 2010 - 06:42

Resolvi utilizar o CHECKBOX no lugar do checklistbox, pois este componente é muito poblemático.

Bem amigos, depois de tanto pensar aqui, esta foi a solução que eu achei para meu problema.

Segue a unidade


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, StdCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     procedure Button1Click(Sender: TObject);
  13.   private
  14.     iTchk: integer;
  15.     procedure CheckBox(objetoOwner: TWinControl; rotulo: string; coluna,
  16.       altura: integer);
  17.     function GroupBox(objetoOwner: TWinControl): TWinControl;
  18.     function RetCooLines(iTotChk: Integer): Integer;
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23.  
  24. var
  25.   Form1: TForm1;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30. function TForm1.RetCooLines(iTotChk: Integer):Integer;
  31. begin
  32.   case iTotChk of  //Verifica o total de itens para calcular o Rect.Top do checklistbox
  33.     08: Result := 17;
  34.     07: Result := 19;
  35.     06: Result := 21;
  36.     05: Result := 25;
  37.     04: Result := 30;
  38.     03: Result := 38;
  39.     02: Result := 48;
  40.     01: Result := 70;
  41.   end;
  42. end;
  43.  
  44. function TForm1.GroupBox(objetoOwner: TWinControl): TWinControl;
  45. var
  46. grupo: TGroupBox;
  47. begin
  48.   grupo := TGroupBox.Create(objetoOwner);
  49.   grupo.Caption := ' Títulos ';
  50.   grupo.Parent := objetoOwner;
  51.   grupo.Height := 160;
  52.   grupo.Top := 24;
  53.   grupo.Width := 153;
  54.   grupo.Left := 8;
  55.   GroupBox := grupo;
  56. end;
  57.  
  58. procedure TForm1.CheckBox(objetoOwner: TWinControl; rotulo: string; coluna, altura: integer);
  59. var
  60. check: TCheckBox;
  61. i: integer;
  62. begin
  63.   check := TCheckBox.Create(objetoOwner);
  64.   check.Parent := objetoOwner;
  65.   check.Caption := rotulo;
  66.   check.Top := (altura * RetCooLines(iTchk));  //17
  67.   check.Width := 110;
  68.   check.Left := (coluna * 160) - 145;
  69. end;
  70.  
  71. procedure TForm1.Button1Click(Sender: TObject);
  72. var
  73. x, y : integer;
  74. owner: TWinControl;
  75. begin
  76.   Owner := GroupBox(Self);
  77.   for y := 1 to 1 do
  78.   begin
  79.     iTchk := 5; //Todo: Aqui vou popular a quantidade de chkbox com dados que vem da classe de persistência
  80.     for x := 1 to iTchk do
  81.     begin
  82.       CheckBox(owner,'Check Box ' + IntToStr(x),y,x); //Todo: Aqui vou trocar pelo nome do arquivo que vai vir da busca
  83.     end;
  84.   end;
  85.  
  86. end;
  87.  
  88. end.



No era la forma más elegante, más por lo menos era mejor para mi propósito.

Gracias amigos.
  • 0

#8 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 07 diciembre 2010 - 11:57

Hola Adriano, aunque lo hayas resuelto ya con TCheckBox, te dejo aquí un trozo de código a aplicar para el TCheckListBox, sólo tienes que interceptar el evento OnDrawItem:



delphi
  1. procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
  2.   Index: Integer; Rect: TRect; State: TOwnerDrawState);
  3. begin
  4.   with TCheckListBox(Control).Canvas do
  5.   begin
  6.     Brush.Color := TCheckListBox(Control).Color;
  7.     Fillrect(Rect);
  8.     if odSelected in State then
  9.     begin
  10.       Brush.Color := clHighLight;
  11.       Font.Color := clHighLightText;
  12.     end
  13.     else Font.Color := TCheckListBox(Control).Font.Color;
  14.     with Rect do
  15.       TextOut(Left + 4, (Top + Bottom - TextHeight('M')) div 2,
  16.               TCheckListBox(Control).Items[Index]);
  17.     Abort;
  18.   end;
  19. end;



Te dibuja cada elemento como tú quieres, a ver si también te sirve. La última linea que pone "Abort" es para que no se llame luego al método que dibuja el rectángulo (FocusRect) que no quieres que te aparezca.

Saudações  ;)
  • 0

#9 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 07 diciembre 2010 - 05:59

Andres1569 Hola, amigo excelente solución,  (y)
era que buscaba desde el principio.  ;)
Y lo mejor no hay necesidad de coordinar, un código más simple y eficaz.

Gracias por ayudarnos a andres1569.  (y)

Como él dice en Brasil
Te devo essa amigo.Obrigado.
[/]

  • 0

#10 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 08 diciembre 2010 - 05:32

Holla Andres1569...

Dio un pequeño problema con el ABORT

Si tengo que hacer click em BitBtn sólo se activa al hacer click en segunda vez.

Gracias


  • 0

#11 adriano_servitec

adriano_servitec

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationCuritiba-Pr - Brasil

Escrito 08 diciembre 2010 - 08:07

Resuelto amigo com comand Focused

Es el code:


delphi
  1.     procedure TfrmCalculo.chklistTributoDrawItem(
  2.   Control: TWinControl; Index: Integer; Rect: TRect;
  3.   State: TOwnerDrawState);
  4. begin
  5.   inherited;
  6.   //
  7.   with TCheckListBox(Control).Canvas do
  8.   begin
  9.       Brush.Color := TCheckListBox(Control).Color;
  10.       Fillrect(Rect);
  11.       if odSelected in State then
  12.       begin
  13.         //Apenas se quiser deixar a barra de indicação do texto ativa
  14.         {Brush.Color := clHighLight;
  15.         Font.Color := clHighLightText;}
  16.         //Se não quiser a barra de indicação de texto ativa então deixar desta forma
  17.         Font.Color := clBlack;
  18.       end else
  19.         Font.Color := TCheckListBox(Control).Font.Color;
  20.         with Rect do
  21.           TextOut(Left + 4, (Top + Bottom - TextHeight('Texto')) div 2,
  22.                 TCheckListBox(Control).Items[Index]);
  23.     if TCheckListBox(Control).Focused then
  24.       Abort;
  25.   end;
  26.   //
  27. end;


Gracias. :smiley:
  • 0

#12 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 diciembre 2010 - 09:40

Hola Adriano, me alegro de que te sirva. Lo de usar Abort es un truco que ojalá no tuviera que emplearse nunca para estos fines, ya que en realidad es lanzar una excepción (la excepción silenciosa) para evitar que se ejecute más código a continuación, aunque a mí no me da problemas al pulsar un botón.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.