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;


+ Recent posts