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

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

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

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

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

Сообщение Troublemaker »

Есть 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?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Если хочется большей свободы действий, надо выкинуть TRadioGroup, вместо него (опционально) кинуть TGroupBox, и далее создавать TRadioButton обычным порядком. При клике на радиокнопке все остальные радиокнопки, принадлежащие тому же родительскому контролу, сбрасываются (по крайней мере в Дельфи это так), т.е. работает так же, как и TRadioGroup.
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

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

Добавлено спустя 13 минут 32 секунды:
Попробовал. Всё бы ничего, но как тогда узнать, какая кнопка выбрана (itemindex-a нету) без обработки OnClick для каждой кнопки и запоминания его, как я это делал выше?
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Сообщение Attid »

я по имени различаю обычно, так как создаю к примеру bt1 bt2, а там уже по имени обращаюсь.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

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

К кнопкам, принадлежащим TRadioGroup, вообще нет доступа. Он (TRadioGroup) для того и предназначен, чтобы скрыть все подробности, оставив торчать наружу только Items и ItemIndex. В 99% случаев при рисовании GUI ничего другого и не требуется.
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

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

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

Сообщение Attid »

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

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

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

tbutton(sender).name
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

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

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

Добавлено спустя 1 час 48 минут 40 секунд:
А как насчет перепутанных (?) констант?
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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

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

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

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

Сообщение Troublemaker »

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

А вот насчет констант не понял: они действительно перепутаны или я не уловил логику?
Ответить