Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Вниз

Нумерация ячеек в DBGRID   Найти похожие ветки 

 
der   (2002-03-12 05:09) [0]

Драсьте!
Как можно организовать нумерацию ячеек в dbgrid? Нужен № п/п.


 
onix   (2002-03-12 08:02) [1]

Друзья такая же проблема. Ну подскажите кто нибудь. Как-то пробовал в InterBase"е такое, получилось, но то было через компоненты со странички InterBase. А вот с BDE ни как ):


 
Shirson   (2002-03-12 08:48) [2]

Использовать ADODataSet. (Table,Query и пр.) У него есть property RecNo.
Если BDE вам дорого как память воспользуйтесь компонентой DBGridEh (настоятельно рекомендую - очень полезная вещь вообще и для ADO тоже :)).
Она наследует с предка TCustomGrid пропертину Row.


 
sniknik   (2002-03-12 09:09) [3]

RecNo в ADODataSet не причина отказыватся от BDE найдите поважнее. Хочу сказать за то что средства надо подбирать к задаче (что проще), некоторые вещи через ADO не сделаеш к тому же сам ADO просто средство доступа к драйверу например Jet а он тот же BDE использует. Кстати у таблици "Table" тоже есть свойство RecNo.


 
Nest   (2002-03-12 09:12) [4]

Я делал так:
1.Паковал таблицу, чтоб RecNo соответствовало фактическому номеру записи в физ. таблице.
2.Добавлял ещё одну колонку "№"
3. №OnGetText писал text:=inttostr(table1.recno);
{4.После удаления записи пакуем таблицу:
Запоминаем в пер-ую №тек.записи
Пакуем
Close/Open
Moveby(№);}
Всё отрабатывает незаметно для пользователя.
Если надо - пришлю пример, но помоему всё и так ясно.


 
onix   (2002-03-12 09:27) [5]

>Nest ©
Пришли пожалуйста пример. Буду очень благодарен.

>Shirson ©
Очень хочется узнать как это проделать с DBGridEh.


 
Shirson   (2002-03-12 09:30) [6]

>sniknik
"RecNo в ADODataSet не причина отказыватся от BDE найдите поважнее"

Для кого поважнее? Для себя? Sort, clone,Load/Save From/To File,
OnFetchProgress, multirecordset, no-BDE :)и пр. Мне хватает. Для остальных - пусть сами думают, help у всех есть.


"некоторые вещи через ADO не сделаеш к тому же сам ADO просто средство доступа к драйверу "

Хехехехе. А мне и нужно ПРОСТО обратиться к провайдеру. Вы BDE для чего-то еще используете? :)


"Кстати у таблици "Table" тоже есть свойство RecNo."

Может быть, только Table я никогда не использую. Слишком негибкий инструмент.


 
data   (2002-03-12 09:41) [7]

А я крутила с BookMark. Кстати, такой вопрос уже был в конференции и на основании ответов на него я это и сварганила.:))
Примерно так. Q - запрос связанный с Гридом.
Links : array of string;
При каждом открытии/переоткрытии запроса Q - вызывается
процедура SetLinks, заполняющая массив BookMark.
В гриде добавлен столбец,с пустым именем поля, там должны быть
номера.
Сразу скажу, что запрос этот у меня по количеству записей маленький. Возвращает порядка 100 записей, поэтому замедления работы я не заметила.

procedure SetLinks;
var BM:TBookMark;
i:integer;
begin
SetLength(Links,Q.RecordCount);
//Можно не использовать RecordCount(он не для всех СУБД
//работает), а пустить еще
//один запрос с подсчетом записей
if Length(Links)=0 then Exit;
with Q do
begin
Bm:=GetBookMark;
try
DisableControls;
try
First;
i:=0;
while not Eof do
begin
Links[i]:=BookMark;
inc(i);
Next;
end;
except
end;
try
GotoBookMark(bm);
FreeBookMark(bm);
except
end;
finally
EnableControls;
end;
end;
end;

function FindLink(bk:TBookmark; var idx: longint): Boolean;
var i:integer;
begin
Result:=false;
idx:=0;
if Length(links)=0 then Exit;
for i:=0 to Length(links)-1 do
begin
if Q.CompareBookmarks(TBookMark(links[i]),bk)=0 then
begin
Result:=true;
idx:=i+1;
break;
end;
end;
end;
//Для грида - обработчик
procedure TFmPanels.DBGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var n:integer;cc:integer;CurBK: TBookMark;
num:integer;
begin
if (Column.FieldName)="" then
begin
if gdSelected in State then
begin
DBGrid.Canvas.Brush.Color:=clHighlight;
DBGrid.Canvas.FillRect(Rect);
DBGrid.Canvas.Font.Color:=clHighlightText;
end
else
begin
DBGrid.Canvas.Brush.Color:=clWindow;
DBGrid.Canvas.FillRect(Rect);
DBGrid.Canvas.Font.Color:=clWindowText;
end;
try
CurBk:=Q.GetBookMark;
if FindLink(CurBk,num) then
DBGrid.Canvas.TextOut(Rect.Left+20,Rect.Top+2,IntTostr(num));
except
end;
end
else DBGrid.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;



 
Belov   (2002-03-12 09:44) [8]

