?»??»?{ ¦Û°Ê§PÂ_¬O§_»Ý­n¾î¦V±²¶b ªº ListBox } { §@ªÌ¡G¶À¥É§» 2004/11/15 } { ¦p¦³ Bug ½Ð Email to Cool.evon@msa.hinet.net } { ¡E¤¹³\§K¶O¨Ï¥Î¡C } { ¡E¤¹³\¦Û¦æ­×§ï'Evon'¹w³]ªº¤À­¶¦WºÙ¡A¦ý»Ý«O¯d¤¸¥ó¦WºÙ½Ð¤Å­×§ï¡C} unit EvListBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls,StdCtrls, Forms; type TEVListBox = class(TListBox) private fTxtWidth : Integer; UpDateTxtWdth : Boolean; procedure SetTxtWidth(Value:Integer); function GetItemWidth(Index:integer):Integer; Property TxtWidth : Integer read fTxtWidth write SetTxtWidth; protected procedure Resize; Override; procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; procedure LBADDSTRING (var Msg:TMessage);Message LB_ADDSTRING; procedure LBINSERTSTRING(var Msg:TMessage);Message LB_INSERTSTRING; procedure LBELETESTRING (var Msg:TMessage);Message LB_DELETESTRING; procedure LBRESETCONTENT(var Msg:TMessage);Message LB_RESETCONTENT; public constructor Create(AOwner: TComponent); override; published end; procedure Register; implementation procedure Register; begin RegisterComponents('Evon', [TEVListBox]); end; procedure TEVListBox.SetTxtWidth(Value:Integer); begin if Value<>fTxtWidth then Try UpDateTxtWdth := True; fTxtWidth := Value; Perform(LB_SETHORIZONTALEXTENT,fTxtWidth,0); Finally UpDateTxtWdth := False; end; end; constructor TEVListBox.Create(AOwner: TComponent); begin inherited Create(Aowner); UpDateTxtWdth := false; TxtWidth := 0; end; procedure TEVListBox.Resize; begin inherited; if Not UpDateTxtWdth then begin Perform(LB_SETHORIZONTALEXTENT,fTxtWidth,0) end; end; function TEVListBox.GetItemWidth(Index:integer):Integer; begin Result := 0; if (Index>-1) and (IndexfTxtWidth then TxtWidth := LWdth; end; procedure TEVListBox.LBINSERTSTRING(var Msg:TMessage); var LWdth : Integer; begin inherited; LWdth := GetItemWidth(Msg.WParam); if LWdth>fTxtWidth then TxtWidth := LWdth; end; procedure TEVListBox.LBELETESTRING(var Msg:TMessage); var I,LWdth,MWdth : Integer; begin MWdth := Width; inherited; if Items.Count>0 then begin For I := 0 to Items.Count-1 do begin LWdth := GetItemWidth(I); if LWdth>MWdth then MWdth := LWdth; end; TxtWidth := MWdth; end else TxtWidth := 0; end; procedure TEVListBox.LBRESETCONTENT(var Msg:TMessage); begin inherited; TxtWidth := 0; end; end.