Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-1121706798
Trimp
2005-07-18 21:13
2005.09.04
Чтение из реестра переменных с типом REG_MULTI_SZ


3-1122373054
Yurisimus
2005-07-26 14:17
2005.09.04
База *.xls через ADO в Delphi


9-1115537093
grouzd[E]v
2005-05-08 11:24
2005.09.04
OpenGL - LOD feat. Renderable


14-1123661739
REP
2005-08-10 12:15
2005.09.04
XP, DOS программы и клавиатура


1-1124035464
Zaero
2005-08-14 20:04
2005.09.04
Можно ли на ToolButton ах отображать пиктограммы слева от надписи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский