主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档: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:= 1到SG1.RowCount-1开始
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;
结束;
结束;

procedure TForm1.CheckBox1Click(Sender:TObject);
开始
如果TCheckBox(发件人)。然后检查
Sg1.Cells [3,TCheckBox(Sender).Tag]:=“Ku-Ku”
其他
Sg1.Cells [3,TCheckBox(Sender).Tag]:=“Shhh ......”;
结束;

过程TForm1.SG1DrawCell(发送者:TObject; ACol,ARow:Integer;
Rect:TRect; 州:TGridDrawState);
开始
if(ACol = 3)和(ARow> 0)然后开始
TCheckBox(SG1.Cols [3] .Objects [ARow])。Top:= SG1.top + Rect.Top + 5;
TCheckBox(SG1.Cols [3] .Objects [ARow])。左:= SG1.left + Rect.right-12;
结束;
结束;

procedure TForm1.SG1TopLeftChanged(Sender:TObject);
var i:整数;
开始
for i:= 1 to SG1.RowCount-1 do
TCheckBox(SG1.Cols [3] .Objects [i])。可见:=
(SG1.LeftCol <= 3)和(i in [SG1.TopRow..SG1.TopRow + SG1.VisibleRowCount-1]);
结束;



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.6 MB
时间:0.032 c
1-246
SlavaLamer
2002-03-19 14:48
2002.04.01
Webbrouser


3-48
古尔班
2002-03-07 13:17
2002.04.01
Paradox Date字段


14-305
维达勋爵
2002-02-20 04:59
2002.04.01
RUNDLL32.EXE - 以MS-DOS模式重新启动计算机


3-67
IPEN
2002-03-05 11:01
2002.04.01
软件挂在DBGrid单元格中


3-5
sniknik
2002-03-05 16:27
2002.04.01
更新请求





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский