Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо