![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Координаты текущей ячейки грида [D6]
msguns © (2005-07-19 13:49:00)В некой библиотечной процедуре, которой передается как параметр адрес объекта TDBGrid, надо получить координаты активной ячейки с тем, чтобы относительно нее удобно расположить созданное в процедуре модальное окно.
Пожалуйста, у кого есть идеи или опыт, поделитесь.
msguns (2005-07-21 09:15:00) [1]>evvcom © (20.07.05 13:15) [18]
>Почему сравниваешь с TForm(Grid.Owner).Height, а не Top + Height?
Потому что тормоз !
Спасибо ;))
evvcom (2005-07-20 13:15:00) [2]А... ну да. ClientOrigin - это уже в Screen координатах.
> if (Grid.ClientOrigin.Y+GridActiveCell.Top-2+MinHeight)
> >TForm(Grid.Owner).Height then
Почему сравниваешь с TForm(Grid.Owner).Height, а не Top + Height?
msguns (2005-07-20 12:55:00) [3]>evvcom © (20.07.05 12:38) [16]
Дело в том, что относительно ячейки окно позиционируется совершенно правильно. Неверно срабатывает сравнение - вот тут и загадка.
evvcom (2005-07-20 12:38:00) [4]Дык, ты же Left/Top формы присваиваешь клиентские координаты ячейки. ClientToScreen попробуй
msguns (2005-07-20 12:26:00) [5]А можно "до кучи" помочь с этим:
// Получить координаты ячейки
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 11:16:00) [6]
> TCustomGrid наследуется прямо от TCustomControl
Не важно от кого TCustomGrid наследуется, важно кто от него наследуется, будь то TDBGridCrack, TDrawGrid или TStringGrid.
> вообще то это разные ветки наследования
Ветки может и разные, но CellRect у общего родителя реализован, поэтому во всех наследниках лежит по одному и тому же адресу.
> Наверное, получается, потому что метод не перекрывался нигде
Статические методы не перекрываются.
ANB (2005-07-20 11:03:00) [7]
> sniknik © (19.07.05 17:56) [12]
- хм. вообще то это разные ветки наследования. Наверное, получается, потому что метод не перекрывался нигде. Побаиваюсь я так делать, так как уже нарывался на ошибку неправильного приведения. Хотя если аккуратно, то почему бы и нет ?
sniknik (2005-07-19 17:56:00) [8]довольно странно но получается и с стринггрид и с TDrawGrid(DBGrid1) например. попробуй.
ANB (2005-07-19 17:30:00) [9]
> sniknik © (19.07.05 17:01) [10]
- искал. TCustomGrid наследуется прямо от TCustomControl. И у кустомгрида этот метод засунут в протектед. А TCustomDBGrid наследуется напрямую от TCustomGrid.
sniknik (2005-07-19 17:01:00) [10]> И с эхлибовским гридом работает !!!
значит предок общий.
кстати напомнило, в принципе не нужно даже определять тип TDBGridCrack, можно найти предка у которого эти методы еще открыты и привести грид к нему. (тоже вариант ;)
ANB (2005-07-19 16:54:00) [11]И с эхлибовским гридом работает !!! С quantum даже пробовать не хочу.
ANB (2005-07-19 16:49:00) [12]
> sniknik © (19.07.05 16:37) [7]
Точно ! Так работает :
R := TDBGridCrack(DBGrid1).CellRect(TDBGridCrack(DBGrid1).Col, TDBGridCrack(DBGrid1).Row);
Спасибо.
sniknik (2005-07-19 16:37:00) [13]> У кустом грида метод CellRect лежит в протектед.
так вот это
type
TDBGridCrack = class (TCustomGrid);
и открывает продектед методы, но только п пределах модуля где описано.
sniknik (2005-07-19 16:34:00) [14]а вот по сути получается даже неверное...
т.к. идет привязка к датасету и номеру записи, даже если номер есть в данном типе базы, все одно в гриде нет столько строк сколько в рекордсете. достаточно "провернуть" грид чтобы пара первых записей скрылась и получиш неверные результаты...
так правильней
заменить
R := TDBGridCrack(DBGrid1).CellRect(DBGrid1.SelectedIndex, DBGrid1.DataSource.DataSet.RecNo - 1);
на
with TDBGridCrack(DBGrid1) do R:= CellRect(Col, Row);
msguns (2005-07-19 16:32:00) [15]>ANB © (19.07.05 15:07) [1]
Так работает ! Спасибо.
> sniknik © (19.07.05 16:19) [3]
>А вот как обойтись без реализации этого метода, буду заранее благодарен за подсказку
Присоединяюсь к просьбе и присоединяю свои благодарности ;)))
ANB (2005-07-19 16:24:00) [16]
> sniknik © (19.07.05 16:19) [3]
- я попробовал. У кустом грида метод CellRect лежит в протектед. Иначе бы и крэк класс был не нужен. А вот как обойтись без реализации этого метода, буду заранее благодарен за подсказку. У меня чего то не получилось (говорила мама - учи теорию).
sniknik (2005-07-19 16:19:00) [17]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;
и этого хватит. (должно)
msguns (2005-07-19 16:04:00) [18]>ANB © (19.07.05 15:07) [1]
Спасибо. Щас попробую
ANB (2005-07-19 15:07:00) [19]Попытался помочь. Получилось только через крэк класс, примерно вот так :
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;