Форум: "Базы";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизПолучить номер строки DbGrid в событии DrawColumnCell Найти похожие ветки
← →
SergP © (2004-11-03 09:40) [0]Можно ли сделать сделать сабж? Если да, то как?
← →
stone © (2004-11-03 10:09) [1]Номер записи или номер строки в видимой области?
т.е. если грид высотой в 10 строк, то все строки будут нумероваться с 1 до 10...
← →
msguns © (2004-11-03 10:30) [2]Если нужен текущий номер строки датасета, то через любое "левое" (т.е. его содержимое не надо показывать в гриде) поле НД, в обработчике OnGetText которого следует написать
Text := IntToStr(Sender.DataSet.RecNo);
← →
Vlad © (2004-11-03 10:33) [3]Это если св-во RecNo корректно поддерживается движком, а также если речь о записи в НД, а не гриде.
Если же речь о номере записи именно в гриде, то ее можно определить так, например:
TStringGrid(Sender).Row
← →
stone © (2004-11-03 10:44) [4]
> Vlad © (03.11.04 10:33) [3]
> в событии DrawColumnCell
> TStringGrid(Sender).Row
покажет на всех строках 1
тогда ужRect.Top div TStringGrid(Sender).DefaultRowHeight;
← →
Vlad © (2004-11-03 10:52) [5]
> stone © (03.11.04 10:44) [4]
да, действительно, именно в OnDrawColumnCell всегда покажет еденицу.
вот так правильно будет:
TMyDBGrid(Sender).DataLink.ActiveRecord;
предварительно объявив тип TMyDBGrid = class(TDBGrid);
← →
sniknik © (2004-11-03 10:59) [6]> покажет на всех строках 1
не покажет, проверь. (только не в отладчике с точкой останова в DrawColumnCell, там изза переключений экрана постоянно первую строку рисовать будет)
← →
sniknik © (2004-11-03 11:01) [7]вставьте строку типа
Label1.Caption:= IntToStr(TStringGrid(Sender).Row);
и посмотрите.
побегайте по гриду (активная запись перерисовывается)
← →
Vlad © (2004-11-03 11:03) [8]
> sniknik © (03.11.04 10:59) [6]
дык проверял Canvas.TextOut , в специальное поле выводил. Во всех строках еденица
← →
sniknik © (2004-11-03 11:24) [9]> дык проверял Canvas.TextOut , в специальное поле выводил. Во всех строках еденица
...? хм. специально тоже проверил, разные (от 1 до максимального в гриде)
версия дельфи (???), у меня D7, нестандартный грид(???) у меня стандартный, у тебя не rx/...?
проверь еще так (может у тебя чтото в VCL исправлено, и грид со стринггридом имеют разных предков)
в типе пиши
TMyDBGrid = class(TDBGrid);
и
Label1.Caption:= IntToStr(TMyDBGrid(Sender).Row);
кстати настаиваю именно на таком способе, через Caption (может у тебя глюк с отрисовкой по TextOut)
← →
Vlad © (2004-11-03 12:19) [10]
> 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 13:02) [11]> Vlad © (03.11.04 12:19) [10]
ага теперь понятно.
> Зато если использовать вместо Row свойство DataLink.ActiveRecord то в каждой строке отображается ее реальный номер.
а попробуй клавишу вниз нажать и удерживать в таком положении (если есть записи "ниже" грида), идилия нарушится ;о).
← →
Vlad © (2004-11-03 13:16) [12]
> sniknik © (03.11.04 13:02) [11]
а если на AfterScroll набора данных повесить Grid.Invalidate, то все будет ОК :-)
Во всяком случае если говорить о номерах записей именно в гриде, а не датасете, то они будут верными.
Только вопрос - это ли нужно автору?
← →
SergP © (2004-11-03 19:43) [13]Номер строки именно в гриде а не номер записи в датасете, причем желательно вообще а не в видимой области.
← →
Vlad © (2004-11-03 19:53) [14]
> SergP © (03.11.04 19:43) [13]
> причем желательно вообще а не в видимой области.
у грида нет невидимых областей, в том-то все и дело.
Есть у тебя десять строчек в гриде, и номера у них соотв будут с первой по десятую - всегда, как бы ты ни скроллировал его. Вернее до тех пор пока размер грида не поменяешь.
Значит тебе все-таки нужен номер записи в датасете?
← →
SergP © (2004-11-03 20:04) [15]
>
> Значит тебе все-таки нужен номер записи в датасете?
Почти. но не совсем...
Код:
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"
← →
SergP © (2004-11-04 23:00) [16]
> [9] sniknik © (03.11.04 11:24)
>
> в типе пиши
> TMyDBGrid = class(TDBGrid);
> и
> Label1.Caption:= IntToStr(TMyDBGrid(Sender).Row);
Спасибо. Работает.
кстати вопрос (правда это уже не по базам а по классам):
Почему свойство Datalink в TDBGrid недоступно а в TMyDBGrid становится доступным, если я не прописываю его в public?
← →
jack128 © (2004-11-04 23:09) [17]SergP © (04.11.04 23:00) [16]
потому что private/protected свойства класса доступны ВСЕМ в пределах того модуля где объявлен этот класс.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c