Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Propiedad de componente tipo "combobox" (https://www.clubdelphi.com/foros/showthread.php?t=58757)

Cecil 30-07-2008 21:13:03

Propiedad de componente tipo "combobox"
 
Hola, estoy ahora liadito con un componente, y me ha surgido una gran duda. necesito una propiedad published que cuando quieras seleccionar un dato se despliegue un combobox dependiendo de otra propiedad, dicho combobox tendrá unos valores u otros. Pongo como ejemplo el componente TTable, su propiedad TableName es una especie de combobox en el que puedes seleccionar los nombres de las tablas y depende de la propiedad DataBase. Espero haberme explicado bien :). Un saludo y espero vuestras sabias respuestas.

jarr-o 31-07-2008 23:04:44

No se si te entendi bien pero si lo que quieres es cambiar los items de un combobox primero borras lo que tenia con:

Combo1.Clear

luego le añades los items que deseas asi:

combo1.Items.Add('Opcion1');
combo1.Items.Add('Opcion2');
etc..

espero esto te ayude.

Cecil 31-07-2008 23:18:28

Gracias por tu ayuda, pero no me referí a eso. He colgado una imagen para explicarme mejor:

http://www.usuarios.lycos.es/gatorayosx/prop.JPG

Bueno, en la imagen aparece un inspector de objetos, en el hay una propiedad llamada TableName, que para seleccionar el valor trabaja parecido a un combobox. Pero esa propiedad, TableName, depende de que Database tenga asignado, con lo cual digamos que esa propiedad se recrea dependiendo de otra propiedad. Eso es lo que necesito saber como se hace. Creo que ahora me he explicado mejor :D. Un saludo!

felipe88 31-07-2008 23:27:32

Hola,

Pienso que la manera en que esta creada esta opcion es mediante codigo y de la forma como dice jarr-o, simplemente añadiendo las opciones (Sea donde esten, visibles o dentro del codigo) a menos que estes dispuesto a llenar tu formulario de cuantos Combobox necesites, pienso yo a no ser de que exista una forma mas simplificada de hacerlo.

jarr-o 31-07-2008 23:37:27

A bueno entonces solo faltaria agregarle en el evento ondropdown las condiciones de como quieres que se comporte para cada caso por ejemplo:


Código Delphi [-]
procedure TForm3.ComboBox1DropDown(Sender: TObject);
begin
if ComboBox2.Text = 'Letras' then
begin
ComboBox1.Clear;
ComboBox1.Items.Add('uno');
ComboBox1.Items.Add('dos');
ComboBox1.Items.Add('tres');
ComboBox1.Items.Add('cuatro');
end
else
begin
ComboBox1.Clear;
ComboBox1.Items.Add('1');
ComboBox1.Items.Add('2');
ComboBox1.Items.Add('3');
ComboBox1.Items.Add('4');
end;
end;

aqui el combo1 muestra letras si en el combo2 selecciono la opcion letras y muestra numeros en otro caso

Cecil 01-08-2008 09:39:57

Pero para la creación de un componente, en el que debo de escoger una propiedad como en la captura que os he puesto, ¿que debo de usar un TCombobox?... creo que no habeis entendido mi duda. A ver si alguien mas puede ayudarme, gracias y un saludo. :D

felipe88 01-08-2008 15:23:49

Me gustaria saber como reconoceria tu componente lo que debe o no debe mostrar en esa propiedad, me explico: en el ejemplo de la tabla, tu sabes que esta viene de una consulta de la base de datos con los nombres de las tablas disponibles, ahora si tu componente no hace algo similar sino que por el contrario trae las opciones "cargadas" segun otra opcion (Ej: Combobox - Pais, Combobox - Ciudad) estas deberian estar dentro del codigo de la misma para mayor facilidad, por ejemplo asi:

Código Delphi [-]
if combo1.text = 'Deporte' then
  begin
    Combo2.Items.Add('Futbol');
    Combo2.Items.Add('Karate');
  end;
