Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Nuevo componente con lista desplegable (https://www.clubdelphi.com/foros/showthread.php?t=37971)

DarKraZY 28-11-2006 12:22:12

Nuevo componente con lista desplegable
 
Buenas foro!

Estoy creando un componente que tendrá acceso a base de datos y me gustaría saber ¿cómo conseguir que una propiedad del componente sea una lista desplegable?
Estos valores son creados dinámicamente ya que pertenecen a una base de datos.

Básicamente sería igual que por ejemplo un componente TTable o TStoredProc, los cuales muestran una lista desplegable para seleccionar el deseado.

He estado navegando por el código fuente de la VCL pero no encuentro la solución ya que esas mismas propiedades están definidas de la manera más normal
Código Delphi [-]
property StoredProcName: string read FProcName write SetProcName;
Código Delphi [-]
procedure TIBStoredProc.SetProcName(Value: string);
begin
  if not (csReading in ComponentState) then
  begin
    CheckInactive;
    if Value <> FProcName then
    begin
      FProcName := Value;
      FreeStatement;
      FParams.Clear;
      if (Value <> '') and
        (Database <> nil) then
        GenerateSQL;
    end;
  end
  else
    begin
      FProcName := Value;
      if (Value <> '') and (Database <> nil) then
        GenerateSQL;
    end;
end;

Aunque el método Set contiene código que no entiendo, todavía no sé cómo realizar lo de que aparezca la lista. ¿Es quizás algo relativo a alguna interfaz? ¿Algún editor de propiedades?

Gracias de antemano!

Neftali [Germán.Estévez] 28-11-2006 12:45:41

Cita:

Empezado por DarKraZY
Estoy creando un componente que tendrá acceso a base de datos y me gustaría saber ¿cómo conseguir que una propiedad del componente sea una lista desplegable?

Tal vez deberías pensar de qué componentes debes derivarlo. Tal vez de un DBComboBox, DBListBox,... Revisa si existen y si te pueden servir.

Cita:

Empezado por DarKraZY
Básicamente sería igual que por ejemplo un componente TTable o TStoredProc, los cuales muestran una lista desplegable para seleccionar el deseado.

Creo que te estás liando. TTable o TStoredProc son componentes no visuales, por lo tanto no tienen ninguna lista desplegable de donde seleccionar nada; Tal vez estás pensando en que estos componentes estén "ligados" a un DBGrid. :confused::confused::confused:

Cita:

Empezado por DarKraZY
Aunque el método Set contiene código que no entiendo, todavía no sé cómo realizar lo de que aparezca la lista. ¿Es quizás algo relativo a alguna interfaz? ¿Algún editor de propiedades?

Lo dicho; Estás liando componentes Visuales y NO-visuales.

Aquí tienes un manual para creación de componentes; Revísalo a ver si te aclara algunas dudas. Aquí te dejo otro, bastante más completo.

DarKraZY 28-11-2006 13:30:01

Perdona Neftali, pero no terminé de explicarme bien :P

Con lo de la lista desplegable me refería a que apareciese en el Object Inspector en tiempo de diseño.
Y aún a parte de este componente que estoy haciendo me gustaría saber como se programa esta lista, ya que se puede encontrar también en la propiedad ImageIndex que tiene un TMenuItem, por ejemplo.

Intento explicarme:
Creamos un TMainMenu, y lo relacionamos con un TImageList. Al añadir un TMenuItem, en su propiedad del Inspector de Objetos ImageIndex permite escribir a mano un entero o bien seleccionarlo de una lista. Esta lista es en lo que estaría interesado. Ya que solo aparecen los valores que pueda tener el TImageLista. Hasta aquí correcto. Pero no sé como hacerlo con código fuente para nuevos componentes.

Espero haberme explicado mejor. Lo siento :)

EDITO: Muchas gracias por los enlaces!!

Lepe 28-11-2006 16:16:20

Efectivamente es un Editor de propiedades lo que intentas hacer, en los enlaces de Neftali viene un manual.

Saludos

roman 28-11-2006 18:58:33

A mi no me permite bajar el de magaupload. Si quieren, me lo mandan y lo cuelgo de mi web.

// Saludos

DarKraZY 28-11-2006 19:31:28

El manual que he descargado de megaupload es "Curso de creación de componentes en Delphi". Y aunque ahí está firmado por "MBS para el LTIASI" es el mismo que en su día escribió Luis Roche

Volviendo al tema de los editores de propiedades... no lo entendí muy bien ya que la VCL para la propiedad ProcedureName por ejemplo está así definida en la clase
Código Delphi [-]
property StoredProcName: string read FProcName write SetProcName;
¿Aquí no está usando ningún editor de propiedad? ¿O se utilizan de otra manera?

Neftali [Germán.Estévez] 28-11-2006 19:34:41

Cita:

Empezado por roman
A mi no me permite bajar el de magaupload.

Prueba con esta: http://www.sendspace.com/file/91rn4d

EDITO: Tenía problemas con el FTP; Resueltos, ya lo he podido subir aquí.

Neftali [Germán.Estévez] 29-11-2006 11:20:35

Cita:

Empezado por DarKraZY
¿Aquí no está usando ningún editor de propiedad? ¿O se utilizan de otra manera?

Para un tipo de datos simple (string, integer,...) no hace falta definir un editor de propiedades; Incluso para muchos tipos que no son simples delphi ya los tiene definidos.

De todas formas aunque el tipo fuera otro, al definir la propiedad no hay nada distinto, seguirá siendo así:

Código Delphi [-]
property StoredProcName:TTipoRaro read FProcName write SetProcName;
[FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif][/font]

Cuando registras el componente (procedure Register), es cuando registras el Editor de propiedades que has hecho para una determinada propiedad.

Normalmente harías esto:
Código Delphi [-]
  RegisterComponents('Estandard', [TMiComponente]);

Para registrar propiedades harías algo así:

Código Delphi [-]
  // ejemplo del CoolHint
  RegisterComponents('Varios', [TCoolHint2KControl, 
                                     TCoolHint2KButton, 
                                     TCoolHint2KLink, 
                                     TCoolHint2KCommandLink, 
                                     TCoolHint2KIcon]);
  RegisterPropertyEditor(TypeInfo(TCHAboutBox), nil, '', TCHAboutProperty);
  // proiedad ConnectionString de ADO
  RegisterPropertyEditor(TypeInfo(WideString), TADOConnection, 'ConnectionString', TConnectionStringProperty);

DarKraZY 07-12-2006 13:17:35

Muchas gracias a todos por la ayuda!

Después de vuestras respuestas había dejado el tema de lado. Pero hoy volví otra vez a intentarlo haciendo unas pruebas. Y he conseguido hacer cosas parecidas a lo que pretendía.

Y la respuesta cómo habéis apuntado son los property editors.

Yo me empeñaba, según mi conocimientos de OOP, en revisar la unidad del IBStoredProc. Ahí no veía nada extraño. Así que todo parecía magia o muy complicado. Porque sólo veía que las propiedades en la definición eran de tipo string pero algunos componentes hacían unas cosas y otros otra. Era magia!

Entonces leyendo la ayuda de Delphi en el apartado "Component's Writer Guide" he ido poco a poco probando cosas.

Al final la magia está en los paquetes: paquetes de ejecución, paquetes de diseño y paquetes mixtos. La solución a mis problemas estaba en los paquetes de diseño que tienen la información de los editores de propiedades como dijo Neftali.

Un saludo y muchas gracias de nuevo!


La franja horaria es GMT +2. Ahora son las 12:32:15.

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