[Delphi] TListView Column resize event?

Pagina: 1
Acties:
  • 228 views sinds 30-01-2008
  • Reageer

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Ik vraag me af op wat voor manier je kan zien wanneer de user een column resized?

OnResize werkt niet, alleen als de TListView zelf geresized wordt. Verder heb ik niets kunnen vinden.

  • Paul
  • Registratie: September 2000
  • Laatst online: 22:49
Op woensdag 24 oktober 2001 22:49 schreef Ariejan het volgende:
Ik vraag me af op wat voor manier je kan zien wanneer de user een column resized?

OnResize werkt niet, alleen als de TListView zelf geresized wordt. Verder heb ik niets kunnen vinden.
Dat OnRezise alleen op de hele component werkt is niet zo gek, aangezien deze van TControl afkomt, en niet van TCustonListView.
Ik heb trouwens even naar nog een paar componenten gekeken (stringgrid, dbgrid) ze hebben geen van allen een OnRowRezise oid...
Waar heb je hem voor nodig? Om je progressbar te resizen? want strings en zo worden voor zover ik weet automagisch afgekapt of weer neergezet als je de row resized...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Progress bar jah... Als je 'n progressbar geklust hebt, en je vergroot de column bijvoorbeeld, dan blijf j'n kleine progressbar houden. (en dat willen we niet natuurlijk)

Ik heb zitten denken of er misschien 'n windowsmessage is die wordt gegenereerd als de resize van 'n column plaats vind. Maar, daar heb ik ook nog niks over kunnen vinden ;'(

Verwijderd

Doe zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  TMyListView = class(TListView)
  protected
    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
  end;

..

procedure TMyListView.WMNotify(var Message: TWMNotify);
begin
  inherited;
  with PHDNotify(Message.NMHdr)^ do
    case Hdr.Code of
    HDN_ITEMCHANGED:
      if (PItem^.mask and HDI_WIDTH) <> 0 then
        DoIetsMetColumn(Item);
    end;
  end;
end;

Je kunt ook op een HDN_ENDTRACK reageren geloof ik...

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Dat klinkt heel nuttig, alleen heb ik niet echt ervaring met het inmekaar hacken van m'n eigen components.

Nouja, ik zal er eens mee aan de gang gaan, hopen dat 't lukt.

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Met m'n mooie delphi boekje heb ik 'n component gelust, en er 'n standaard TNotifyEvent in gehackt, alleen nu is 't zo dat m'n Delphi 6, jouw PHDNotify een undeclared identifier vind. OP die manier werkt de rest ook niet dus.

Waar komt die PHDNotify vandaan?? Moet ik die nog includen via uses?

Als je de source-code van de TMyListView wilt zien (derived va TListView) moet je maar even 'n reply posten.

(BTW. Eindelijk wat Delphi hackers gevonden... thanks!)

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Ben ik sietsofreen ofzo?? Ik loop nogal in mezelf te praten, niet?

Nou ja, ik ben er nu dus achter dat als ik ook nog commctrl bij uses zet, ie wel compiled. En zelfs 'n hoop events maakt op de OnColumnResize die ik nu heb.

Oftewel: 't worked!!!

HDN_ENDTRACK is bruikbaarder omdat deze alleen fired nadat 'n column geresized is. (Dus minder vaak fired, dus sneller is.)

Hier de code, voor evt. mensen die gaan zoeken in GoT:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
unit MyListView1;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl;

type
  TMyListView1 = class(TListView)
  private
    { Private declarations }
    FOnColumnResize : TNotifyEvent;
  protected
    { Protected declarations }
    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
    procedure doColumnResize; virtual;
  public
    { Public declarations }
  published
    { Published declarations }
    property OnColumnResize: TNotifyEvent
    read FOnColumnResize write FOnColumnResize;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyListView1]);
end;

procedure TMyListView1.WMNotify(var Message: TWMNotify);
begin
  inherited;
  with PHDNotify(Message.NMHdr)^ do
    case Hdr.Code of
    HDN_ENDTRACK:
      if (PItem^.mask and HDI_WIDTH) <> 0 then
        doColumnResize;
    end;
end;

procedure TMyListView1.doColumnResize;
begin
     if Assigned(FOnColumnResize) then FOnColumnResize(self);
end;

end.

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Kon je niet gewoon OnMouseUp gebruiken? Of zit die er niet bij

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Kan wel, maar dan moet je zelf nog uit gaan zoeken waar die mouseup plaats vond, en of er dan ook echt wel een column geresized werd.

Nu weet je dat zeker, er is een columngeresized, en dus kun je bv. 'n progressbar in zo'n columnt scalen.

Verwijderd

Op donderdag 25 oktober 2001 zat Ariejan tegen zichzelf te praten:
Toch veel leuker om het zelf te bedenken of niet :)

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 02-09 16:31
Da's waar, maar ik zit meestal dan 'n hele tijd te kijken en te kijken.. lukt 't gewoon niet.. en dan post ik 't hier.

En dan na even 'n reply posten, heb ik 'n helder moment.. en dan lukt 't soms wel. vandaar.

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Op donderdag 25 oktober 2001 23:40 schreef Bigs het volgende:
Kon je niet gewoon OnMouseUp gebruiken? Of zit die er niet bij
De oplossing die je nu hebt is idd wel een stuk netter natuurlijk ja :)
Pagina: 1