Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2010, 22:20   #1
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию Пронумеровать записи в DBGridEh

Искал и яндексом и по форуму. Много чего нашел, но ничего не получается. Нужно сделать что бы у данных выведенных в DBGridEh был номер.
Данные выводяться в DBGrid через SQL запрос. Запрос формирую с добавлением поля, т.е.
Код:
Query1.SQL.Append('SELECT Author, Title, Foto, Fixed, '''' as Num FROM data_bd';
Получаем еще одно поле в каждой записи. Но при попытке редактирования записей "прям так" получаем ошибку, мол, поле Num не может быть изменено, что, в принципе, логично.
Единственное что, пока приходит в голову, это создать в базе еще одно поле и в нем самому рисовать по OnDrawCell. Есть более нормлаьные варианты?

Пробовал, кстати, и создавая поле в Query, и менять его потом по OnGetText, но событие не возникает почему то....
Sergey2 вне форума Ответить с цитированием
Старый 11.03.2010, 01:08   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вроде на виду:
http://www.programmersforum.ru/showthread.php?t=60027
mihali4 вне форума Ответить с цитированием
Старый 12.03.2010, 22:15   #3
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Да. Видел. Спасибо. Искал в инет. Много читал. Но у меня не получается. Пример с приведенной темы работает, пытаюсь под себя переписать - облом.
У меня все создается в рантайме:
Код:
      aQuery[k]:=TQuery.Create(Form1);
      aQuery[k].DatabaseName:=ExtractFilePath(ParamStr(0));
      aDataSource[k].DataSet:=aQuery[k];
      aQuery[k].RequestLive:=True;
...
      aDBGrid[k]:=TDBGridEh.Create(Form1);
      aDBGrid[k].Parent:=Form1;
      aDBGrid[k].Left:=24;
      aDBGrid[k].Top:=-72+136*k;
      aDBGrid[k].Height:=97;
      aDBGrid[k].Width:=1045;
      aDBGrid[k].DataSource:=aDataSource[k];
      aDBGrid[k].Columns.Add;
      aDBGrid[k].Columns.Add;
      aDBGrid[k].Columns[0].FieldName:='Author';
      aDBGrid[k].Columns[0].Title.Caption:='Автор';
      aDBGrid[k].Columns[0].Width:=80;
      aDBGrid[k].Columns[1].FieldName:='Title';
      aDBGrid[k].Columns[1].Title.Caption:=szTitle[k];
      aDBGrid[k].Columns[1].Width:=600;
      aDBGrid[k].Options:=[dgEditing,dgTitles,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
      aDBGrid[k].ShowHint:=True;
      aDBGrid[k].Tag:=k;
      aDBGrid[k].OnKeyPress:=DBGridKeyPress;
      aDBGrid[k].OnEnter:=DBGridEhEnter;
      aDBGrid[k].OnGetCellParams:=DBGridGetCellParams;
      aDBGrid[k].OnMouseMove:=DBGridEhMouseMove;
Все работает (ну без номера).

Добавляем в Query вычислямое поле:

Код:
var     Fld: TIntegerField;
..
      Fld:=TIntegerField.Create(aQuery[k]);
      Fld.FieldName:='RoNum';
      Fld.SetFieldType(ftInteger);
      Fld.DataSet:=aQuery[k];
      Fld.FieldKind:=fkCalculated;
      Fld.ReadOnly:=True;
      aQuery[k].Fields.Add(Fld);
      aQuery[k].OnCalcFields:=QueryCalcFields;
В запрос SQL так же добавляем это поле:
Код:
      aQuery[k].SQL.Append('SELECT Author, Title, '''' as RoNum FROM data_bd');
И в DBGridEh обавляем:
Код:
      aDBGrid[k].Columns.Add;
      aDBGrid[k].Columns[2].FieldName:='RoNum';
      aDBGrid[k].Columns[2].Title.Caption:='';
      aDBGrid[k].Columns[2].Width:=15;

Код:
      aQuery[k].OnCalcFields:=QueryCalcFields;
..
procedure TForm1.QueryCalcFields(DataSet: TDataSet);
begin
   DataSet.FieldByName('RoNum').AsInteger:=DataSet.RecNo;
end;
Запускаем и получаем номера из базы данных, т..е если SELECT выдал две записи, который в общей базе данных идут под номерами 15 и 18, то в двгриде вместо 1 и 2 будут стоять цифры 15 и 18.
Кроме того почему то не отображаются остальные поля (для них тоже что филды для квери надо руками прописывать)?
И при выходе ошибка Invalid Point Operation. Похоже созданный филд надо руками и прибивать

Ну да. Придеться все поля в рантайме пересоздавать, но с номером вопрос открытый
Инвалид поинт оперейшн пропало после удаления строки
Код:
aQuery[k].Fields.Add(Fld);
, странно, конечно, но оказалось достаточно указать DataSet у Field-а

Попробовал даже вот так:
Код:
procedure TForm1.DBGridEhDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
begin

if (DataCol=0) then
  begin
    ((Sender as TDBGridEh).Canvas.TextOut(Rect.Left + 2, Rect.Top + 2,
	  IntToStr((Sender as TDBGridEh).DataSource.DataSet.RecNo)));
  end;
все равно номера из БД, а не те что выведены.

Последний раз редактировалось Stilet; 16.03.2010 в 11:41.
Sergey2 вне форума Ответить с цитированием
Старый 16.03.2010, 11:38   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Sergey2, а чем Вас не устраивает свойство dghShowRecNo=True в OprionsEh?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.03.2010, 20:03   #5
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Sergey2, а чем Вас не устраивает свойство dghShowRecNo=True в OprionsEh?
у меня нет такого. У меня версия старая, которая еще бесплатная....
Sergey2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как пронумеровать обьедененные ячейки m_v_v Microsoft Office Excel 14 13.09.2010 19:08
Как в DBGrid пронумеровать строки Talemir БД в Delphi 26 14.08.2009 09:25
DBGridEh и Filter lexaltd БД в Delphi 3 28.05.2009 12:05
Выкрутасы с DBGridEh Killer_djon БД в Delphi 6 12.11.2007 11:08