Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Tcombobox solo lectura (https://www.clubdelphi.com/foros/showthread.php?t=16784)

megaman_x 11-12-2004 19:20:32

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 :D


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!! :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

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

Al González 13-12-2004 04:52:18

¡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 :).

roman 13-12-2004 05:31:01

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

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

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

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

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

b3nshi 07-08-2007 17:52:11

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}


La franja horaria es GMT +2. Ahora son las 05:29:02.

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