Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   C++ Builder (http://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Uso de TObject en un TStringList (http://www.clubdelphi.com/foros/showthread.php?t=92899)

Angel.Matilla 07-03-2018 12:21:26

Uso de TObject en un TStringList
 
Uso con relativa frecuencia (ComboBox, Listbox, etc.) el método AddObjects para poder tener dos "columnas" en estos objetos. Siempre lo había usado con enteros pero me he encontrado una sugerencia de ecfisa en otro hilo para poder poner por ejemplo un AnsiString.

Sin embargo no veo como hacer para recuperar el valro de esa "segunda columna". Hasta ahora, con valores enteros, lo hacía así por ejemplo:
Código PHP:

int nValor = (long)(Tobject *)ComboBox->Items->Objects[ComboBox->ItemIndex]; 

pero ¿cómo hago para extraer ese valor? Haciendo algo similar:
Código PHP:

AnsiString cCadena = (AnsiString)(Tobject *)ComboBox->Items->Objects[ComboBox->ItemIndex]; 

el compilador me da error.

Angel.Matilla 07-03-2018 12:57:22

Y volviendo a leer la sugerencia de ecfisa creí que había dado con la solución en:
Código PHP:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(
int i=0;i<10;i++)
  
ListBox1->Items->Add(TS->Strings[i]+ " - " +
    ((
TClase*)(TS->Objects[i]))->Cadena);


pero algo no acabo de entender. Estoy trabajando sobre un ComboBox; al fin y al cabo los ítemes definidos no dejan de ser un TStringList. Lo cargo así:
Código PHP:

TClase *Clase;

Motivo->Items->Clear();
Query->Close();
Query->SQL->Text "SELECT Literal, Codigo FROM Mensajes WHERE Texto IS NULL AND CHAR_LENGTH(TRIM(Codigo)) <> 3 ORDER BY Codigo";
Query->Open();
for (; !
Query->EofQuery->Next())
{
     
Clase = new TClase;
     
Clase->Cadena Query->FieldByName("Codigo")->AsString;
     
Motivo->Items->AddObject(Query->FieldByName("Literal")->AsString " (" Clase->Cadena ")", ((TObject *)Clase));
}
delete Clase

sin problema. Pero al tratar de rescatar el valor del TObject, para ejecutar un query, hago esto:
Código PHP:

Clase = new TClase;
Query->ParamByName("Devuelto")->AsDateTime StrToDate(Devuelto->Text);
Query->ParamByName("Motivo")->AsString     = ((TClase *)Motivo->Items->Objects[Motivo->ItemIndex]->Cadena); 

y el compilador me da un error E2316 'Cadena' is not a member of 'TObject' en esa última línea de código (Query->ParamByName("Motivo")->AsString). ¿Qué me estoy saltando?

ecfisa 07-03-2018 14:22:49

Hola.

Ejemplo:
Código PHP:

...
class 
ClassStr {
public:
  
AnsiString Cadena;
};

ClassStr *cStr;


// Cargar unos pares de cadenas
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 for(
int i=0;i<10;i++) {
  
cStr = new ClassStr;
  
cStr->Cadena "AnsiString " IntToStr(i);
  
ComboBox1->Items->AddObject("Item "+IntToStr(i), ((TObject*)cStr));
 }
}

// Mostrar ambas cadenas
void __fastcall TForm1::ComboBox1Click(TObject *Sender)
{
  
int inx ComboBox1->ItemIndex;

  if ( 
inx != -) {
    
AnsiString cadena1 ComboBox1->Text;
    
AnsiString cadena2 = ((ClassStr*)(ComboBox1->Items->Objects[inx]))->Cadena;
    
ShowMessage(cadena1 '\n' cadena2);
  }


Saludos :)

ecfisa 07-03-2018 14:39:15

Hola.

Y si deseas hacerlo usando los nuevos moldeos;
Código PHP:

  ...
  
AnsiString cadena2 reinterpret_cast<ClassStr*>(ComboBox1->Items->Objects[inx])->Cadena;
  ... 

Saludos :)

Angel.Matilla 07-03-2018 18:16:06

GRacias por las contestaciones. Voy a probarlo ahora mismo.


La franja horaria es GMT +2. Ahora son las 16:26:42.

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