Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

OffsetRect(R, (Glyph.Width-R.Right) DIV 2, (Glyph.Height - R.Bottom) DIV 2);

DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R, DT_CENTER OR DT_WORDBREAK);

 END;

END;

procedure TForm1.ChgSpeedButton(Sender: TObject);

VAR

R : TRect;

 N : Integer;

 Buff : ARRAY[0..255] OF Char;

BEGIN

 WITH SpeedButton1 DO BEGIN

Glyph.Canvas.Font := Self.Font;

Glyph.Width := Width-6;

Glyph.Height := Height-6;

R := Bounds(0,0,Glyph.Width,0);

StrPCopy(Buff, Caption);

Caption := '';

DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,DT_CENTER OR DT_WORDBREAK OR DT_CALCRECT);

OffsetRect(R, (Glyph.Width-R.Right) DIV 2, (Glyph.Height - R.Bottom) DIV 2);

DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,DT_CENTER OR DT_WORDBREAK);

 END;

END;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

 Close;

end;

end.

– Dennis Passmore

ComboBox 

Хочу

реализовать правильный выпадающий контрол (combo). Как это сделать?

Nomadic отвечает:

Когда-то потратил немало времени на разбор, как же все таки работают дропдаун-контролы. В итоге мной был написан маленький юнит, который я положил у себя в каталоге Demo для ознакомления интересующихся. Он маленький (его основная задача — показать принцип работы, а все остальное — как реализуешь), я думаю, что большинству он пригодиться, поэтому публикую здесь. Касательно твоего вопроса - реализуй вместо листбокса выпадающий контрол, который даст тебе функциональность дерева.

unit edit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

 TPopupListbox = class(TCustomListbox)

 protected

procedure CreateParams(var Params: TCreateParams); override;

procedure CreateWnd; override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;

 end;

 TTestDropEdit = class(TEdit)

 private

FPickList: TPopupListbox;

procedure CMCancelMode(var Message: TCMCancelMode); message CM_CancelMode;

procedure WMKillFocus(var Message: TMessage); message WM_KillFocus;

 protected

procedure CloseUp(Accept: Boolean);

procedure DropDown;

procedure WndProc(var Message: TMessage); override;

 public

constructor Create(Owner: TComponent); override;

destructor Destroy; override;

 end;

implementation

{ TPopupListBox }

procedure TPopupListBox.CreateParams(var Params: TCreateParams);

begin

 inherited;

 with Params do begin

Style := Style or WS_BORDER;

ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;

WindowClass.Style := CS_SAVEBITS;

 end;

end;

procedure TPopupListbox.CreateWnd;

begin

 inherited CreateWnd;

 Windows.SetParent(Handle, 0);

 CallWindowProc(DefWndProc, Handle, WM_SETFOCUS, 0, 0);

end;

procedure TPopupListbox.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 inherited MouseUp(Button, Shift, X, Y);

 TTestDropEdit(Owner).CloseUp((X >= 0) and (Y >= 0) and (X < Width) and (Y < Height));

end;

{ TTestDropEdit }

constructor TTestDropEdit.Create(Owner: TComponent);

begin

 inherited Create(Owner);

 Parent := Owner as TWinControl;

 FPickList := TPopupListbox.Create(nil);

 FPickList.Visible := False;

Поделиться с друзьями: