PDA

Ver la Versión Completa : TComboBox


calogero
18-01-2007, 17:33:28
Hola que tal..

Necesito dejar coloreado el ultimo item seleccionado de un TComboBox, esto es que cuando se abra la lista desplegable del combo el item que estaba en la propiedad text del combo se coloree en esa lista que se abre..

Buscando aqui en el foro encontré que tenia que asignar a la propiedad Style del TComboBox el valor csOwnerDrawFixed y después podia escribir el código correspondiente en el evento DrawItem del TComboBox y asi lo hice pero el funcionamiento no es el esperado, le cambié el color al item dentro del evento DrawItem, pero el resultado es que no me colorea nada, cuando se abre la lista desplegable, tampoco me muestra los items.

Cualquier ayuda u orientación se agradece.

P.D. si he estado buscando en el google y en el iternet y aqui en los foros sobre este tema, pero los dias pasan y ya necesito hacer esto, si alguien quiere ayudar adelante se agradece.

Bicho
18-01-2007, 17:46:36
Hola, pos no lo entiendo, yo lo he probado y me funciona


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
ComboBox1: TComboBox;
procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure ComboBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
LastSelect : Integer;

implementation

{$R *.dfm}

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var bTemp:TBitmap;
begin
bTemp := TBitmap.Create;

with (Control as TComboBox) do begin
if Index = LastSelect then Canvas.Brush.Color := $00CCCC;

Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left,Rect.Top,Items[Index]);
Canvas.Draw(Rect.Left + 2,Rect.Top + 2,bTemp);
end;
bTemp.Free;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
LastSelect := ComboBox1.ItemIndex;
Edit1.Text := ComboBox1.Items.Strings[LastSelect];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
LastSelect := -1;
end;

end.


Saludos

calogero
18-01-2007, 19:04:48
Hola que tal..

Gracias por tu ayuda Bicho, la verdad que si habia estado batallando algo, creo que tu codigo me va servir, no conocía esa propiedad lastSelect y la verdad que no se me ocurrió buscarla... a veces te enfrascas en el codigo y se te nubla la mente.

Bueno hasta luego y gracias otra vez...

Bicho
18-01-2007, 23:55:01
Hola,

no conocía esa propiedad lastSelect y la verdad que no se me ocurrió buscarla...

No es una propiedad, sino una variable, si te fijas está declarada en la sección var

var
Form1: TForm1;
LastSelect : Integer;

implementation

Y claro, si necesitas dejar marcado un valor en el combobox, necesitarás saber que item es, para ello al seleccionar un item del combo lo asignamos a la variable.
Luego en el OnDrawCell leemos, si el item actual que se está pintando es el seleccionado, si es así, lo pintamos.
No tiene más historia.

Bueno, espero te sirviera.

Saludos

calogero
19-01-2007, 00:50:07
Claro tienes razón no es una propiedad sino una variable.. estoy seguro que si me va a servir aunque todavia no lo implemento. Bueno gracias por tu ayuda.

calogero
19-01-2007, 17:20:20
Que tal Bicho..

Funciona muy bien tu ejemplo pero, tiene un detalle, cuando abres la lista desplegable del combo y te desplazas, por los items, con las flechitas te va coloreando los items y eso no debería suceder, trataré de resolverlo... solo quería que lo supieras aunque creo que ya lo sabías.