Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Evento check en un TListView

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Evento check en un TListView Responder citando

Hola, encontre este codigo en delphi, creo que hace lo que necesito, que es el evento check o uncheck del TListView, no logro traducir este codigo a builder, la verdad nunca necesite intersepatar los mensajes de windows desde builder, alguin puede ayudarme estoy usando la version 6, gracias.

Código:
uses CommCtrl;
 
 procedure TForm1.FormCreate(Sender: TObject) ;
 begin
   OriginalListViewWindowProc := ListView1.WindowProc;
   ListView1.WindowProc := ListViewWindowProcEx;
 end;
 
 procedure TForm1.ListViewWindowProcEx(var Message: TMessage) ;
 var
   listItem : TListItem;
 begin
   if Message.Msg = CN_NOTIFY then
   begin
     if PNMHdr(Message.LParam)^.Code = LVN_ITEMCHANGED then
     begin
       with PNMListView(Message.LParam)^ do
       begin
         if (uChanged and LVIF_STATE) <> 0 then
         begin
           if ((uNewState and LVIS_STATEIMAGEMASK) shr 12) <> ((uOldState and LVIS_STATEIMAGEMASK) shr 12) then
           begin
             listItem := listView1.Items[iItem];
             memo1.Lines.Add(Format('%s checked:%s', [listItem.Caption, BoolToStr(listItem.Checked, True)])) ;
           end;
         end;
       end;
     end;
   end;
   //original ListView message handling
   OriginalListViewWindowProc(Message) ;
 end;
 
 procedure TForm1.GetCheckedButtonClick(Sender: TObject) ;
 var
   li : TListItem;
 begin
   memo1.Lines.Clear;
   memo1.Lines.Add('Checked Items:') ;
   for li in listView1.Items do
   begin
     if li.Checked then
     begin
       memo1.Lines.Add(Format('%s %s %s', [li.Caption, li.SubItems[0], li.SubItems[1]])) ;
     end;
   end;
 end;



la url es http://delphi.about.com/od/delphitips2007/qt/listviewchecked.htm
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Prueba este otro código, creo que es más efectivo (aunque si no te gusta o no funciona como pensabas te puedo traducir el otro).

Declara en esa misma Unit, por ejemplo por encima del constructor:
Código:
// Añadimos dos estados más al tipo de notificación de cambio
enum TItemChange2 { ctChecked = 0x130, ctUnchecked };

Añade el siguiente código al constructor:
Código:
  struct CaptureListView
  {
    TListView* lv;
    TWndMethod OldWndProc;

    CaptureListView(TListView* lvt) : lv(lvt)
    {
      OldWndProc = lv->WindowProc;
      lv->WindowProc = WndProc130;
    }

    // Capturamos los eventos del ListView y comprobamos dos estados
    // que no están documentados en el API: LVIS_CHECKED y LVIS_UNCHECKED
    void __fastcall WndProc130(TMessage& msg)
    {
      OldWndProc(msg);
      if (msg.Msg == CN_NOTIFY) {
        LPNMLISTVIEW pnmv = (LPNMLISTVIEW)msg.LParam;
        if (pnmv->hdr.code == LVN_ITEMCHANGED && lv->OnChange && pnmv->iItem > -1) {
          if (pnmv->uNewState == 0x1000 /*LVIS_UNCHECKED*/)
            lv->OnChange(lv, lv->Items->Item[pnmv->iItem], (TItemChange)ctUnchecked);
          else if (pnmv->uNewState == 0x2000 /*LVIS_CHECKED*/)
            lv->OnChange(lv, lv->Items->Item[pnmv->iItem], (TItemChange)ctChecked);
        }
      }
    }
  };

  // Aquí añadimos los ListView de los cuales queremos capturar estos eventos
  static CaptureListView clv[] = { ListView1 /*, otroListView*/ };

Y ahora dentro del evento OnChange normal, puedes usarlo del siguiente modo:
Código:
  if (Change == ctChecked)
    ShowMessage("Checked");
  else if (Change == ctUnchecked)
    ShowMessage("Unchecked");
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo!! tu codigo va perfecto, otra pregunta referente a esto, para capturar por ejemplo el caption de item chequeado o el index, en el evento OnChange como deberia proceder.
Probe esto pero no anda:
Código:
 if (Change == ctChecked) {
    int i = ListView1->ItemIndex;
    ShowMessage( i );
//    ListView1->Items->Item[i]->Caption;
 }

Creo que se debe al foco el item que no esta alineado al momento del check.
Gracias por tu tiempo.
saludos jc
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Tor escribió:
Gracias _Leo!! tu codigo va perfecto,

De nada, me alegro de que te sirva.. Wink

Tor escribió:
para capturar por ejemplo el caption de item chequeado o el index, en el evento OnChange como deberia proceder.

En el propio evento OnChange tienes "Item", que te da directamente el elemento al que hace referencia el evento.
Código:
if (Change == ctChecked) {
    int i = Item->Index;
    ShowMessage(i);
    // ListView1->Items->Item[i]->Caption;
}

// o simplemente:

if (Change == ctChecked) {
    ShowMessage(Item->Index);
    ShowMessage(Item->Caption);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Excelente!!! pero que loco estaba ahí y no lo veía jajaj no vi el argumento TListItem *Item del evento OnChange jajaj y eso que el nombre del evento ya lo dice todo jaja.

Problema resulto, de nuevo _Leo muchisimas gracias!

saludos jc
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.