Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

Можно ли в TDrawGrid вставить комбобокс   Найти похожие ветки 

 
Irisha   (2002-09-23 22:36) [0]

Можно ли сделать в гриде выпадающий список? Или может быть есть какой-нибуть специальный компонент типа Object Inspector"a?
Спасибо!!!


 
MBo ©   (2002-09-24 06:33) [1]

пример для StringGrid (Sg1)
cb1 - Combobox

В DrawGrid (если действительно нужен именно он) вместо присвоения Cells придется руками (Canvas.TextOut) выводить
текст ( cb1.Items[cb1.itemindex])



procedure TForm1.sg1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if ARow =1 then begin
R := SG1.CellRect(ACol, ARow);
cb1.left := R.Left+ SG1.Left+1;
cb1.top := R.Top + sg1.top+1;
cb1.Width := sg1.ColWidths[acol];
cb1.Visible := True;
cb1.SetFocus;
end;
CanSelect := True;
end;

procedure TForm1.cb1Change(Sender: TObject);
begin
SG1.Cells[SG1.Col, SG1.Row]:=
cb1.Items[cb1.itemindex];
cb1.visible:=false;
end;

procedure TForm1.cb1Exit(Sender: TObject);
begin
cb1.visible:=false;
end;

procedure TForm1.sg1TopLeftChanged(Sender: TObject);
var
R: TRect;
begin
R := SG1.CellRect(SG1.Col, SG1.Row);
cb1.left := R.Left+ SG1.Left+1;
end;


 
Separator ©   (2002-09-24 07:22) [2]

Выдернуто целиком из кулибы:

Delphi 1

Помещение компонентов в StringGrid
Некоторое время тому назад такой вопрос уже ставился: возможно ли поместить элемент управления, например, CheckBox или ComboBox внутрь компонента ...Grid. Я сегодня помозговал и нашел неплохую, на мой взгляд, технологию. Это работает! Вот решение для тех, кто этим интересуется:


При создании компонента (в обработчике OnCreate), создайте его объекты Objects[C,R], например TCheckBox.Create(Self). Имейте в виду, что вы должны присвоить ячейкам Cells[C,R] какие-либо значения прежде, чем чем вы сможете иметь доступ к Objects[C,R]. Установите у вновь созданного компонента свойство Visible в FALSE, а свойство parent в SELF. Осуществите другую необходимую инициализацию. Имейте в виду, что вы должны внести необходимые модули в список uses, если создаете тип компонента, которого нигде кроме как на форме нет.

Создайте процедуру, берущую координаты колонки/строки и правильно позиционирующую соотвествующий объект в пределах прямоугольника ячейки, например:


procedure TForm1.FixObjPosn(vCol, vRow: LongInt);
{Размещаем содержимое компонента в области прямоугольника ячейки}
VAR
R : TRect;
BEGIN
R := StringGrid1.CellRect(vCol, vRow);
IF StringGrid1.Objects[vCol,vRow] IS TControl THEN
WITH TControl(StringGrid1.Objects[vCol,vRow]) DO
IF R.Right = R.Left THEN {прямоугольник ячейки невидим}
Visible := False
ELSE
BEGIN
InflateRect(R, -1, -1);
OffsetRect(R, StringGrid1.Left+1,StringGrid1.Top+1);
BoundsRect := R;
Visible := True;
END;
END;


(смещение позиции необходимо, поскольку CellRect расчитывается относительно верхнего левого угла строки сетки, и родителем компонента является форма).


В обработчике события сетки OnSelectCell проверьте, располагается ли элемент Objects в текущей колонке Col и строке Row TControl - если так, установите его свойство visible в FALSE. Теперь вызовите процедуру установления координат из шага 2 для *НОВЫХ* Col и Row, передавая их из параметров обработчика события в параметры функции.

В обработчике OnTopLeftChanged просто вызовите FixObjPosn

В обработчике события OnDrawCell во-первых, если ячейка выбрана, EXIT. Если элемент ячейки Objects не TControl, также EXIT. В противном случае вам нужно создать код, обеспечивающий отрисовку "фасада" каждого типа элемента управления, которого вы разместили в сетке.

Обратите внимание на то, что если вы делаете что-либо с элементом управления, на который влияют ДРУГИЕ элементы управления (например, изменение статуса какой-либо радиокнопки из группы, или операции enable/disable), вы должны вызвать метод сетки Refresh.


 
Ach_Den ©   (2002-09-24 07:42) [3]

Народ! Всем драсте!
Не подскажете как сделать, чтобы через DrawGrid можно было видеть бэкгроунд - ну чтобы через cell был вижен скажем Image???

Помогите плиз... :)

(И если можно с примером)


 
MBo ©   (2002-09-24 08:55) [4]

>Ach_Den
Наверно, проще всего, если не возиться с наследником, перекрывая WM_EraseBkgnd, по OnDrawCell просто копировать соотв. кусок Image в каждую ячейку


 
Ach_Den ©   (2002-09-24 10:00) [5]

>MBo
Ну а если это не Image, а какойнить... Gif, или спрайто-движение???

:)


 
Separator ©   (2002-09-24 10:34) [6]

Все равно надо по OnDrawCell обрабатывать и в каждую ячейку вставляь кусок image. Любой gif или спрайто движение - это набор картинок меняющихся во времени


 
Ach_Den ©   (2002-09-24 12:05) [7]

Ну ладно...

Попробую...



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
14-8121
blackweber
2002-09-05 21:36
2002.10.03
Как обойти защиту копирования видеокассет.


6-8089
Yuriy
2002-08-01 08:25
2002.10.03
Помогите разобраться с web компанентами.


3-7821
КСА
2002-09-12 11:30
2002.10.03
Index is out of date


1-7985
s.ts
2002-09-20 21:21
2002.10.03
Узнать запущена ли IDE


3-7787
robi
2002-09-16 09:43
2002.10.03
компоненты доступа к dbf без BDE