Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 Ты, конечно, молодец. Ну не красиво это.

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

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




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




Наверх





Память: 0.79 MB
Время: 0.036 c
1-22686           Goblinus              2002-03-26 13:44  2002.04.08  
ComboBox


6-22776           apav                  2002-01-24 16:19  2002.04.08  
Как послать NetBIOS-пакет?


3-22526           msc                   2002-03-13 23:30  2002.04.08  
Уважаемые, помогите!


3-22607           xim                   2002-03-17 15:47  2002.04.08  
Помогите советом, сломалась таблица parodox.


7-22855           vlv                   2002-01-14 15:00  2002.04.08  
IDataObject