А не проще ли сделать вычисляемое поле ?


 
data   (2002-03-12 09:50) [9]

2 Belov © (12.03.02 09:44) И как его вычислять?


 
Shirson   (2002-03-12 11:29) [10]

onix ©
>Shirson ©
"Очень хочется узнать как это проделать с DBGridEh."

Упс, сорри. Насоветовал непроверив. Родной row у неё дает видимую строку (почему-то).



 
sniknik   (2002-03-12 11:30) [11]

По моему самый простой путь (не самый правильный) повесить на обработчик на отрисовку Грида. Вот так

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if Field.FieldName = "LINKED" then begin
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, IntToStr(Table1.RecNo));
end;
end;

поле "LINKED" здесь не использующееся поле таблици (оно у меня всегда пустое "")

для Shirson ©: вы похоже для себя уже причины нашли, а мне приходится работать и BDE и с ADO. И честно говоря не вижу чем одна система лутше другой. Разные - да, но сказать что ADO лутше и включает ВСЕ необходимые мне средства чтобы ради них бросить BDE не могу.


 
Nest   (2002-03-12 11:37) [12]

2onix ©
Дома есть.
Завтра притащю.


 
onix   (2002-03-12 11:37) [13]

>data ©
Большое спасибо за пример.
Работает, ну просто заглядение. Вы молодец.
С уважением, Дмитрий


 
Shirson   (2002-03-12 12:11) [14]

sniknik © (12.03.02 11:30)
"для Shirson ©: вы похоже для себя уже причины нашли, а мне приходится работать и BDE и с ADO. И честно говоря не вижу чем одна система лутше другой. Разные - да, но сказать что ADO лутше и включает ВСЕ необходимые мне средства чтобы ради них бросить BDE не могу"

Я просто года три-четыре работал BDE. Т.е. цепочка получалась Delphi-BDE-ODBC-MSSQL.
Потом углядел ADO (довольно недавно), решил попробовать. Получилось Delphi-ODBC-MSSQL. BDE настраивать ненужно, фич у ADO побольше, мне с ним работать приятнее - это возможно, субъективно, но удовольствия больше :) Даже код приятнее.
S:=Query1.FieldByName("Adress").AsString;
или
S:=Query1["Adress"];
:)
Кроме MSSQL, тягаюсь с dBASE - тоже на ура. Даже с XL данные выдергиваю при помощи ADO. Ничего такого, что есть в BDE, но нет в ADO я пока не встретил, а доп. возможностей поболе, один Clone чего стоит - чудо просто. Sort и множественный рекордсет на дороге не валяются. Сейчас копаюсь с FetchProgress - обещает быть весьма удобным.
Про BDE вспоминаю изредка и с сожалением за потраченные годы :)


 
DiggerAbstract   (2002-03-12 12:18) [15]


SELECT
ROW_NUMBER() OVER() AS NUM,
T.*
FROM
TABLE AS T


Может так проще будет


 
sniknik   (2002-03-12 13:01) [16]

To Shirson ©
Ничего такого, что есть в BDE, но нет в ADO

Упаковка таблиц, переиндексация (снятие индексов при потере иидексных файлов), почти все функции DBI, доступ к записи (не эмуляция через курсор, это тормозит, а прямой). Это конечно если работать с DB и DBF. Если с MSSQL то я сам бы выбрал ADO.


 
data   (2002-03-12 13:03) [17]

2 onix © (12.03.02 11:37)
Не за что, всегда рада помочь :)

2 sniknik © (12.03.02 11:30)
RecNo не во всех СУБД работает. Для Парадокса по-моему (но могу и ошибаться) как раз все время выдает -1.


 
sniknik   (2002-03-12 13:19) [18]

Да нет у меня и с Парадоксом работает только одно изменение сделал
if UpperCase(Field.FieldName) = "LINKED" then begin
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, IntToStr(Table1.RecNo));
end;
т.к. у него Field.FieldName почемуто маленькини буквами. Правда у меня Delphi шестой. Но это не должно влиять.


 
MAxiMum   (2002-03-14 18:39) [19]

