Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2004
megaman_x megaman_x is offline
Registrado
 
Registrado: dic 2004
Posts: 6
Poder: 0
megaman_x Va por buen camino
Exclamation Tcombobox solo lectura

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


Código:
 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!!
Responder Con Cita
  #2  
Antiguo 12-12-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.
Responder Con Cita
  #3  
Antiguo 13-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Al González
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
Responder Con Cita
  #4  
Antiguo 13-12-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola de nuevo!


Cita:
Empezado por roman
...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 .
Responder Con Cita
  #5  
Antiguo 13-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una sugerencia:

Código Delphi [-]
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
Responder Con Cita
  #6  
Antiguo 13-12-2004
megaman_x megaman_x is offline
Registrado
 
Registrado: dic 2004
Posts: 6
Poder: 0
megaman_x Va por buen camino
weeno mientras pruebo el codigo de roman, les dire ke fsoloLectura la F = Funcion y bSoloLectura la b = Booleano, asi es claro para mi , 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!!!
Responder Con Cita
  #7  
Antiguo 13-12-2004
megaman_x megaman_x is offline
Registrado
 
Registrado: dic 2004
Posts: 6
Poder: 0
megaman_x Va por buen camino
no pues la sugerencia de ROMAN no funciono no cambia el menu derecho del raton y no bloquea las teclas.

Gracias!!!
Responder Con Cita
  #8  
Antiguo 13-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por megaman_x
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
Responder Con Cita
  #9  
Antiguo 13-12-2004
megaman_x megaman_x is offline
Registrado
 
Registrado: dic 2004
Posts: 6
Poder: 0
megaman_x Va por buen camino
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!!!
Responder Con Cita
  #10  
Antiguo 13-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por megaman_x
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
Responder Con Cita
  #11  
Antiguo 07-08-2007
Avatar de b3nshi
b3nshi b3nshi is offline
Miembro
 
Registrado: feb 2005
Ubicación: Tucuman - Argentina
Posts: 164
Poder: 20
b3nshi Va por buen camino
Una solucion para no crear un componente nuevo

Para no tener q crear un componente nuevo simplemente podemos hacerlo asi...

Código Delphi [-]
 
//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}
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:04:46.


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