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

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

Получить номер строки 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...


Наверх

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