>sniknik ©
А ведь, может оказаться, что Table1.RecNo не изменился.
Я не знал и создал параллеотно вам свою ветку. Посмотри её плиз.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1016107005&n=1


 
sniknik   (2002-03-14 19:36) [20]

MAxiMum © послал пример ответьте при получении.


 
MAxiMum   (2002-03-14 19:46) [21]

>sniknik ©
Не понял про, что вы говорите. Если про почту, то там чисто.


 
sniknik   (2002-03-14 23:09) [22]

Про почту. Только она у меня глючит на отправку (на работе) посылаю еще раз из дома (теперь дойдет).


 
Hooch   (2002-03-15 08:02) [23]

Здравствуйте Все !

Дабы Query.RecNo выдавал не -1 а реальный номер строки нужно
после открытия сказать Query.FetchAll и будет сказка !


 
deleon   (2002-03-15 08:53) [24]

А теперь наложите на таблицу фильтр и посмотрите как попорядку ваш RecNo выдает значения :)


 
MAxiMum   (2002-03-15 11:03) [25]

>sniknik ©
Если ты mihut@chat.ru, то я не смог открыть вложенный HTML, иначе, не получил.


 
sniknik   (2002-03-15 11:20) [26]

не у меня sniknik@rambler.ru то что из дома посылал уже должно дойти. Кстати пример простой с индексами и фильтрами не проверял счас буду пробовать пока жду машину на выезд.


 
asafr   (2002-03-15 12:25) [27]

Cоздаешь вычисляемое поле, два раза кликнув по Query1, обзываешь его, например, "Num", присваиваешь тип Intrger. А потом
procedure Tfm_Form1.Query1CalcFields(DataSet: TDataSet);
begin
Query1Num.Value:=Query.RecNo;
end;

Всё...


 
asafr   (2002-03-15 12:26) [28]

Cоздаешь вычисляемое поле, два раза кликнув по Query1, обзываешь его, например, "Num", присваиваешь тип Intrger. А потом
procedure Tfm_Form1.Query1CalcFields(DataSet: TDataSet);
begin
Query1Num.Value:=Query1.RecNo;
end;

Всё...


 
sniknik   (2002-03-15 12:50) [29]

С вычисляемым полем тоже фигня получится (как и у меня). Вообше я понял тут RecNo нельзя использовать он дает физический номер поля. Используемый индекс их перемешает а фильтр часть отсечет. А человеку похоже надо чтобы нумерация была правильной независимо от индексов или фильтров.


 
MAxiMum   (2002-03-15 15:15) [30]

Я думаю решение, в создании новой компоненты, унаследованной от TDBGrid. При этом, нельзя полагаться на свойства TDataset. Думаю, надо на свойства TCustomGrid или перекрывать их же.
Повторяю посмотрите ветку: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1016107005&n=1.
p.s. Или никто ООП и VCL не знает!? :))


 
Lusha   (2002-03-15 15:52) [31]

Извините, что встреваю в Вашу дискуссию. А не могли бы Вы мне "темному" ответить зачем вообще нужна эта нумерация, т.е. какую полезную информацию она несет пользователю?


 
data   (2002-03-15 16:53) [32]

2 Lusha © (15.03.02 15:52)
Да ни за чем не нужна, т.к. не несет никакой полезной информации :-). В моем случае заказчики захотели так "Для красоты".


 
Nest   (2002-03-15 17:01) [33]

А что насчёт Nest © (12.03.02 09:12)
Непонятно изъяснил или не устраивает вриант?
Если первое-спрашивайте что непонятно.
Вроде более менее просто/быстро...
У меня работает и вполне доволен. Тоже долго парился,искал а потом Сам придумал :)

С примером нехорошо получилось - пофиксил оказывается когда линух ставил... :(


 
MAxiMum   (2002-03-15 18:08) [34]

>Nest Ты, конечно, молодец. Ну не красиво это.

Я юзверю ведь красота нужна. Информативность вот.
Нумерация нужна, чтобы можно было определить на какой записи по номеру он находится (т.е. сколько сверху, снизу и т.д. - по крайней мере, так объяснили мне; я согласен).

Эге-ге-ге-гей! Меня-то кто-нибудь слышит!? :-(



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.006 c
1-22630
Anton+
2002-03-27 17:36
2002.04.08
Чем разделитель #10 отличается от #13?


14-22801
Pete
2002-02-26 14:04
2002.04.08
Как редактировать свою анкету???


1-22740
snoup
2002-03-26 23:47
2002.04.08
Почему не работает вот такая фигня: if timeover = 10 then label1.color:=clred;??????


3-22557
andyway
2002-03-14 06:12
2002.04.08
Расчет таблиц по базе


14-22846
Olgerd
2002-02-26 03:35
2002.04.08
А здесь вы найдете архивы старых форумов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский