Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
ВнизПроблема с встроенным в TStringGrid чекбоксом ! Найти похожие ветки
← →
kolobok (2002-03-21 12:33) [0]Может, кто мне поможет ? У меня такая проблема:
Хочу, чтобы в компоненте TStringGrid в третьей колонке содержались CheckBox"ы
для того чтобы включить/выключить действие описанное в строке.
Проблема же конкретно заключается в следующем:
// Программно создаю TCheckBox
cbOne:=TCheckBox.Create(StringGrid1);
// объявляю родителя CheckBox"а
cbOne.Parent:=StringGrid1;
// в левом верхнем углу он появился.
// Если теперь начать по нему щёлкать, то от него никакой реакции
// Если объявить родителем Form1 или Button1 - никаких проблем
// Пробовал в обработчике OnClick менять Checked, получил бесконечный цикл
// Видимо программное изменение состояния вызывает событие Click->OnClick и далее...
// Немного изловчился и стал обрабатывать событие OnMouseDown для StringGrid1
// В этом обработчике по координатам мыши вычисляется координата ячейки и
// проверяется условие (та ячейка в которой сидит CheckBox или не та), если она
// тогда:
cbOne.Checked:= not cbOne.Checked;
// Работает только, если попадаешь в ячейку. Попадаешь в CheckBox - никакой реакции.
Можно конечно и так приспособиться, но хочется, чтобы всё работало как надо !
И ещё: нет ли у кого хорошего примерчика как в компонент встроить подобное управление типа кнопок, переключателей, выключателей и т.д.
Буду признателен, если вышлете на мыло kolobok11@hotbox.ru
← →
Song (2002-03-21 12:49) [1]Может у него Enabled отрицательно? Или выставить самому принудительно..
← →
kolobok (2002-03-21 13:04) [2]С Enabled всё в порядке. Я же говорю, стоит только родителем объявить форму или кнопку и всё работает.
С уважением для Song.
← →
Song (2002-03-21 13:10) [3]подожди сам попробую
← →
kolobok (2002-03-21 13:19) [4]Попробуй Song. По форуму вижу, что человек ты поднаторевший в этом деле, наверняка помочь сможешь. Заранее спасибо.
kolobok11@hotbox.ru
← →
MBo (2002-03-21 13:21) [5]procedure TForm1.FormCreate(Sender: TObject);
var cb:TCheckBox;
i:integer;
begin
for i:=1 to SG1.RowCount-1 do begin
cb:=TCheckBox.Create(self);
cb.Parent:=self;
cb.width:=12;
cb.tag:=I;
cb.Caption:="";
cb.color:=SG1.Color;
cb.Visible:=(i in [SG1.TopRow..SG1.TopRow+SG1.VisibleRowCount-1]);
cb.onClick:=CheckBox1Click;
SG1.Cols[3].Objects[i]:=cb;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if TCheckBox(Sender).Checked then
Sg1.Cells[3,TCheckBox(Sender).Tag]:="Ку-Ку"
else
Sg1.Cells[3,TCheckBox(Sender).Tag]:="Тссс...";
end;
procedure TForm1.SG1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (ACol=3) and (ARow>0) then begin
TCheckBox(SG1.Cols[3].Objects[ARow]).top:=SG1.top+Rect.Top+5;
TCheckBox(SG1.Cols[3].Objects[ARow]).left:=SG1.left+Rect.right-12;
end;
end;
procedure TForm1.SG1TopLeftChanged(Sender: TObject);
var i:integer;
begin
for i:=1 to SG1.RowCount-1 do
TCheckBox(SG1.Cols[3].Objects[i]).Visible:=
(SG1.LeftCol<=3) and (i in [SG1.TopRow..SG1.TopRow+SG1.VisibleRowCount-1]);
end;
← →
Song (2002-03-21 13:26) [6]Не получается потому, что на TCheckBox не передаётся фокус ввода. TStringGrid - компонент сам составной, ограничение скорей связано с этим. Если только родителся делать на Form1 или на Self (это одно и тоже будет в данном случае). А координаты назначать чекбоксу самому.
← →
Song (2002-03-21 13:27) [7]О-о-о, :)) Я гляжу MBo тебя уже выручил. :)) Оперативен, как всегда. :o
← →
kolobok (2002-03-21 14:26) [8]Спасибо МВо за решение, но поскольку разобраться в этом в данный момент слёту не могу, прошу в двух словах объяснить неучу что происходит.
С уважением, kolobok.
← →
MBo (2002-03-21 14:41) [9]при создании CheckBox родителем ему назначается форма, а поскольку он позже грида появился, рисуется сверху. В других случаях можно делать BringToFront.
созданный CheckBox вносится в список Objects столбца (можно и в отдельный, но этот-то уже существует)(Cols типа TStrings), Tag -номер строки. OnClick - общий.
С рисованием, видимостью и отработкой клика понятно или объяснить?
← →
kolobok (2002-03-21 14:58) [10]МВо, лучше объясни кратенько. Я же говорю - Я НЕУЧ!
А ты, я вижу, МАСТАК! Пару дней подумаю и разберусь наверняка, будет мне наука. А про тебя в хелпе проги упомяну - если доделаю.
С уважением, kolobok.
← →
MBo (2002-03-21 15:13) [11]клик - приводим Sender к типу TCheckBox (в общем случае, если событие может быть вызвано объектом другого типа, надо проверять if Sender is TCheckBox), чтобы использовать свойства Checkbox-a
рисование - если колонка нужная, из координат ячейки (в гриде)находим положение чекбокса. Прибавляем коорд. грида, так как положение чекбокса дается относ. родителя - формы.
видимость - если ячейка видна, то и checkBox.
Для колонки можно сделать, как и для ряда,(с поддиапазоном) если они могут быть широкими и только 2 нефикс. помещаются.
Ты конкретнее спрашивай, что именно неясно.
← →
kolobok (2002-03-21 15:35) [12]Спасибо МВо!
Теперь я разобрался, с твоей помощью конечно.
Не знаешь ли существует Delphi 6.0 rus или нет?
kolobok.
← →
MBo (2002-03-21 15:49) [13]никаких D русских нет. Бывают левые русификации, которые
debug-window Watches переводят как Часики
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c