if combo1.text = 'Comida' then
  begin
    Combo2.Items.Add('Fruta');
    Combo2.Items.Add('Helado');
  end

Es una manera, no la unica :)

Delphius 01-08-2008 17:59:31

A ver... Creo que no están entendiendo lo que pregunta el compañero.
El tiene diseñado un componente y desea que una propiedad se comporte de la misma manera que la propiedad TableName de un TxxxTable.
Es decir, lo que busca es tener una propiedad publicada en la que se desplegue un combo para que en tiempo de diseño se le permita realizar una elección.

Debo admitir que en estos momentos no recuerdo si es que para ello había que declarar las propiedades de alguna manera en particular, o si es que compilador en forma automática lo realiza.

Saludos,

Cecil 01-08-2008 18:03:29

Gracias Delphius, exactamente eso es lo que quiero (lo has explicado mucho mejor que yo :D). ¿Alguien podria ayudarme con esto? Un saludo.

felipe88 01-08-2008 21:22:00

Cita:

Empezado por Delphius (Mensaje 305025)
A ver... Creo que no están entendiendo lo que pregunta el compañero.

Esta bien, esta bien... comprendenos hoy es viernes :rolleyes: :D

Yo si le entiendo, y llego a la misma duda tuya porque a decir verdad he estudiado un poco la creación de componentes pero no la he llevado a la practica, en mi humilde opinion se me ocurrio de que una idea asi pueda servir, ademas lo del TTable fue un ejemplo ;)

MaMu 16-08-2008 20:57:25

Y el procedimiento AddItem ? Como se usa?

Lepe 17-08-2008 17:39:59

Puedes usar como ejemplo el código de la VCL, pon un combobox y escribe en el editor: combobox1.items ahora haz CTRL + CLIC en la la palabra items, verás algo similar a esto:
Código Delphi [-]
type

TOpcion = (oUna, oDos, oTres);
TOpciones = set of TOpcion;

TMicomponente = class(TComponent) <<< necesario para que la lista se guarde en el dfm

private
  FItems:TStrings;
public
  constructor create(AOwner:TComponent);override;
  destructor destroy;override;
published
  property Items:TStrings read FItems write Fitems;
  property Opcion:TOpcion read Fopcion write Fopcion;
  property Opciones:TOpciones read Fopciones write Fopciones default [oUna];
end;

implementation

constructor TMiComponente.create(AOwner:TComponent);override;
begin
 inherited;
 FOpciones := [oUna];
 FItems := TStringlist.create; // hereda de TStrings así que sin problemas.
end;

destructor TMiComponente.destroy;
begin
  FItems.Free;
end;

Resumiendo:
- La propiedad se declara de tipo TStrings para que sea compatible con combobox.items , memo.lines, RichEdit.lines, etc.
- Se crea en el constructor como TStringList y dado que éste último hereda de TStrings, ya tienes compatibilidad asegurada.
- por último se libera en el destructor del componente.

Tu propiedad Items se comportará en el inspector de objetos como la propiedad Items de un TMemo. No saldrá una lista desplegable cuando el programador use tu componente.

La propiedad Opcion (al estar declarada como un tipo enumerado)será una lista desplegable en el inspector de objetos pero solo puede elegirse uno de los valores de TOpcion.

La propiedad Opciones (al estar declarada como un tipo "Set") será como el Options de un grid, que tiene un simbolo "+" que el programador puede expandir en el inspector de objetos y cada una de ellas es de tipo Boolean.

Si quieres hacer algo parecido al TColumn de un grid debes heredar de TCollection y TCollectionItem que son más potentes.

Lo que tu quieres, es si cabe lo más complicado, ya que el usuario puede escribir en esa propiedad del inspector de objetos lo que le dé la gana, y tendrás que lanzar excepciones si comete un error de tecleado. Echa una visual a los editores de propiedades en la carpeta delphi\source\..\property Editors\ no recuerdo exactamente en qué subcarpeta está. También busca en el foro, hay algo dicho.

Saludos


La franja horaria es GMT +2. Ahora son las 00:27: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