Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.032 c
3-1099995990
alsov1
2004-11-09 13:26
2004.12.05
Нужен алгоритм выборки по рекурсивной связи


6-1096615076
AlexA
2004-10-01 11:17
2004.12.05
TIdSMTP в теле письма "заменяются" русские буквы


3-1099678933
Rgv54
2004-11-05 21:22
2004.12.05
Запуск приложения на клиенте


3-1099689705
Zif
2004-11-06 00:21
2004.12.05
Сервис->Служебные программы->Сжать и восстановить базу...


1-1100630052
Fantasist
2004-11-16 21:34
2004.12.05
Sharemem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский