Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Buscar un TObject en un ComboBox (https://www.clubdelphi.com/foros/showthread.php?t=93300)

Angel.Matilla 26-07-2018 13:31:59

Buscar un TObject en un ComboBox
 
Buenas. Vuelvo a la carga con los ComboBox y el método AddObject. Ya en otro hilo pregunté, y al final me salió bien, como localizar un objeto cargado con un int en un ComboBox con este código:
Código PHP:

ComboBox1->ItemIndex ComboBox1->Items->IndexOfObject((TObject*)fMenu->Query->FieldByName("Zona")->AsInteger); 

Ahora tengo otro problema. Tengo otro ComboBox en el que el AddObject se hace con un AnsiString, lo que hago gracias al código que me pusisteis en Uso de TObject en un TStringList, pero ahora no sé como hacer para encontrar ese valor que he cargado a partir del resultado de un query. He probado esto:
Código PHP:

Clase = new TClase;
Clase->Cadena fMenu->Query->FieldByName("Pais")->AsString;
ComboBox2->ItemIndex ComboBox2->Items->IndexOfObject((TObject*)Clase); 

pero me devuelve siempre -1 y por lo tanto no muestra nada. Y el campo que quiero buscar sí devuelve información.

ecfisa 26-07-2018 19:42:51

Hola.

Es que la nueva instancia creada para la búsqueda, no es igual a la buscada (aunque coincida el atributo Cadena), revisa si te sirve de este modo:
Código PHP:

int searchStrOnObj(TComboBox *CB, const AnsiString str)
{
  
int i;
  
AnsiString s "";

  for ( 
0!= str && CB->Items->Counti++ )
    
= ((TClase*)CB->Items->Objects[i])->Cadena;

  return 
i-1;


Ejemplo de uso:
Código PHP:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
int inx searchStrOnObj(ComboBox1Query->FieldByName("Pais")->AsString);
  
TClase *cl reinterpret_cast<TClase*>(ComboBox1->Items->Objects[inx]);

  
ShowMessage(ComboBox1->Items->Strings[inx]+"\n"+cl->Cadena);


Saludos :)

Angel.Matilla 27-07-2018 10:16:16

¡Perfecto! Muchísimas gracias.

Angel.Matilla 31-07-2025 10:27:04

Estoy teniendo un problema que no sé como resolver. Hace unos meses se me infectó el ordenador con un virus y me borró un montón de carpetas; gracias a un buen amigo pude rescatar gran parte de la que se había borrado pero algunos ficheros quedaron tocados, entre ellos varios fuentes de algunos proyectos.

Cuando hace unos años planteé este hilo, ecfisa me dio una solución estupenda que me funcionó a la perfección, pero cuando he ido a usarla en un nuevo proyecto, al compilar ese mismo código:
Código:

int searchStrOnObj(TComboBox *CB, const AnsiString str)
{
  int i;
  AnsiString s = "";

  for ( i = 0; s != str && i < CB->Items->Count; i++ )
    s = ((TClase*)CB->Items->Objects[i])->Cadena;

  return i-1;
}

Builder me devuelve un error:
Cita:

[C++ Error] Funciones.cpp(1763): E2451 Undefined symbol 'TClase'
Como tal vez uno de los ficheros que se llevó por delante el virus es donde hacía la definición de ese TClase*, no sé si me falta algo más para eliminar ese error. ¿Podéis ayudarme?

escafandra 13-08-2025 00:28:55

Usas TClase para realizar un casting del puntero CB->Items->Objects[i])->Cadena. Esa definición de TClase debe set tuya. Ahora bien, no se si en Cadena estas guardando un puntero. Ni no es así, el casting no va a funcionar correctamente aunque compile. Eso sólo lo sabes tú.


Saludos.

Angel.Matilla 13-08-2025 11:58:32

Cita:

Empezado por escafandra (Mensaje 567036)
Usas TClase para realizar un casting del puntero CB->Items->Objects[i])->Cadena. Esa definición de TClase debe set tuya. Ahora bien, no se si en Cadena estas guardando un puntero. Ni no es así, el casting no va a funcionar correctamente aunque compile. Eso sólo lo sabes tú.


Saludos.

El problema, como comentaba, es que el código lo he cogido de otro proyecto que tenía que se vio muy afectado por un virus (varios ficheros quedaron prácticamente destruidos) y no sé como hacer la definición de ese TClase porque no lo recuerdo; ese es el verdadero problema: que no recuerdo como hacer la definición.

escafandra 13-08-2025 20:09:59

Tendrás que diseñarla según tu necesidad actual. Quizás una estructura de datos... Pero si te hace falta la definición perdida, tendrás que investigar en tu código recuperado y ver como la usabas, sus propiedades y funciones miembro. A partir de ahí, reescribirla entera.


Saludos.

Angel.Matilla 18-08-2025 10:43:03

Cita:

Empezado por escafandra (Mensaje 567060)
Tendrás que diseñarla según tu necesidad actual. Quizás una estructura de datos... Pero si te hace falta la definición perdida, tendrás que investigar en tu código recuperado y ver como la usabas, sus propiedades y funciones miembro. A partir de ahí, reescribirla entera.


Saludos.

Gracias pro la respuesta. Ahí justo está el problema: que donde tenía hecha la definición es uno de los ficheros que se llevó por delante el virus y no recuerdo como la definí. Sé que lleva un AnsiString porque es lo que uso para hacer las búsquedas, y estoy casi seguro que sólo tiene esa definición.

Angel.Matilla 18-08-2025 10:55:06

Cita:

Empezado por escafandra (Mensaje 567060)
Tendrás que diseñarla según tu necesidad actual. Quizás una estructura de datos... Pero si te hace falta la definición perdida, tendrás que investigar en tu código recuperado y ver como la usabas, sus propiedades y funciones miembro. A partir de ahí, reescribirla entera.


Saludos.

¡No he dicho nada! Estaba empeñado en que lo había definido en un fichero y al final lo he encontrado en otro. Muchas gracias por la ayuda y perdona por las molestias.


La franja horaria es GMT +2. Ahora son las 06:51:21.

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