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

Вниз

Координаты текущей ячейки грида   Найти похожие ветки 

 
msguns ©   (2005-07-19 13:49) [0]

В некой библиотечной процедуре, которой передается как параметр адрес объекта TDBGrid, надо получить координаты активной ячейки с тем, чтобы относительно нее удобно расположить созданное в процедуре модальное окно.
Пожалуйста, у кого есть идеи или опыт, поделитесь.


 
ANB ©   (2005-07-19 15:07) [1]

Попытался помочь. Получилось только через крэк класс, примерно вот так :

type
TDBGridCrack = class (TCustomGrid)
public
 function CellRect(ACol, ARow: Longint): TRect;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var R : TRect;
begin
R := TDBGridCrack(DBGrid1).CellRect(DBGrid1.SelectedIndex, DBGrid1.DataSource.DataSet.RecNo - 1);
ShowMessage(IntToStr(R.Top)+":"+IntToStr(R.Left));
end;

{ TDBGridCrack }

function TDBGridCrack.CellRect(ACol, ARow: Integer): TRect;
begin
Result := (inherited CellRect(ACol, ARow));
end;



 
msguns ©   (2005-07-19 16:04) [2]

>ANB ©   (19.07.05 15:07) [1]

Спасибо. Щас попробую


 
sniknik ©   (2005-07-19 16:19) [3]

ANB ©   (19.07.05 15:07) [1]
лишнее...
type
TDBGridCrack = class (TCustomGrid);

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var R : TRect;
begin
R := TDBGridCrack(DBGrid1).CellRect(DBGrid1.SelectedIndex, DBGrid1.DataSource.DataSet.RecNo - 1);
ShowMessage(IntToStr(R.Top)+":"+IntToStr(R.Left));
end;

и этого хватит. (должно)


 
ANB ©   (2005-07-19 16:24) [4]


> sniknik ©   (19.07.05 16:19) [3]
- я попробовал. У кустом грида метод CellRect лежит в протектед. Иначе бы и крэк класс был не нужен. А вот как обойтись без реализации этого метода, буду заранее благодарен за подсказку. У меня чего то не получилось (говорила мама - учи теорию).


 
msguns ©   (2005-07-19 16:32) [5]

>ANB ©   (19.07.05 15:07) [1]
Так работает ! Спасибо.

> sniknik ©   (19.07.05 16:19) [3]
>А вот как обойтись без реализации этого метода, буду заранее благодарен за подсказку

Присоединяюсь к просьбе и присоединяю свои благодарности ;)))


 
sniknik ©   (2005-07-19 16:34) [6]

а вот по сути получается даже неверное...
т.к. идет привязка к датасету и номеру записи, даже если номер есть в данном типе базы, все одно в гриде нет столько строк сколько в рекордсете. достаточно "провернуть" грид чтобы пара первых записей скрылась и получиш неверные результаты...
так правильней
заменить
R := TDBGridCrack(DBGrid1).CellRect(DBGrid1.SelectedIndex, DBGrid1.DataSource.DataSet.RecNo - 1);
на
with TDBGridCrack(DBGrid1) do R:= CellRect(Col, Row);


 
sniknik ©   (2005-07-19 16:37) [7]

> У кустом грида метод CellRect лежит в протектед.
так вот это
type
TDBGridCrack = class (TCustomGrid);

и открывает продектед методы, но только п пределах модуля где описано.


 
ANB ©   (2005-07-19 16:49) [8]


> sniknik ©   (19.07.05 16:37) [7]

Точно ! Так работает :
R := TDBGridCrack(DBGrid1).CellRect(TDBGridCrack(DBGrid1).Col, TDBGridCrack(DBGrid1).Row);
Спасибо.


 
ANB ©   (2005-07-19 16:54) [9]

И с эхлибовским гридом работает !!! С quantum даже пробовать не хочу.


 
sniknik ©   (2005-07-19 17:01) [10]

> И с эхлибовским гридом работает !!!
значит предок общий.
кстати напомнило, в принципе не нужно даже определять тип TDBGridCrack, можно найти предка у которого эти методы еще открыты и привести грид к нему. (тоже вариант ;)


 
ANB ©   (2005-07-19 17:30) [11]


> sniknik ©   (19.07.05 17:01) [10]
- искал. TCustomGrid наследуется прямо от TCustomControl. И у кустомгрида этот метод засунут в протектед. А TCustomDBGrid наследуется напрямую от TCustomGrid.


 
sniknik ©   (2005-07-19 17:56) [12]

