Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Fijar columnas en un TListView (https://www.clubdelphi.com/foros/showthread.php?t=84566)

Angel.Matilla 05-11-2013 13:08:15

Fijar columnas en un TListView
 
¿Qué puedo hacer para que el ancho de las columnas en un TListView no pueda cambiarse en tiempo de ejecución con el cursor del ratón cuando se muestra la cabecera de las mismas?

ecfisa 05-11-2013 14:38:50

Hola Angel.Matilla.

.h
Código:

...
class TForm1 : public TForm
{
...
private:       
  void __fastcall ListViewWindowProc(TMessage &Msg);
...

.cpp
Código:

...
TWndMethod OldListViewProc;

__fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)
{
  OldListViewProc = ListView1->WindowProc;
  ListView1->WindowProc = ListViewWindowProc;
}

void __fastcall TForm1::ListViewWindowProc(TMessage &Message)
{
  if (Message.Msg == WM_NOTIFY) {
    const NMHDR *phdr = (NMHDR*)Message.LParam;
    if((phdr->code == HDN_BEGINTRACKA) ||
      (phdr->code == HDN_BEGINTRACKW) ||
      (phdr->code == HDN_DIVIDERDBLCLICKA) ||
      (phdr->code == HDN_DIVIDERDBLCLICKW)) {
      Message.Result = TRUE;
      return;
    }
 }
 OldListViewProc(Message);
}
...

Saludos :)

Angel.Matilla 05-11-2013 17:30:48

Muchas garcias ecfisa. Funciona a la perfección salvo que me da un mensaje de error 'Cannot make a visible window modal', y eso sí que no sé como resolverlo. Estoy usando este código:
Código:

void __fastcall TfColegio::Button1Click(TObject *Sender)
{
    AnsiString cAux;
   
    Query->Close();
    Query->SQL->Text = "SELECT Formacion, Registro FROM Formacion ORDER BY Formacion";
    Query->Open();

    Application->CreateForm(__classid(TfAyuda), &fAyuda);
    for (; !Query->Eof; Query->Next())
    {
          pItem = fAyuda->Ayuda->Items->Add();
          pItem->Caption = Query->FieldByName("Formacion")->AsString;
          pItem->SubItems->Add("");
          pItem->SubItems->Add(Query->FieldByName("Registro")->AsInteger);
    }
    pItem = NULL;

    fAyuda->Refresh();
    fAyuda->ShowModal();
    delete fAyuda;
}
//---------------------------------------------------------------------------

Y es en ese fAyuda es donde he puesto el código que me indicas:
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Ayuda.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
#pragma resource "*.dfm"
TfAyuda *fAyuda;

TWndMethod OldListViewProc;
//---------------------------------------------------------------------------

__fastcall TfAyuda::TfAyuda(TComponent* Owner)
    : TForm(Owner)
{
    OldListViewProc  = Lista->WindowProc;
    Lista->WindowProc = ListViewWindowProc;
}
//---------------------------------------------------------------------------

void __fastcall TfAyuda::ListViewWindowProc(TMessage &Message)
{
    if (Message.Msg == WM_NOTIFY)
    {
          const NMHDR *phdr = (NMHDR*)Message.LParam;
          if ((phdr->code == HDN_BEGINTRACKA) || (phdr->code == HDN_BEGINTRACKW) ||
              (phdr->code == HDN_DIVIDERDBLCLICKA) || (phdr->code == HDN_DIVIDERDBLCLICKW))
          {
              Message.Result = TRUE;
              return;
          }
    }
    OldListViewProc(Message);
}
//---------------------------------------------------------------------------


ecfisa 05-11-2013 20:24:50

Hola Angel.Matilla.

Pero ese error no tiene que ver con el código para evitar el redimensionado de las columnas del ListView.
Se produce por que estas intentando mostrar el form "fAyuda" de forma modal, teniendo este último la propiedad Visible igual a True.

Saludos :)

Angel.Matilla 06-11-2013 10:24:21

Cita:

Empezado por ecfisa (Mensaje 469346)
Se produce por que estas intentando mostrar el form "fAyuda" de forma modal, teniendo este último la propiedad Visible igual a True.

Gracias por contestar. No acabo de entender esto que me dices de que la propiedad Visible es true; ¿la del form?. Además he probado con ShowModal() y con Show() y en ambos casos me da error

ecfisa 06-11-2013 13:55:00

1 Archivos Adjunto(s)
Hola.

Si, me refiero a la propiedad visible del form, eso indica el error que estas mencionando.

Te adjunto un ejemplo en el cuál podes cambiar la propiedad Visible del form antes de mostrarlo mediante un TCheckBox.

Podrás ver que se muestra correctamente de forma modal cuando la propiedad Checked del CheckBox tiene valor false y provoca una excepción de modo contrario.

Saludos :)

Angel.Matilla 06-11-2013 14:06:44

Muchas gracias.

Angel.Matilla 06-11-2013 19:19:01

Cita:

Empezado por ecfisa (Mensaje 469366)
Te adjunto un ejemplo en el cuál podes cambiar la propiedad Visible del form antes de mostrarlo mediante un TCheckBox.

Podrás ver que se muestra correctamente de forma modal cuando la propiedad Checked del CheckBox tiene valor false y provoca una excepción de modo contrario.

Una vez más muchas gracias. He probado tu código y efectivamente funciona a la perfección pero si marco el checkbox (checked = true) me da el mismo error que comentaba antes. No obstante voy a ver de adaptarlo a mi proyecto.

ecfisa 06-11-2013 19:28:58

Cita:

Empezado por Angel.Matilla (Mensaje 469377)
Una vez más muchas gracias. He probado tu código y efectivamente funciona a la perfección pero si marco el checkbox (checked = true) me da el mismo error que comentaba antes. No obstante voy a ver de adaptarlo a mi proyecto.

Hola Angel.

Así es, y el motivo de haber incluido el TCheckBox fue precisamente para que pudieras comprobar que el error se provocaba mostrando al formulario "fAyuda" de forma modal, cuando su propiedad Visible era true.

Fijate que si lo mostras de forma no modal ( fAyuda->Show() ; ), no vas a obtener ningún error ya sea que el CheckBox fije su propiedad Visible a true o false.

Saludos :)


La franja horaria es GMT +2. Ahora son las 21:57:38.

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