![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отображение Hint у DBGrid [D7, MS Access]
Lex_! © (2005-05-11 13:21:00)Попытка номер два.....
Имееться DBGrid с одним видимым полем (полей всего три)
Требуется: при наведении мышки на DBGrid на конкретное значение в столбце вывести хинт где указано то что находиться в другом поле (в неотображенном)
тоесть: есть запись содержащая -
текстполя1 текстполя2(не отображается
при наведении на текстполя1 в хинте показать надпись "текстполя2"
sniknik (2005-05-15 13:44:00) [1]> и в итоге?... можно или нет чтотт сделать то?:)
а сам то как думаеш? после приведенных 3 вариантов одного метода, и словами описаного другого, еще не логадываешся?
Bronco © (12.05.05 12:43) [35]
> Отсюда вывод - позиция курсора - не меняется.
сорри просмотрел... ну да продолжим. сегодня как раз выходной, скучно.
береш свой вариант [28]
коментируеш строку //DataLink.ActiveRecord:=CurRec; (зачем восстанавливать, если позиция не меняется?)
дальше ставиш позицию клавишами на 1 (к примеру), заводиш мышу на середину позиций грида и нажимаеш кнопку "вниз". откуда началось скролирование? выводы делай сам.
а связка не дергается потому что смена идет в навигационных методах Next, Pred, ... т.д. контролы отключать нет надобности, если используется метод "до них", более низкоуровневый.
Lex_! (2005-05-15 12:52:00) [2]и в итоге?... можно или нет чтотт сделать то?:)
Bronco (2005-05-12 12:43:00) [3]
> sniknik © (12.05.05 12:26) [33]
Проверил. Так и есть :-)
Контролы НЕ отключены, а связка даже не дергается. Мало того, другие DB контролы на форме также не дергаются.
Отсюда вывод - позиция курсора - не меняется.
sniknik (2005-05-12 12:27:00) [4]кстати не показатель, при отключеных контролах...
sniknik (2005-05-12 12:26:00) [5]Bronco © (12.05.05 12:25) [31]
проверь. у меня обед. ;о))
sniknik (2005-05-12 12:25:00) [6]> ну да, естественно, значение поля меняется. Но позиция курсора в датасете - нет :-)
ага, вижу, самому смешно стало, да?
> могли бы и обычными средствами навигации (MoveBy etc) обойтись
тогда сложно проставить соответствие строка в гриде - строка в датасете (номера не совпадают). попробуй.
Bronco (2005-05-12 12:25:00) [7]и еще кстати, простой способ - навесить каких нибудь мастер-детальных связок и посмотреть. Полагаю что они даже не дернутся :-)
Bronco (2005-05-12 12:14:00) [8]
> sniknik © (12.05.05 12:03) [29]
ну да, естественно, значение поля меняется. Но позиция курсора в датасете - нет :-) Иначе нафиг нужны эти выкрутасы с Datalink, могли бы и обычными средствами навигации (MoveBy etc) обойтись
sniknik (2005-05-12 12:03:00) [9]опять я со своими глупостями ;о))
> изменение ActiveRecord не ведут к изменению позиции в датасете.
опять возьмем "левое" поле не определенное в гриде, только в рекордсете
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var Coord:TGridCoord;
CurRec:Integer;
begin
with TMyDBGrid(DBGrid1) do begin
Coord:=MouseCoord(x,y);
with Coord do
if (Y < 1) or (X < 1) or (X > Columns.Count) then Exit;
CurRec:=DataLink.ActiveRecord;
DataLink.ActiveRecord:=Coord.Y-1;
Label1.Caption:= //Columns[Coord.X-1].Field.AsString;
ADODataSet1SCHIM.AsString;
DataLink.ActiveRecord:=CurRec;
end;
end;
и видим саптион меняется! чего бы не происходило если бы в нем(датасете) не менялась позиция...
вывод: они меняются (она всетаки вертится! ;о))), вам этого просто не показывают.
p.p.s. на этот раз все, надоело. ;)
Bronco (2005-05-12 11:47:00) [10]изменение ActiveRecord не ведут к изменению позиции в датасете.
вот совсем упрощенный вариант (вдруг автору пригодится)
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var Coord:TGridCoord;
CurRec:Integer;
begin
with TMyDBGrid(DBGrid1) do
begin
Coord:=MouseCoord(x,y);
with Coord do
if (Y < 1) or (X < 1) or (X > Columns.Count) then Exit;
CurRec:=DataLink.ActiveRecord;
DataLink.ActiveRecord:=Coord.Y-1;
Label1.Caption := Columns[Coord.X].Field.AsString;
DataLink.ActiveRecord:=CurRec;
end;
end;
Johnmen (2005-05-12 11:20:00) [11]>sniknik © (12.05.05 11:06) [26]
Я тоже ни о чём не спорю... И мне это не очень интересно...
Просто уточнение (возм.пригодится тем, кто захочет разобраться), надо см. DataLink.Fields[i] (естественно, найденный), а не непосредственно поле из НД.
sniknik (2005-05-12 11:06:00) [12]> Тот пример показывает, что не ведут. Проверил. Ещё в исходники слегка глянул...
ну не ведут так не ведут. ;о)) бессмысленный спор изз совершенно ненужного предмета...
просто обьясню с чего так решил
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
Grid : TDBGrid;
Cell : TGridCoord;
CellRect : TRect;
HintCol : TColumn;
OldActive : Integer;
Value : string;
Pt : TPoint;
begin;
Grid:= Sender as TDBGrid;
Cell:= Grid.MouseCoord(X,Y);
if (Cell.X<1) or (Cell.Y<0) then Exit;
try
HintCol:=Grid.Columns[Cell.X-1];
Value:='';
OldActive:= MyDBGrid(Grid).DataLink.ActiveRecord;
try
MyDBGrid(Grid).DataLink.ActiveRecord:= Cell.Y-1;
Value:= HintCol.Field.DisplayText;
CellRect:= MyDBGrid(Grid).CellRect(Cell.X,Cell.Y);
GetCursorPos(Pt);
CellRect:= FHintWindow.CalcHintRect(Grid.Width, Value, nil);
OffsetRect(CellRect, Pt.X, Pt.Y);
//FHintWindow.ActivateHint(CellRect, Value);
CellRect.Right:= CellRect.Right + 300;
FHintWindow.ActivateHint(CellRect, ADODataSet1SCHIM.AsString);
finally
MyDBGrid(Grid).DataLink.ActiveRecord:= OldActive;
Grid.Repaint;
end;
except
FHintWindow.ReleaseHandle;
end;
end;
закоментаренную строчку заменил двумя нижеследующими, в гриде определено 1 поле, показываю (ADODataSet1SCHIM) другое, которое есть только в датасете (и оно немного длиннее ;о), как понятно из кода).
так вот поле то только в рекордсете присутствует и берется не с даталинка а непосредственно с датасета, и тем не менее оно меняется при смене записи... т.е. налицо переход между записями. (но даже если опровергнеш. мне пофигу, чест.слово ;о)), пусть так и будет, копатся в этом буду только если действительно понадобится, в чем сомневаюсь ;)
ну вот, мимоходом целых 2 варианта выложили. ;о) если разберется, будес с чего начать.
Johnmen (2005-05-12 10:05:00) [13]>sniknik © (11.05.05 18:27) [23]
>ну тогда это буфер из букмарков, т.к. изменения позиции в нем
>ведут и к изменению позиции в рекордсете.
Тот пример показывает, что не ведут. Проверил. Ещё в исходники слегка глянул...
Polevi (2005-05-12 09:51:00) [14]type
TGridHelper=class(TCustomDBGrid);
procedure TMainForm.ApplicationEvents1ShowHint(var HintStr: String;
var CanShow: Boolean; var HintInfo: THintInfo);
var
pt:TPoint;
gc:TGridCoord;
saveNo:Integer;
dl:TDataLink;
begin
GetCursorPos(pt);
pt:=Grid.ScreenToClient(pt);
gc:=Grid.MouseCoord(pt.X,pt.Y);
dl:=TGridHelper(HeadersGrid).DataLink;
saveNo:=dl.ActiveRecord;
try
dl.ActiveRecord:=gc.Y-1;
HintStr:=Grid.DataSource.Dataset['SomeField'];
finally
dl.ActiveRecord=saveNo
end;
end;
sniknik (2005-05-11 18:27:00) [15]> Так ведь даталинк фактически и есть буфер.
ну тогда это буфер из букмарков, т.к. изменения позиции в нем ведут и к изменению позиции в рекордсете.
> А ето, мне тоже можно выслать?...
ну как Johnmen решит... если бы мой код был я решал ;о) высылать или нет, но все одно его там дорабатывать нужно (к примеру если просто проверку на смену позиции поставить и значение хинта на это время (время неизменности позиции) запоминать, то вполне можно избавиться от мерцания и в таком варианте, не так часто перерисовываться будет), а компонент переделывать (как я хотел) не придется.
Johnmen (2005-05-11 18:08:00) [16]Так ведь даталинк фактически и есть буфер.
И значения надо брать из него...
Lex_! (2005-05-11 17:59:00) [17]А ето, мне тоже можно выслать?...
надо же как то это сделать ...
sniknik (2005-05-11 17:43:00) [18]Ok. (в смысле получил ;о))), действительно попроще, чем у меня бы получилось. и кода меньше.
а вот то что так можно активную запись менять, не знал (да и не стремился особо ;о), но может пригодиться).
код точно "конкретно" сырой ;о), на заголовке таблици вываливается с AV понятно почему выход за пределы, в отладчике естественно в проге видно не будет, но лучше бы и этого не допускать.
и еще, кстати, там всетаки обходится без буфера, т.к. если взять значение не из DataLink-а а напрямую из датасета то оно всетаки меняется, т.е. код сначала делает активной запись под мышью а после вертает "взад" (если бы был буфер этого бы не наблюдалось), делает это довольно часто (на каждое перемещение мыши) отчего заметно мерцание хинта и даже грида на перерисовке... в общем использовать в том виде что есть категорически запрещено. ;о))) ну дак, предупреждали...
Johnmen (2005-05-11 16:43:00) [19]ок - в смысле, выслал. Там всё достаточно несложно...
Johnmen (2005-05-11 16:42:00) [20]ок