Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Seleccionar un ítem de un ListView (https://www.clubdelphi.com/foros/showthread.php?t=85952)

Angel.Matilla 30-05-2014 12:54:18

Seleccionar un ítem de un ListView
 
Tengo este formulario con un TListView.

y este código:
Código:

void __fastcall TfSelMun::ListaSelectItem(TObject *Sender, TListItem *Item, bool Selected)
{
    pItem = NULL;
    Button1->Enabled = false;
    if (Selected)
    {
          pItem = Item;
          Button1->Enabled = true;
    }
}
//---------------------------------------------------------------------------

pItem es un TListItem. Acabo de darme cuenta que no está funcionando bien.

Al seleccionar un ítem del ListView y pasar por la función el valor de Item de la llamada es el correcto (por ejemplo el de la imagen, VALETIN (COAÑA)), pero al pasar la línea pItem = Item en la variable pItem no está ese valor si no el del primer elemento de la tabla, no sé si he sabido explicarme; aparece esto:
Cita:

Item->Caption = "VALETIN (COAÑA)";
pItem->Caption = "ASTAS";¿Qué estoy haciendo mal?

ecfisa 30-05-2014 13:56:26

Hola Angel.Matilla.

En la parte veo de tu código no estas haciendo nada mal.

Si comparas los valores de la propiedad Caption inmediatamente después de la asignación,
Código:

pItem = Item;
veras que son iguales.

Para verificar lo que te comento, hacé esta simple prueba en el evento OnSelectItems del TListView:
Código:

...

void __fastcall TForm1::ListView1SelectItem(TObject *Sender,
      TListItem *Item, bool Selected)
{
  pItem = Selected ? Item : NULL;
  if (Selected) ShowMessage(Item->Caption+" "+pItem->Caption);
}

Saludos :)

Angel.Matilla 30-05-2014 18:05:16

Gracias por la respuesta pero algo no funciona bien. Con el código que me has sugerido tengo esto:



Esto está sacado con el depurador una vez que se ha ejecutado la línea pItem = Selected ? Item : NULL;, y como pudes ver el caption de ambos elementos es distinto. He cambiado algo en el código desde el que llamo a este formulario, que es una pantalla de ayuda; ahora está así:
Código:

Application->CreateForm(__classid(TfSelMun), &fSelMun);
for (; !fSocios->Query->Eof; fSocios->Query->Next())
{
    pItem = fSelMun->Lista->Items->Add();
    pItem->Caption = fSocios->Query->FieldByName("Poblacion")->AsString;
    pItem->SubItems->Add(fSocios->Query->FieldByName("CodPostal")->AsString);
}

fSelMun->Lista->Items->Item[0]->Selected = true;
fSelMun->Lista->Selected->MakeVisible(true);
pItem = NULL;

if (fSelMun->Lista->Items->Count > 1)
    fSelMun->ShowModal();

if (pItem != NULL)
{
    if (Cpostal->Text.IsEmpty())
          Cpostal->Text = pItem->SubItems->Strings[0];
    Poblacion->Text = pItem->Caption;
}
delete fSelMun;

Y el cóigo en ese formulario fSelMun está así:
Código:

void __fastcall TfSelMun::ListaSelectItem(TObject *Sender, TListItem *Item, bool Selected)
{
    Button1->Enabled = false;
    pItem = Selected ? Item : NULL;

    if (Selected)
          Button1->Enabled = true;
}

Lo cierto es que si denjo la línea del ShowMessage para comprobar los valores puedo ver esto:



Siendo ese el registro que está realmente seleccionado en el ListView, pero cuando vuelvo al formulario desde el que se ha llamado ¡pItem viene vacío! He probado usando una variable auxiliar y curiosamente me funciona bien, pero es ya más una cuestión de orgullo.

ecfisa 30-05-2014 18:24:33

Hola Angel.Matilla.
Cita:

Esto está sacado con el depurador una vez que se ha ejecutado la línea pItem = Selected ? Item : NULL;, y como pudes ver el caption de ambos elementos es distinto.
Sin embargo debo insistir que la divergencia de valores se produce en otro punto del programa y no inmediatamente después de la asignación.

Copié los datos de tu imágen en un TListView y usando el código que te sugerí en el evento OnSelectItem, en todos los casos la propiedades Caption de Item y pItem se corresponden.

Te ajunto el código fuente de la prueba para que lo revises con tranquilidad.

Saludos :)

Angel.Matilla 30-05-2014 18:32:53

Estoy de acuerdo en tu idea, pero no soy capaz de ver dónde ocurre. No obstante, y como ves en la última imagen que he subido, sí tienen el mismo valor. Voy a probar definiendo un TLisItem sólo para ese módulo y, por supuesto, miraré tú código con lupa ;)

Angel.Matilla 30-05-2014 18:50:24

Vale. Creo que ya lo solucioné. El problema reside en un error de concepto mío: para "ahorrarme" tiempo defino una serie de variables auxiliares que uso indistintamente en diversos sitios de la aplicación. Lo que pasa es que a veces esas variables que uso en un formulario tiene en otro que está debajo otro valor que es el que se recupera al volver a él. Lo he arreglado definiendo una varable en el formulario donde se me daba el problema.

ecfisa 30-05-2014 18:51:34

Hola Angel.Matilla.

Otra cosa que podrías revisar es el ámbito de la variable pItem, ¿Algún otro form que TfSelMun tiene acceso a ella ?

Saludos :)

Angel.Matilla 30-05-2014 19:04:17

Cita:

Empezado por ecfisa (Mensaje 477045)
Otra cosa que podrías revisar es el ámbito de la variable pItem, ¿Algún otro form que TfSelMun tiene acceso a ella ?

Sí. Eso tengo que cambiarlo; es una mala manía mía.


La franja horaria es GMT +2. Ahora son las 15:33:43.

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