Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Получить номер строки 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.055 c
6-1096396967
Наташа
2004-09-28 22:42
2004.12.05
Какой самый быстрый способ скачивания файлов?


4-1098342720
gris
2004-10-21 11:12
2004.12.05
Простой вопрос! Подскажите, как узнать серийный номер сетевой кар


1-1101207665
Руслана
2004-11-23 14:01
2004.12.05
Подскажите как в компоненте TListView проверить состояние


3-1100013025
denis24
2004-11-09 18:10
2004.12.05
datamodule1.tbl1


1-1100703753
Yanis
2004-11-17 18:02
2004.12.05
Переносы