Radio button внутри ячейки AdvStringGrid

06.07.2011
Сейчас рассмотрим небольшой пример о том, как добавить Radio button в ячейку.
Заметка основана на примере с официального сайта TMS Software.

Методы


Ниже представлены основные методы работы с Radio button:
AdvStringGrid1.AddRadio(ACol, ARow, DirRadio, IdxRadio: integer; sl: TStrings);  

AdvStringGrid1.RemoveRadio(ACol, ARow: Integer);
AdvStringGrid1.IsRadio(Acol, Arow: Integer): Boolean;
AdvStringGrid1.GetRadioIdx(ACol, ARow: integer; var IdxRadio: Integer): Boolean;
AdvStringGrid1.SetRadioIdx(ACol, ARow, IdxRadio: integer): Boolean;

Сначала рассмотрим метод AddRadio, который добавляет переключатели в ячейку, а точнее его параметры:
ACol: столбец ячейки;
ARow: строка ячейки;
DirRadio: ориентация переключателей, 1 - горизонтальная и 0 - вертикальная;
IdxRadio: индекс отмеченного по умолчанию переключателя, если не отмечен то ставим -1;
sl: список переключателей.

С методом RemoveRadio всё и так ясно, он удаляет переключатели из заданной ячейки:
ACol: столбец ячейки;
ARow: строка ячейки.

Метод IsRadio проверяет есть ли в ячейке переключатели или нет.
ACol: столбец ячейки;
ARow: строка ячейки.
При успехе возвращает true, а при неудаче false.

С помощью метода GetRadioIdx извлекаем индекс выбранного переключателя.
ACol: столбец ячейки;
ARow: строка ячейки.

SetRadioIdx отмечает в нужной ячейке нужный переключатель.
ACol: столбец ячейки;
ARow: строка ячейки;
IdxRadio: индекс переключателя.

Добавим переключатели


Давайте создадим форму типа той, которую вы видите на рисунке выше. Естественно добавим два AdvStringGrid и в процедуру FormCreate нашей формы напишем следующие:
procedure TForm1.FormCreate(Sender: TObject);

var
RadioList1, RadioList2: TStringList;
i: integer;
begin
//Создаём два объекта типа TStringList
RadioList1 := TStringList.Create;
RadioList1.Add('Delphi');
RadioList1.Add('C++Builder');
RadioList1.Add('JBuilder');

RadioList2 := TStringList.Create;
RadioList2.Add('Std');
RadioList2.Add('Prof');
RadioList2.Add('C/S');

//Добавляем переключатели в ячейку
With AdvStringGrid1 do
for i:=1 to rowcount-1 do
begin
AddRadio(1, i, 0, -1, RadioList1);
addradio(2, i, 1, -1, RadioList2);
end;
end;

Здесь мы создаём два объекта типа TStringList и добавляем в них строки. А после этого добавляем в каждую ячейку второго и третьего столбца переключатели. Во второй столбец - расположенные вертикально, в третий - горизонтально.

Копируем результат


Вы уже наверное заметили закономерность на скриншоте между двумя AdvStringGrid: В первом(AdvStringGrid1) можем выбирать в ячейках из нескольких вариантов, а во втором отображается результат нашего выбора. Делается это через потоки:
procedure TForm1.AdvStringGrid1RadioClick(Sender: TObject; aCol, aRow,  

aIdx: Integer);
var
ms: TMemoryStream;
begin
ms := tmemorystream.Create;
AdvStringGrid1.SaveToStream(ms);
AdvStringGrid2.LoadFromStream(ms);
ms.Free;
end;

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

Выпадающий список


А что бы AdvStringGrid2 не выглядел обделённым, давайте сделаем у него не переключатели, а выпадающий список т.е. ComboBox в тех же ячейках:
procedure TForm1.AdvStringGrid2GetEditorType(Sender: TObject; aCol,

aRow: Integer; var aEditor: TEditorType);
begin
//Проверяем, если выбранн второй(1) или третий(2) столбец
if (aCol in [1,2]) then
aEditor := edComboList;
//Если второй, то загружаем список из ранее созданного TStringList
if (aCol = 1) then
AdvStringGrid2.ComboBox.Items.Assign(radopt1);
//Если третий, то загружаем список из ранее созданного TStringList
if (aCol = 2) then
AdvStringGrid2.ComboBox.Items.Assign(radopt1);
end;

Все комментарии даны в коде.