Форум: "Базы";
Текущий архив: 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.005 c