TRadioGroup и созданные программно TRadioButton-ы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TRadioGroup и созданные программно TRadioButton-ы

Сообщение Troublemaker » 17.05.2008 20:47:24

Есть TRadioGroup, созданная в дизайнере. В ней нет ни одной кнопки - кнопки в нужном количестве будут создаваться в рантайме в зависимости от желания моей левой пятки:

T_QuestionKind=(qkOneChoice,qkString,qkNumber,qkReorder) - перечислимый тип, RGQ_Kind:TRadioGroup, Q_Buttons:array of TRadioButton, cQKhint и cQKname - константы-массивы array[T_QuestionKind] of string - тексты хинтов и подписей для каждой кнопки, Lasts.QKindSelected переменная из ini-файла
Код: Выделить всё
procedure TEditForm.Init_QType;
var i:T_QuestionKind;
begin
  for i:=Low(T_QuestionKind) to High(T_QuestionKind) do begin
    Q_buttons[i]:=TRadioButton.Create(RGQ_Kind);
    with Q_buttons[i] do begin
      Width:=cDefRButHeight;
      Height:=cDefRButHeight;
      Hint:=cQKhint[i];
      Visible:=true;
      TabOrder:=ord(i);
      Caption:=cQKname[i];
      Parent:=RGQ_Kind;
      OnClick:=@RGQ_KindClick;
    end;
  end;
  RGQ_Kind.Height:=(ord(High(T_QuestionKind))+2)*cDefRButHeight; //растягиваем в высоту
  Q_buttons[T_QuestionKind(Lasts.QKindSelected)].Checked:=true;
end;

Кнопки создаются, однако RGQ_Kind.items.count=0, и при выборе одной из кнопок RGQ_Kind.itemindex не меняется, оставаясь =-1.
Если же созданные кнопки добавлять через RGQ_Kind.items.AddObject, то пропадают дополнительные свойства кнопок - OnCLick, Hint и что-то еще.

Замена Parent на Owner или их совместное использование ничего не меняет.

Временный выход из положения нашелся использованием TabOrder с его запоминанием в отдельной переменной в функции OnClick, но что-то мне это не нравится, явно должен быть более ортодоксальный способ.

Прошерстил хелп по Д-7, нашел только упоминание о создании кнопок в дизайнере и ничего на тему их создания в рантайме.

Any suggestions?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Sergei I. Gorelkin » 17.05.2008 20:56:47

В TRadioGroup кнопки добавляются путем изменения свойства Items (типа TStrings, т.е. по сути можно задавать только надписи кнопок, все остальное TRadioGroup делает самостоятельно).

Если хочется большей свободы действий, надо выкинуть TRadioGroup, вместо него (опционально) кинуть TGroupBox, и далее создавать TRadioButton обычным порядком. При клике на радиокнопке все остальные радиокнопки, принадлежащие тому же родительскому контролу, сбрасываются (по крайней мере в Дельфи это так), т.е. работает так же, как и TRadioGroup.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Troublemaker » 17.05.2008 21:12:56

Sergei I. Gorelkin писал(а):все остальное TRadioGroup делает самостоятельно
Из этого и следует, что я не могу назначить для отдельной кнопки hint, OnClick и т.п.?
Хорошо, попробую с groupbox, может полегчает. Но какое же низкое коварство! :)

Добавлено спустя 13 минут 32 секунды:
Попробовал. Всё бы ничего, но как тогда узнать, какая кнопка выбрана (itemindex-a нету) без обработки OnClick для каждой кнопки и запоминания его, как я это делал выше?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение alexs » 17.05.2008 23:24:34

Для всех кнопок делай общий OnClick, а различай их по проперте Tag - она для этого и предназначена. Т.е. Когда создавал свою группу кнопок - присваивай Tag у каждой кнопки уникальное значение. Вот потом и разберёш по этому значению - что кликнули.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Attid » 17.05.2008 23:59:15

я по имени различаю обычно, так как создаю к примеру bt1 bt2, а там уже по имени обращаюсь.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Sergei I. Gorelkin » 18.05.2008 01:04:43

Ну и еще можно смотреть на свойство Checked (должно быть True только у одной кнопки, но для ее определения придется перебирать все кнопки в цикле).

Troublemaker писал(а):Из этого и следует, что я не могу назначить для отдельной кнопки hint, OnClick и т.п.?

К кнопкам, принадлежащим TRadioGroup, вообще нет доступа. Он (TRadioGroup) для того и предназначен, чтобы скрыть все подробности, оставив торчать наружу только Items и ItemIndex. В 99% случаев при рисовании GUI ничего другого и не требуется.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Troublemaker » 18.05.2008 07:04:03

alexs писал(а):различай их по проперте Tag
См. первое сообщение - я их различал по табордеру.
Sergei I. Gorelkin писал(а):К кнопкам, принадлежащим TRadioGroup, вообще нет доступа. Он (TRadioGroup) для того и предназначен,
О! Теперь всё встало на свои места.
Attid писал(а):создаю к примеру bt1 bt2, а там уже по имени обращаюсь
Э-э? Проверяешь имя в онклике или как?

Кстати, коллеги, такой вопрос. По предложению Sergei I. Gorelkin заменил rgroup на group. И обнаружил странность: если у групбокса включить AutoSize, то при ChildSizing.Layout=cclTopToBottomThenLeftToRight и контролов_в_строке=1, кнопки располагаются в одну строку.
lazarus-groupbox-TTBTLTR.jpg
Хотя, как я понимаю, Top To Bottom Then Left To Right переводится как "сверху вниз и слева направо", то есть кнопки должны выстроиться в столбец.
И наоборот, при ChildSizing.Layout=cclLeftToRightThenTopToBottom кнопки прекрасно выстраиваются в столбец.
lazarus-groupbox-LTRTTTB.jpg

Это константы перепутаны или у меня с логикой что-то не то?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Attid » 18.05.2008 12:06:37

Troublemaker писал(а):См. первое сообщение - я их различал по табордеру.

не гламурно =) сменится табордер и оппа, как бы не надо лисапеды изобретать.

Troublemaker писал(а):Э-э? Проверяешь имя в онклике или как?

tbutton(sender).name
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Troublemaker » 18.05.2008 13:16:48

Attid писал(а):сменится табордер и оппа

И снова см. первое сообщение - табордер я назначаю сам.
Но тэг, не спорю, лучше.

Добавлено спустя 1 час 48 минут 40 секунд:
А как насчет перепутанных (?) констант?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Attid » 19.05.2008 10:42:17

Troublemaker писал(а):А как насчет перепутанных (?) констант?

ну если прог путает кнопы тут трудно помочь =)

просто вот придумают через 2 версии что табордер при назначаении будет по другому себя вести и оппа. я не спорю что так можно, и что не будет работать, но собаку выгуливать надо за поводок, а не за хвост.

потом этот пример какой нибуть школьник прочитает захерачит в одно месте так, потом увидит что ОК нажимается не в той последовалености, потом будет плакать на форуме что глючный лазарус не так как работает как ему хочется.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: TRadioGroup и созданные программно TRadioButton-ы

Сообщение Troublemaker » 19.05.2008 11:30:17

Attid писал(а):вот придумают через 2 версии что табордер при назначаении будет по другому себя вести и оппа
Так я ж и сказал, что тэг - лучше, табордер предназначен для другого. Переправил табордер на тэг, как ты и предложил.

А вот насчет констант не понял: они действительно перепутаны или я не уловил логику?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru