Создаю в рантайме нужный мне компонент:
- Код: Выделить всё
new(p_CheckBoxStockOnly);
p_CheckBoxStockOnly^:=TCheckBox.Create(StringGrid);
p_CheckBoxStockOnly^.Parent:=StringGrid;
p_CheckBoxStockOnly^.Visible:=False;
new(p_CheckBoxClearPrice);
p_CheckBoxClearPrice^:=TCheckBox.Create(StringGrid);
p_CheckBoxClearPrice^.Parent:=StringGrid;
p_CheckBoxClearPrice^.Visible:=False;
new(p_ComboBoxGroupAlgorithm);
p_ComboBoxGroupAlgorithm^:= TCombobox.Create(StringGrid);
with p_ComboBoxGroupAlgorithm^ do begin
Parent:=StringGrid;
Style:= csDropDownList;
Items.Add('Фон + Цена');
Items.Add('Фон + Идент.');
Hint:='Выберите алгоритм поиска группы (только для "Группы в строках").';
ShowHint:=true;
Visible:=false;
end;
В событии onDrawCell рисую их в гриде:
- Код: Выделить всё
if (acol=1) and (aRow=19) then
begin
if StringGrid.AutoEdit then
begin
TCheckBox(p_CheckBoxStockOnly^).Top:=arect.Top;
TCheckBox(p_CheckBoxStockOnly^).Left:=arect.Left+50;
TCheckBox(p_CheckBoxStockOnly^).Visible:=True;
end;
end;
if (acol=1) and (aRow=20) then
begin
if StringGrid.AutoEdit then
begin
TCombobox(p_ComboBoxGroupAlgorithm^).Width:=Arect.Width-5;
TCombobox(p_ComboBoxGroupAlgorithm^).Top:=arect.Top+2;
TCombobox(p_ComboBoxGroupAlgorithm^).Left:=arect.Left+2;
TCombobox(p_ComboBoxGroupAlgorithm^).Visible:=True;
end;
end;
if (acol=1) and (aRow=21) then
begin
if StringGrid.AutoEdit then
begin
TCheckBox(p_CheckBoxClearPrice^).Top:=arect.Top;
TCheckBox(p_CheckBoxClearPrice^).Left:=arect.Left+50;
TCheckBox(p_CheckBoxClearPrice^).Visible:=True;
end;
end;
В событии onTopLeftChanged скрываю ненужные мне компоненты при скроллинге:
- Код: Выделить всё
var
i:integer;
begin
for i:=TStringGrid(Sender).VisibleRowCount to TStringGrid(Sender).rowcount-1 do
begin
case i of
14: if p_CheckBoxGroupInRows <> nil then p_CheckBoxGroupInRows^.Visible:= false;
19: if p_CheckBoxStockOnly <> nil then p_CheckBoxStockOnly^.Visible:= false;
20: if p_ComboBoxGroupAlgorithm <> nil then p_ComboBoxGroupAlgorithm^.Visible:= false;
21: if p_CheckBoxClearPrice <> nil then p_CheckBoxClearPrice^.Visible:= false;
end;
end;
При открытии формы имею следущую проблему (при условии, что грид полностью умещается по высоте формы):
Если кликнуть по второй колонке, в любой строке (col=1) мышкой, то отображение нормализуется:
Понимаю, что что-то с моей отрисовкой компонент в гриде, только никак не могу понять в чем именно - помогите, пожалуйста.