Форум: "Базы";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизКоординаты текущей ячейки грида Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c