![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TCheckBox, TRadioBox - caption
antonn © (2006-12-16 00:48:00)Наверное дурацкий вопрос, но надоело мучаться... Как в TCheckBox и TRadioBox сделать автоматическую ширину по тексту? Ну как в Tlabel autosize. Может есть простой способ, кроме как вычислять через канвас длину каншна?..
ЗЫ в проекте много сабжевых элементов, все в реалтайме меняют caption, текст иногда не влезает. А делать его заранее длинным - не красиво и не правильно.
antonn (2006-12-16 15:23:00) [1]sniknik © (16.12.06 14:37) [11]
спасибо!
про RadioBox я заговорился - TRadioButton :)
sniknik (2006-12-16 14:37:00) [2]для TCheckBox в D7 можно сделать так
перед формой вставить
type
TMyCheckBox = class(TCheckBox)
procedure SetText(const Value: TCaption);
function GetText: TCaption;
published
property Caption: TCaption read GetText write SetText;
end;
TCheckBox = class(TMyCheckBox);
TForm1 = class(TForm)
Button1: TButton;
....
и обработчики в
implementation
{$R *.dfm}
function TMyCheckBox.GetText: TCaption;
var
Len: Integer;
begin
Len := GetTextLen;
SetString(Result, PChar(nil), Len);
if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1);
end;
procedure TMyCheckBox.SetText(const Value: TCaption);
var
DC: HDC;
SaveFont: HFont;
TextSize: TSize;
begin
if GetText <> Value then begin
DC := GetDC(0);
SaveFont := SelectObject(DC, Font.Handle);
GetTextExtentPoint32(DC, PChar(Value), Length(Value), TextSize);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
SetBounds(Left, Top,
TextSize.cx + (GetSystemMetrics(SM_CXBORDER) * 4 + 15),
TextSize.cy + (GetSystemMetrics(SM_CYBORDER) * 4));
SetTextBuf(PChar(Value));
end;
end;
(скопировано из генофонда и немного "поисковерканно")
слабое место цифра 15, туда бы вставить ширину квадратика чекбокса, реальную, а не подобранную константу... на случае если меняется, при разных разрешениях/установках но это уже лень ;о), для TRadioBox тоже, можеш сделать по аналогии.
еще, естественно при таком подходе, будет работать только в модуле в котором описано.
antonn (2006-12-16 13:27:00) [3]MsGuns © (16.12.06 1:55) [2]
нет, я только меняю капшн, контейнер постоянен в размерах
Джо © (16.12.06 2:19) [6]
видимо как нибудь так и придется делать...
Anatoly Podgoretsky © (16.12.06 12:12) [8]
но "кликается"
antonn (2006-12-16 13:27:00) [4]Anatoly Podgoretsky © (16.12.06 12:12) [8]
к тому же, если текст длиннее, чем область вывода на компоненте - он обрезается
Anatoly Podgoretsky (2006-12-16 12:12:00) [5]> antonn (16.12.2006 0:48:00) [0]
Почему некрасиво и неправильно?
Невидимая часть текста - невидима.
default (2006-12-16 03:43:00) [6]а вот в .NET у CheckBox-а, например, есть свойство AutoSize
Джо (2006-12-16 02:19:00) [7]Я не вижу иного, как писать «ручками». А так уже самому выбирать, делать ли наследника он этих компонентов и перекрывать нужный метод или же вызывать особый метод после каждого изменения Caption вручную.
MsGuns (2006-12-16 02:16:00) [8]>Джо © (16.12.06 02:03) [3]
>Гм. А с чего событие OnResize у контейнера должно происходить всякий раз, когда в рантайм меняешь Caption у TCheckBox и TRadioBox?
Я понял наоборот, в смысле когда меняется размер контейнера (например, панели), надо "красиво" подгонять эдиты, комбобоксы и т.д.
Германн (2006-12-16 02:14:00) [9]
> MsGuns © (16.12.06 01:55) [2]
>
> Ширину компонент, не имеющих Align
А кто сказал, что у TCheckBox нет Align'a?
Джо (2006-12-16 02:03:00) [10]> [2] MsGuns © (16.12.06 01:55)
> Ширину компонент, не имеющих Align, надо выставлять "ручками"
> в событии OnResize контейнера, на котором они лежат.
Гм. А с чего событие OnResize у контейнера должно происходить всякий раз, когда в рантайм меняешь Caption у TCheckBox и TRadioBox?
MsGuns (2006-12-16 01:55:00) [11]Ширину компонент, не имеющих Align, надо выставлять "ручками" в событии OnResize контейнера, на котором они лежат.
antonn (2006-12-16 00:50:00) [12]пишу на Delphi 7