![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить номер строки DbGrid в событии DrawColumnCell [D6]
SergP © (2004-11-03 09:40:00)Можно ли сделать сделать сабж? Если да, то как?
jack128 (2004-11-04 23:09:00) [1]SergP © (04.11.04 23:00) [16]
потому что private/protected свойства класса доступны ВСЕМ в пределах того модуля где объявлен этот класс.
SergP (2004-11-04 23:00:00) [2]
> [9] sniknik © (03.11.04 11:24)
>
> в типе пиши
> TMyDBGrid = class(TDBGrid);
> и
> Label1.Caption:= IntToStr(TMyDBGrid(Sender).Row);
Спасибо. Работает.
кстати вопрос (правда это уже не по базам а по классам):
Почему свойство Datalink в TDBGrid недоступно а в TMyDBGrid становится доступным, если я не прописываю его в public?
SergP (2004-11-03 20:04:00) [3]
>
> Значит тебе все-таки нужен номер записи в датасете?
Почти. но не совсем...
Код:
procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
rec:integer;
begin
rec:=TDbGrid(sender).DataSource.DataSet.RecNo;
if DataCol=0 then Dbgrid1.Canvas.TextOut(Rect.Left,Rect.Top,inttostr(rec));
end;
делает то что мне нужно пока я не вставляю новую запись. При вставке новой записи с помощью грида, во всех строках грида вместо номера по порядку появляется "-1"
Vlad (2004-11-03 19:53:00) [4]
> SergP © (03.11.04 19:43) [13]
> причем желательно вообще а не в видимой области.
у грида нет невидимых областей, в том-то все и дело.
Есть у тебя десять строчек в гриде, и номера у них соотв будут с первой по десятую - всегда, как бы ты ни скроллировал его. Вернее до тех пор пока размер грида не поменяешь.
Значит тебе все-таки нужен номер записи в датасете?
SergP (2004-11-03 19:43:00) [5]Номер строки именно в гриде а не номер записи в датасете, причем желательно вообще а не в видимой области.
Vlad (2004-11-03 13:16:00) [6]
> sniknik © (03.11.04 13:02) [11]
а если на AfterScroll набора данных повесить Grid.Invalidate, то все будет ОК :-)
Во всяком случае если говорить о номерах записей именно в гриде, а не датасете, то они будут верными.
Только вопрос - это ли нужно автору?
sniknik (2004-11-03 13:02:00) [7]> Vlad © (03.11.04 12:19) [10]
ага теперь понятно.
> Зато если использовать вместо Row свойство DataLink.ActiveRecord то в каждой строке отображается ее реальный номер.
а попробуй клавишу вниз нажать и удерживать в таком положении (если есть записи "ниже" грида), идилия нарушится ;о).
Vlad (2004-11-03 12:19:00) [8]
> sniknik © (03.11.04 11:24) [9]
версия D5, грид стандартный, событие OnDrawColumnCell для одного из полей пишем:
Canvas.TextOut(Rect.Left+5, Rect.Top+2, IntToStr(TStringGrid(Sender).Row));
или
Canvas.TextOut(Rect.Left+5, Rect.Top+2, IntToStr(TMyDBGrid(Sender).Row));
Получаем еденицу в каждой строке указанного поля. Ну соотв. если бегать курсором по датасету, то значения меняются (но ведь нам не это надо).
Зато если использовать вместо Row свойство DataLink.ActiveRecord то в каждой строке отображается ее реальный номер.
sniknik (2004-11-03 11:24:00) [9]> дык проверял Canvas.TextOut , в специальное поле выводил. Во всех строках еденица
...? хм. специально тоже проверил, разные (от 1 до максимального в гриде)
версия дельфи (???), у меня D7, нестандартный грид(???) у меня стандартный, у тебя не rx/...?
проверь еще так (может у тебя чтото в VCL исправлено, и грид со стринггридом имеют разных предков)
в типе пиши
TMyDBGrid = class(TDBGrid);
и
Label1.Caption:= IntToStr(TMyDBGrid(Sender).Row);
кстати настаиваю именно на таком способе, через Caption (может у тебя глюк с отрисовкой по TextOut)
Vlad (2004-11-03 11:03:00) [10]
> sniknik © (03.11.04 10:59) [6]
дык проверял Canvas.TextOut , в специальное поле выводил. Во всех строках еденица
sniknik (2004-11-03 11:01:00) [11]вставьте строку типа
Label1.Caption:= IntToStr(TStringGrid(Sender).Row);
и посмотрите.
побегайте по гриду (активная запись перерисовывается)
sniknik (2004-11-03 10:59:00) [12]> покажет на всех строках 1
не покажет, проверь. (только не в отладчике с точкой останова в DrawColumnCell, там изза переключений экрана постоянно первую строку рисовать будет)
Vlad (2004-11-03 10:52:00) [13]
> stone © (03.11.04 10:44) [4]
да, действительно, именно в OnDrawColumnCell всегда покажет еденицу.
вот так правильно будет:
TMyDBGrid(Sender).DataLink.ActiveRecord;
предварительно объявив тип TMyDBGrid = class(TDBGrid);
stone (2004-11-03 10:44:00) [14]
> Vlad © (03.11.04 10:33) [3]
> в событии DrawColumnCell
> TStringGrid(Sender).Row
покажет на всех строках 1
тогда уж
Rect.Top div TStringGrid(Sender).DefaultRowHeight;
Vlad (2004-11-03 10:33:00) [15]Это если св-во RecNo корректно поддерживается движком, а также если речь о записи в НД, а не гриде.
Если же речь о номере записи именно в гриде, то ее можно определить так, например:
TStringGrid(Sender).Row
msguns (2004-11-03 10:30:00) [16]Если нужен текущий номер строки датасета, то через любое "левое" (т.е. его содержимое не надо показывать в гриде) поле НД, в обработчике OnGetText которого следует написать
Text := IntToStr(Sender.DataSet.RecNo);
stone (2004-11-03 10:09:00) [17]Номер записи или номер строки в видимой области?
т.е. если грид высотой в 10 строк, то все строки будут нумероваться с 1 до 10...