TListBox 를 사용하는 코드 전에 TListBox 의 type 을 재정의 해준다.
http://tinydew4.tistory.com/77 의 자동화 버전
uses
Vcl.StdCtrls;
type
TListBox = class(Vcl.StdCtrls.TListBox)
private
FMaxWidth: Integer;
protected
procedure WndProc(var Message: TMessage); override;
end;
implementation
procedure TListBox.WndProc(var Message: TMessage);
var
iTextWidth: Integer;
procedure ItemAdded(AValue: PChar);
begin
iTextWidth := Canvas.TextWidth(AValue);
if iTextWidth > FMaxWidth then begin
InterlockedExchange(FMaxWidth, iTextWidth);
Perform(LB_SETHORIZONTALEXTENT, FMaxWidth + 2, 0);
end;
end;
procedure ItemDeleted(AItemIndex: Integer);
var
iMaxWidth: Integer;
I: Integer;
begin
if (0 > AItemIndex) or (AItemIndex >= Items.Count) then
Exit;
iTextWidth := Canvas.TextWidth(Items.Strings[AItemIndex]);
if iTextWidth < FMaxWidth then
Exit;
iMaxWidth := 0;
for I := 0 to Pred(Items.Count) do begin
if I <> AItemIndex then begin
iTextWidth := Canvas.TextWidth(Items.Strings[I]);
if iTextWidth > iMaxWidth then
iMaxWidth := iTextWidth;
end;
end;
if iMaxWidth <> FMaxWidth then begin
InterlockedExchange(FMaxWidth, iMaxWidth);
Perform(LB_SETHORIZONTALEXTENT, FMaxWidth + 2, 0);
end;
end;
begin
if (Message.Msg = LB_ADDSTRING) or (Message.Msg = LB_INSERTSTRING) then begin
ItemAdded(PChar(Message.LParam));
end else if Message.Msg = LB_DELETESTRING then begin
ItemDeleted(Message.WParam);
end else if Message.Msg = WM_CREATE then begin
InterlockedExchange(FMaxWidth, 0);
end;
inherited;
end;
'Windows > RAD Studio' 카테고리의 다른 글
프로세스 종료 (0) | 2015.09.08 |
---|---|
DLL 기본 주석 문구 해석 (0) | 2015.05.13 |
[Win32] 메모리 사용량 확인 (0) | 2015.05.06 |
[C++, Win32] Thread safe FreeAndNil (0) | 2015.04.28 |
[DEL] 논리드라이브 클러스터 크기 확인 (Win32) (0) | 2015.04.21 |