C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TRadioGroup
ZDV
Отправлено: 04.03.2006, 14:26


Ученик-кочегар

Группа: Участник
Сообщений: 19



Можно ли сделать вертикальный ScrollBar в TRadioGroup ?
Мне нужно отображать список, где сбоку каждого элемента находится RadioButton и, если список очень большой, без ScrollBar'а получается полная ерунда. Если нельзя сделать ScrollBar, то можно ли сделать как-то по другому?
Aptem
Отправлено: 04.03.2006, 14:55


Мастер участка

Группа: Участник
Сообщений: 349



Поместите на форму ScrollBox, а уже на него накидайте RadioButton.
ZDV
Отправлено: 04.03.2006, 16:34


Ученик-кочегар

Группа: Участник
Сообщений: 19



У меня список меняется после нажатия кнопки.
Как удалить старые и добавить новые элементы
списка в ScrollBox'е?
ZDV
Отправлено: 04.03.2006, 18:52


Ученик-кочегар

Группа: Участник
Сообщений: 19



Закидываю на ScrollBox RadioButton'ы. Вот код:
...
Query->Open();
TRect myRect;
int Left;
int Width;
int Height;
int Top;
myRect = ScrollBox->ClientRect;
TRadioButton *rb;
Left = myRect.left + 3;
Width = myRect.right — myRect.left;
Height = 20;
Top = 3;
Query->First();
rb = new TRadioButton(this);
rb->Parent = (TWinControl *)ScrollBox;
rb->Top = Top;
rb->Left = Left;
rb->Width = Width;
rb->Height = Height;
rb->Caption = Query->FieldByName("Caption")->AsString.Trim();

Top = rb->Top + Height + 1;
Query->Next();
for(int i = 1; i < Query->RecordCount; i++){
TRadioButton *rb;
rb = new TRadioButton(this);
rb->Parent = (TWinControl *)ScrollBox;
rb->Top = Top;
rb->Left = Left;
rb->Width = Width;
rb->Height = Height;
rb->Caption = Query->FieldByName("Caption")->AsString.Trim();
Top = rb->Top + Height + 1;
Query->Next();
}

Как мне после этого получить доступ к этим компонентам???????
Grigoriy
Отправлено: 04.03.2006, 21:22


Мастер участка

Группа: Участник
Сообщений: 381



Я предлагаю такой код.

Функция...
CODE

void Create_Group_RadioButton_On_Parent(TRadioButton** &rb,TWinControl* Parent1,TStringList* Captions,int n, int gk, int vk, int rg, int rv, int w, int h, int topg, int leftg)
{
int i;
int temptop, templeft;
int cgk,cvk;
cgk=gk;
cvk=vk;
temptop=topg;
templeft=leftg;
rb=(TRadioButton**)malloc(4*n);
for (i=0;i<n;i++)
{
rb[i]= new TRadioButton(Parent1);
rb[i]->Parent = (TWinControl *)Parent1;
rb[i]->Top=temptop;
rb[i]->Left=templeft;
rb[i]->Height=h;
rb[i]->Width=w;
if (Captions->Count>i){
rb[i]->Caption=Captions->Strings[i];};
templeft+=w+rg;
if (!(--cgk)) {cgk=gk;temptop+=h+rv;templeft=leftg;
if (!(--cvk)) {i=n;}};
}
};


Поясняю.
rb — это указатель на массив указателей на экземпляры создаваемых объектов (RadioButton -ов)
Parent1 — указатель на объект-родитель
Captions — список Caption -ов
n — количество создаваемых RadioButton -ов
gk — количество столбцов RadioButton -ов
vk — количество строк RadioButton -ов
rg — расстояние между найближайшими краями соседних RadioButton -ов по горизонтали
rv — расстояние между найближайшими краями соседних RadioButton -ов по вертикали
w — ширина каждого RadioButton -а
h — высота каждого RadioButton -а
topg — вертикальная координата всей группы RadioButton -ов
leftg — горизонтальная координата всей группы RadioButton -ов

Доступ к каждому объекту осуществляется через массив указателей на объекты.

Например

CODE

//!!!Глобальные переменные !!!
TRadioButton** masrb;
int kolrb,i;

//--------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList* strs = new TStringList;
strs->Add("№ 1");
strs->Add("№ 2");
strs->Add("№ 3");
strs->Add("№ 4");
strs->Add("№ 5");
strs->Add("№ 6");
strs->Add("№ 7");
strs->Add("№ 8");
strs->Add("№ 9");
strs->Add("№ 10");
strs->Add("№ 11");
strs->Add("№ 12");
kolrb=12;
Create_Group_RadioButton_On_Parent(masrb,Form1,strs,12,4,3,1,1,150,20,100,100);
masrb[5]->Caption="Переключатель № 5";
masrb[6]->Caption="Переключатель № 6";
}


Удаление этих объектов не составляет проблем.
Для этого в программе нужно сохранить их количество.

CODE

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Сначала освобождается память, занимаемая самими объектами
for (i=0;i<kolrb;i++)
{
delete masrb[i];
};
delete masrb;//И в конце сам массив указателей удаляется
}


Отредактировано Grigoriy — 04/03/2006, 22:21
ZDV
Отправлено: 05.03.2006, 21:40


Ученик-кочегар

Группа: Участник
Сообщений: 19



Большое спасибо. Это как раз то, что нужно. smile.gif

Вернуться в Вопросы программирования в C++Builder