Ver Mensaje Individual
  #6  
Antiguo 30-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hubiera pensado que hay una forma fácil de hacer esto, pero no la encuentro. Una opción sencilla puede ser la de ajustar las propiedades MinWidth y MaxWidth de cada columna para que coincidan con Width. De esta forma evitas que se cambie el tamaño aunque no evitas el efecto de arrastrar el borde de la columna: sigue apareciendo la línea de arrastrado y cuando la sueltas vuelve a su posición original.

Otra manera, más complicada, es interceptando el mensaje WM_NOTIFY que se manda al ListView cuando se realiza alguna operación, verificar que el mensaje corresponda a la acción BEGINTRACK y anularla.

Lo malo de esto, es que para interceptar este mensaje tienes que reemplazar el procedimiento de ventana (el que maneja todos los mensajes de una ventana) del ListView.

Aquí te pongo cómo hacerlo:

Código Delphi [-]
type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
  private
    OldLVWndProc: TWndMethod;
    procedure LVWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldLVWndProc := ListView1.WindowProc;
  ListView1.WindowProc := LVWndProc;
end;

procedure TForm1.LVWndProc(var Message: TMessage);
begin
  if (Message.Msg = WM_NOTIFY) and (TWMNotify(Message).NMHdr.code = HDN_BEGINTRACKW) then
    Message.Result := 1
  else

  OldLVWndProc(Message);
end;

El campo OldLVWndProc sirve para guardar una referencia al procedimiento original, a fin de que puedas llamarlo desde tu nuevo procedimiento. Este nuevo procedimiento lo asigna en el constructor del formulario y lo único que hace es verifcar que el mensaje corresponda al cominezo de arrastrar el borde de una columna, y, en tal caso, simplemente regresa 1 (indicando que ya se procesó el mensaje) sin llamar al procedimiento original.

Aún así, queda el "problema" de que el cursor del ratón sigue cambiando al ponerlo en el borde, como si se pudiese cambiar el tamaño.

// Saludos
Responder Con Cita