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

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

Нумерация ячеек в DBGRID [D5, Paradox]


Страницы:   1 2

der ©   (2002-03-12 05:09:00) 

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


Shirson   (2002-03-12 12:11:00) [21]

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 вспоминаю изредка и с сожалением за потраченные годы :)


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

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


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

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


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

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

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 не могу.


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

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

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


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

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


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

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


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

А я крутила с 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;


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

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

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


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

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


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

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


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

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

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


Nest   (2002-03-12 09:12:00) [31]

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


sniknik   (2002-03-12 09:09:00) [32]

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


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

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


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

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


Страницы:   1 2

Наверх

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