довольно странно но получается и с стринггрид и с TDrawGrid(DBGrid1) например. попробуй.


 
ANB ©   (2005-07-20 11:03) [13]


> sniknik ©   (19.07.05 17:56) [12]
- хм. вообще то это разные ветки наследования. Наверное, получается, потому что метод не перекрывался нигде. Побаиваюсь я так делать, так как уже нарывался на ошибку неправильного приведения. Хотя если аккуратно, то почему бы и нет ?


 
evvcom ©   (2005-07-20 11:16) [14]


> TCustomGrid наследуется прямо от TCustomControl

Не важно от кого TCustomGrid наследуется, важно кто от него наследуется, будь то TDBGridCrack, TDrawGrid или TStringGrid.

> вообще то это разные ветки наследования

Ветки может и разные, но CellRect у общего родителя реализован, поэтому во всех наследниках лежит по одному и тому же адресу.

> Наверное, получается, потому что метод не перекрывался нигде

Статические методы не перекрываются.


 
msguns ©   (2005-07-20 12:26) [15]

А можно "до кучи" помочь с этим:

   
 // Получить координаты ячейки
 GridActiveCell := TDBGridCrack(Grid).CellRect(TDBGridCrack(Grid).Col,TDBGridCrack(Grid).Row);
 // Создать форму
 SearchForm := TForm.Create(Grid.Owner);
 with SearchForm do
   begin
    ...
    Height := MinHeight;    // 200
    Width := MinWidth;      // 360
    if (Grid.ClientOrigin.Y+GridActiveCell.Top-2+MinHeight)
>TForm(Grid.Owner).Height then
       // Вверху над ячейкой
       Top := Grid.ClientOrigin.Y+GridActiveCell.Bottom+2-MinHeight
    else
       // Внизу под ячейкой
       Top := Grid.ClientOrigin.Y+GridActiveCell.Top-2;
    if (Grid.ClientOrigin.X+GridActiveCell.Right+MinWidth)>TForm(Grid.Owner).Width then
       // Слева от ячейки
       Left := Grid.ClientOrigin.X+GridActiveCell.Left-MinWidth
    else
       Left := Grid.ClientOrigin.X+GridActiveCell.Right;
    ...
   end;


Создаваяемая форма должна рисоваться рядышком с активной ячейкой грида, но так, чтобы она по возможности лежала максимально внутри вызывающей формы. Кликаю на втором столбце, справа - море простанства с гридом, окно появляется слева. аналогично с вертикальной фигней. Т.е. что-то с преобразованием координат. Где наплутовал ?


 
evvcom ©   (2005-07-20 12:38) [16]

Дык, ты же Left/Top формы присваиваешь клиентские координаты ячейки. ClientToScreen попробуй


 
msguns ©   (2005-07-20 12:55) [17]

>evvcom ©   (20.07.05 12:38) [16]

Дело в том, что относительно ячейки окно позиционируется совершенно правильно. Неверно срабатывает сравнение - вот тут и загадка.


 
evvcom ©   (2005-07-20 13:15) [18]

А... ну да. ClientOrigin - это уже в Screen координатах.

> if (Grid.ClientOrigin.Y+GridActiveCell.Top-2+MinHeight)
> >TForm(Grid.Owner).Height then

Почему сравниваешь с TForm(Grid.Owner).Height, а не Top + Height?


 
msguns ©   (2005-07-21 09:15) [19]

>evvcom ©   (20.07.05 13:15) [18]
>Почему сравниваешь с TForm(Grid.Owner).Height, а не Top + Height?

Потому что тормоз !
Спасибо ;))



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

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

Наверх




Память: 0.51 MB
Время: 0.04 c
3-1121940951
PHilosoPH!
2005-07-21 14:15
2005.09.04
Список серверов MS SQL


3-1121776635
TAN_K
2005-07-19 16:37
2005.09.04
QuickReport - итог вычисляемого поля


14-1123577134
Ego
2005-08-09 12:45
2005.09.04
Не в тему сайта.


5-1097175244
Sergey_Masloff
2004-10-07 22:54
2005.09.04
D7 only! control has no parent window


1-1123751173
Русланка
2005-08-11 13:06
2005.09.04
Как программно выделить один из Item в TreeView?