Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Items y AddObject (https://www.clubdelphi.com/foros/showthread.php?t=93013)

Angel.Matilla 20-04-2018 10:03:47

Items y AddObject
 
Estoy usando este código:
Código:

for (; Query->Eof; Query->Next())
    ComboBox1->Items->AddObject(Query->Fields->FieldByNumber(1)->AsString, (TObject *)Query->Fields->FieldByNumber(2)->AsInteger);

para asociar valores a los elementos de un ComboBox. Me surge una duda: ¿Cómo se puede saber si un ComboBox tiene asociado un objeto?

duilioisola 20-04-2018 14:34:10

En Delphi lo puedes saber mediante Assigned(Puntero_a_Objeto);
Lo que hace es compararlo con nil.

Supongo que habrá algo parecido en C.

Código Delphi [-]
Lista.AddObject('Descripcion', Pointer(Objeto));
...
// Verifico si hay asignado un objeto en el item seleccionado
if (Assigned(Lista.Items.Objects[Lista.ItemIndex])) then

Angel.Matilla 20-04-2018 18:16:19

Gracias por la respuesta. He estado mirando en la ayuda de Builder y no he visto, o no he sido capaz de localizar, para un ComboBox ningún método Assigned asociado a alguna de su propiedades. En el formulario "relleno" así los TComboBox y en las tablas de la base de datos guardo el valor del objeto, pero a la hora de recuperar el registro de la tabla no se me ocurre como localizar ese objeto.

Vale, podría hacer un bucle for...next hasta encontrarlo; tampoco sería demasiado problema porque tampoco son tantos los registros que van a tener los ComboBox, pero si hubiera un método parecido al IndexOf de un TStringList sería más fácil.

Caminante 20-04-2018 18:34:57

Hola

Cita:

Empezado por Angel.Matilla (Mensaje 525783)
.... no he visto, o no he sido capaz de localizar, para un ComboBox
ningún método Assigned asociado a alguna de su propiedades...

Assigned es una funcion de delphi no esta asociado a ningun control. Pero en tal caso igual te sirve hacer una comparacion con NIL.

Saludos

Angel.Matilla 20-04-2018 18:42:23

Gracias por la aclaración. Entiendo el concepto con el que trabaja esta función per como Assigned no hay nada en Builder; hay AssignedValues (TColumn), AssignedField y AssignedFiedValue (TParam) y AssignedHelPSelector (IHelpSystem).

ecfisa 20-04-2018 19:20:34

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 525777)
Estoy usando este código:
Código:

for (; Query->Eof; Query->Next())
    ComboBox1->Items->AddObject(Query->Fields->FieldByNumber(1)->AsString, (TObject *)Query->Fields->FieldByNumber(2)->AsInteger);

para asociar valores a los elementos de un ComboBox. Me surge una duda: ¿Cómo se puede saber si un ComboBox tiene asociado un objeto?

La propiedad Objects deriva de TCustomCombo (de tipo TStrings) y no posee un contador por lo que, para saber si el combo tiene asociado algún objeto, necesitas comprobar cada uno de los Items como te sugiere duilioisola.

Dos opciones similares:
Código PHP:

// (podrías retornar un int si deseas saber cuantos objetos hay)
bool ComboHaveObjects(TComboBoxCB)
{
  for (
int i 0CB->Items->Counti++)
    if (
CB->Items->Objects[i])
      return 
true;
  return 
false;
}

// Ejemplo de uso:
 
if (ComboHaveObjects(ComboBox1))
    
ShowMessage("ComboBox1 tiene objetos asociados");
  else
    
ShowMessage("ComboBox1 no tiene objetos asociado"); 

Código PHP:

class TComboBoxHack:public TComboBox
{
public:
  
bool haveObjects(void);
};

bool TComboBoxHack::haveObjects(void)
{
  for (
int i 0Items->Counti++)
    if ( 
Items->Objects[i] )
      return 
true;

  return 
false;
}

// Ejemplo de uso:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if (!(
static_cast<TComboBoxHack*>(ComboBox1))->haveObjects())
   
ShowMessage("ComboBox1 no tiene un objeto asociado");
 else
   
ShowMessage("ComboBox1 tiene objetos asociados");


Ahora, si cada Item si o si tendrá un objeto asociado, y deseas saber si no tiene ninguno mas simple es:
Código PHP:

  if (ComboBox1->Items->Count == 
    
ShowMessage("ComboBox1 no tiene objetos asociados"); // obviamente...

  // si el combo se vacía (Clear) antes de su carga, también es válido:
  
if (Query->IsEmpty())
    
ShowMessage("ComboBox1 no tiene objetos asociados"); 

Saludos :)

Angel.Matilla 21-04-2018 09:38:54

Gracias por las respuestas. Intuía que era algo así, pero no encontraba documentación.


La franja horaria es GMT +2. Ahora son las 01:54:09.

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