Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

отображение Hint у DBGrid [D7, MS Access]


Страницы:   1 2

Lex_! ©   (2005-05-11 13:21:00) 

Попытка номер два.....

Имееться DBGrid с одним видимым полем (полей всего три)
Требуется: при наведении мышки на DBGrid на конкретное значение в столбце вывести хинт где указано то что находиться в другом поле (в неотображенном)

тоесть: есть запись содержащая -
текстполя1     текстполя2(не отображается
при наведении на текстполя1 в хинте показать надпись "текстполя2"


sniknik   (2005-05-11 16:29:00) [21]

я вообще думал свой буфер сделать (если бы пришлось решать подобное)
ну типа
TMyDBGrid = class(TDBGrid)
 Hints: array of string;
 procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
end;

Hints на onResize меняем размер, в DrawCell сощраняем нужную запись в буфер, ARow - номер строки (= позиции в буфере) есть, в событии копируем то что нам нужно(1 или несколько полей для нинта из текущего DataLink-а), вызываем родительскую перерисовку и все.
по onMouseMove смотрим позицию в гриде (как выше показывал) и если изменилась показываем hint.

в общем очень просто. так думаю ;о)) у тебя сложнее?


sniknik   (2005-05-11 16:18:00) [22]

значит пропустил... вышли тогда если не сложно.


Johnmen   (2005-05-11 16:12:00) [23]

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

Да есть же. Просто в сырцах пример использования со смещением ActiveRecord'а в DataLink'е.


sniknik   (2005-05-11 15:31:00) [24]

> Есть сырцы со стандартным... Но очень сырые, но основной принцип поясняющие.
значит в стандартном всетаки нету, раз для него сырцы ктото для этого писал...

не, спасибо конечно, но я худо бедно способен и сам это реализовать. ;о)) просто думал чтото пропустил, есть буфер а я его не вижу...


Johnmen   (2005-05-11 14:48:00) [25]

Есть сырцы со стандартным... Но очень сырые, но основной принцип поясняющие.


sniknik   (2005-05-11 14:44:00) [26]

> Может кто разовьет тему?
нафига? зачем чегото там высчитывать, что можно элементарно получить в событии на отрисовке поля (например) без всяки вычислений прямым копированием.


sniknik   (2005-05-11 14:41:00) [27]

> А в буфере есть поля записи которые не определены вообще в гриде?... у меня там написано одно поле и все..
ну так делай этот буфер/массив сам, и сохраняй в него то что тебе нужно.

кстати не встречал чтото такого буфера, это только TDBGridEh есть или в стандартном гриде тоже? (нестандартные компонентами у нас запрещено использовать, что надо пиши сам, поэтому EhLib-а не имею)


КиТаЯц   (2005-05-11 14:38:00) [28]

Ну и мне как-то без надобности... Дай-ка тоже ляпну не подумавши... ;)
Имеем Х и У без учета скролинга. Надо с учетом скролинга. Если я не ошибаюсь то текущая запись ДатаСета в гриде всегда на экране... Далее надо получить что-то вроде кординат текущей записи и потом:
Х (У) искомое := Х (У) записи под мышью/высоту строк Грида - (У) записи текущей...
Может кто разовьет тему?


sniknik   (2005-05-11 14:36:00) [29]

> это номера записей отображаемых, а не действительных.
истинно так, с гриде вообше всего столько строк сколько видно(иногда на одну больше, это я чегото проверял, сталкивался) а не по числу записей в рекордсете (как многие почемуто думают). поэтому и будет первая запись в гриде показывать 1(/0) а не 148-ю от начала рекордсета. но соответствие проставить всетаки можно, начало откуда грид рисует в самом гриде и запоминается.
было бы зачем. ;о) (както незаметно и давно уже отошол от понятий какие в striggrid трактуются, и както странно так стало, то, что тогда важным считал сейчас совсем не нужно...)


Lex_!   (2005-05-11 14:33:00) [30]


> Johnmen ©   (11.05.05 14:17) [5]
> >Надо в общем по положению курсора в гриде перейти на запись
>
>
> Не надо. Есть буфер отображаемых записей. Из него и тянуть...
> Идеальный пример кода, как это сделать, см. в исходниках
> TDBGridEh из библиотеки EhLib.

А в буфере есть поля записи которые не определены вообще в гриде?... у меня там написано одно поле и все..


Virgo_Style   (2005-05-11 14:22:00) [31]

sniknik ©   (11.05.05 13:59) [3]

Как бы не наврать... Но по-моему, проверить все же надо было ;-)
Насколько я помню свои неудачные попытки, X и Y получаются без учета скроллинга, то есть, это номера записей отображаемых, а не действительных.

Впрочем, мне это тоже давно без надобности :o)


sniknik   (2005-05-11 14:17:00) [32]

> Это место подробнее можно?.
вообщето это я не подумав ляпнул. ;о)) DataLink.Fields это скорее всего поля в текущей записи а не номера записей...

тебе придется скорее всего сохранять хинты для каждой отображаемой в гриде записи (менять в списке можно по отрисовке там все одно на каждую запись свое событие). т.е. сделать масив записей по числу строк в гриде... и т.д. пробуй.


Johnmen   (2005-05-11 14:17:00) [33]

>Надо в общем по положению курсора в гриде перейти на запись

Не надо. Есть буфер отображаемых записей. Из него и тянуть...
Идеальный пример кода, как это сделать, см. в исходниках TDBGridEh из библиотеки EhLib.


Lex_!   (2005-05-11 14:10:00) [34]


> А что именно интересует? Показ хинта или показ др.поля?

Показ в хинте другого поля.
Надо в общем по положению курсора в гриде перейти на запись в таблице которая на данный момент отображается в гриде, и показать одно из полей записи в хинте

> координаты в гриде нашли, в датасете y должен соответствовать
> значению поля DataLink.Fields[y] (опять вроде бы ;о)), сам
> этого не делал...). все, вот и все соответствие (надо только
> проверить ;о), мне это было без надобности).

Это место подробнее можно?.
тоесть как перейти на запись в датасете (лучше в таблице) на ту на которой расположена мыш в данный момент


sniknik   (2005-05-11 13:59:00) [35]

Virgo_Style ©   (11.05.05 13:46) [2]
серьезно?

это же очень просто

var
 Point: TPoint;
 GridCoord: TGridCoord;
begin
 Point:= DBGrid1.ScreenToClient(Mouse.CursorPos);
 GridCoord:= DBGrid1.MouseCoord(Point.X, Point.Y);

 GridCoord.X - //это колонка  
 GridCoord.Y - //это строка (вроде бы ;о)), проверь)

координаты в гриде нашли, в датасете y должен соответствовать значению поля DataLink.Fields[y] (опять вроде бы ;о)), сам этого не делал...). все, вот и все соответствие (надо только проверить ;о), мне это было без надобности).


Virgo_Style   (2005-05-11 13:46:00) [36]

Кажется, проблема тут в соответствии "координата мыши - запись в DataSet". Я в свое время решения не нашел...


Johnmen   (2005-05-11 13:36:00) [37]

А что именно интересует? Показ хинта или показ др.поля?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо