PDA

Ver la Versión Completa : Tcombobox solo lectura


megaman_x
11-12-2004, 19:20:32
bueno antes ke nada si ya existe algo asi, por favor hagan referencia.

Escribi este componente basado en otros posts, es un combobox con la propiedad SoloLEctura que cuando su valor es TRUE, el color se cambia a clBtnFace y style a csSimple, ademas hereda los metodos keyUp y KeyDown para evitar escritura.

Solo falta que con el clic derecho del raton no se pueda cortar o pegar, dejando la opcion de copiar disponible. Creo que tampoco me funciona Ctrl + C pero eso es mas facil.

Una ayudadita por favor :D



unit uCrusserComboboxEx;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,graphics;

type
TCrusserComboBoxEx = class(TComboBox)
private
{ Private declarations }
bReadOnly: Boolean;
procedure fLectura(valor: Boolean);
protected
procedure KeyDown(var Key: Word; Shift: TShiftState);override;
procedure KeyPress(var Key: Char);override;
public
property SoloLectura:boolean read bReadOnly write fLectura;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Misc', [TCrusserComboBoxEx]);
end;

procedure TCrusserComboBoxEx.fLectura(Valor: Boolean);
begin
bReadOnly := Valor;
if bReadOnly then begin
Color := clBtnFace;
Style := csSimple;
end else begin
Color := clWindow;
Style := csDropDown;
end;

end;

procedure TCrusserComboBoxEx.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if bReadOnly then
if (key = VK_DELETE)
or (Key = VK_UP)
or (Key = VK_DOWN)
then key := word(#0); // this allows the user to tab
end;

procedure TCrusserComboBoxEx.KeyPress(var Key: Char);
begin
inherited;
if bReadOnly then
key := #0;
end;

end.


Salud!! :rolleyes:

Al González
12-12-2004, 07:52:25
¡Hola a todos!

Megaman_x:

Me gustaría hacerte algunas sugerencias respecto al código que amablemente anexaste. Pero antes necesitaría comprender con claridad el objetivo de este componente y de su propiedad SoloLectura, ante la existencia de la tradicional propiedad ReadOnly que, según lo que aprecio, ya hace parte del trabajo que has codificado.

Muchas gracias.

Al González. :)

roman
13-12-2004, 00:11:46
necesitaría comprender con claridad el objetivo de este componente y de su propiedad SoloLectura, ante la existencia de la tradicional propiedad ReadOnly


La componente TComboBox no tiene propiedad ReadOnly.

// Saludos

Al González
13-12-2004, 04:52:18
¡Hola de nuevo!


...TComboBox no tiene propiedad ReadOnly...
¡Vaya! Eso lo explica todo. Gracias por la corrección Román :). Había asumido que todos los componentes Delphi nativos para captura de texto tenían una propiedad ReadOnly. Y según veo ahora, la carencia de dicha propiedad en las cajas combinadas es una característica normal de la clase COMBOBOX interna de Windows.

Mi más sincera disculpa para Megaman_x ;).

Las sugerencias que tengo son que utilices un campo de nombre FSoloLectura en lugar de bReadOnly, y un método de nombre SetSoloLectura en lugar de FLectura, para los accesos de lectura y escritura del valor de la propiedad. Siento que con ello estaría un poco más claro el código.

Espero esto sea de utilidad, seguimos en contacto.

Al González :).

roman
13-12-2004, 05:31:01
Una sugerencia:


procedure TCrusserComboBoxEx.fLectura(Valor: Boolean);
begin
bReadOnly := Valor;
if bReadOnly then begin
Color := clBtnFace;
Style := csSimple;
SendMessage(EditHandle, EM_SETREADONLY, 1, 0);
end else begin
Color := clWindow;
Style := csDropDown;
SendMessage(EditHandle, EM_SETREADONLY, 0, 0);
end;
end;


EditHandle es el identificador del control de edición del ComboBox.

// Saludos

megaman_x
13-12-2004, 16:33:26
weeno mientras pruebo el codigo de roman, les dire ke fsoloLectura la F = Funcion y bSoloLectura la b = Booleano, asi es claro para mi :D, de otra manera si uso FSoloLectura en lugar de bReadOnly, a ke te refieres con la F al principio, pero pues cambiar de bREadOnly a bSoloLEctura suena bien.

Buen foro, y buenas respuestas,

Gracias!!!

megaman_x
13-12-2004, 16:44:34
no pues la sugerencia de ROMAN no funciono :( no cambia el menu derecho del raton y no bloquea las teclas.

Gracias!!!

roman
13-12-2004, 16:46:55
a ke te refieres con la F al principio


A Field. Al hace mención a una convención en la nomenclatura que consiste en anteponer la F a los campos asociados a una propiedad. Podrás observar esta convención en todo el código de la VCL. En lo particular a mi me gusta más ya que prefiero que el nombre mismo de una propiedad o función denote su tipo de datos. Así, por ejemplo, ReadOnly o SoloLectura, en mi opinión denotan claramente que se trata de atributos booleanos sin necesidad de anteponer la "b". En el caso de la F sirve para distinguir que no se trata de una propiedad sino simplemente de un campo o variable que está asociada a una propiedad. Pero desde luego esto es cuestión de gustos y lo único importante es que uno sea consistente con su propia nomenclatura.

// Saludos

megaman_x
13-12-2004, 16:52:03
oohh muy buena explicacion, lo ke pasa que vengo de otros lenguajes.

bueno por ahi me dicen crear mi propio menu desplegable o interceptar WM_PASTE y WM_CUT, pero por falta de tiempo, solo bloqueare el clic derecho por lo pronto.

Gracias otra vez!!!

roman
13-12-2004, 16:57:52
no pues la sugerencia de ROMAN no funciono :( no cambia el menu derecho del raton y no bloquea las teclas.


No sé de qué manera lo has hecho pero te aseguro que sí bloquea las teclas. El cuadro de edición no es más que un TEdit y al mandar el mensaje que te pongo lo haces de sólo lectura tal como te indiqué. Lo que es cierto es que no cambia el menú contextual, pero lo mismo sucede en un TEdit normal.

// Saludos

b3nshi
07-08-2007, 17:52:11
Para no tener q crear un componente nuevo simplemente podemos hacerlo asi...


//Para q sea de solo lectura
SendMessage(Getwindow (combobox1.handle),GW_CHILD,EM_SETREADONLY,1,0);
//Para q sea editable
SendMessage(Getwindow (combobox1.handle),GW_CHILD,EM_SETREADONLY,0,0);


{Saludos}