 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Lun 07 Oct, 2013 3:31 pm Asunto: Evento check en un TListView |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 Oct, 2013 8:59 pm Asunto: |
|
|
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 |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Lun 07 Oct, 2013 9:43 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 Oct, 2013 9:57 pm Asunto: |
|
|
| Tor escribió: | | Gracias _Leo!! tu codigo va perfecto, |
De nada, me alegro de que te sirva..
| 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 |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Lun 07 Oct, 2013 10:21 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|