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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2013, 04:35   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию Определение ID записи по клику на ячейку в DBGrid

Здравствуйте.
Необходимо получить Id записи из списка записей представленных в DbGrid. Получать необходимо по клику пользователя на ячейке.
Реализовал вот так

Код:
procedure TMainF.DBGrid1CellClick(Column: TColumn);
var
   integer:id;
begin
   DBGrid1.DataSource.DataSet.RecNo:=TStringGrid(DBGrid1).Row;
   id:=DBGrid1.DataSource.DataSet.FieldByName('id').AsInteger;
end;
В работе этого кода есть косяк. Когда пользователь первый раз после запуска программы нажимает на ячейку DBGrida то всегда выбирается Id первой записи. Последующие клики выбирают нужную запись. Из за чего это может происходить и как избежать такой ситуации
Lokos вне форума Ответить с цитированием
Старый 21.10.2013, 07:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Первая строка присвоения в RecNo вообще не нужна.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.10.2013, 08:30   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

тога при нажатии автоматом переключается на последнию запись и пока не прокрутишь скрол вообще не реагирует, после прокрутки скрола все норм.

и если удалить какую либо запись из таблицы или добавить то происходит тоже самое при первом нажатии выделяется последняя строка и DBGrid не реагирует пока не нажмешь на ползунок потом отрабатывает как положенно

Последний раз редактировалось Lokos; 21.10.2013 в 08:40.
Lokos вне форума Ответить с цитированием
Старый 21.10.2013, 08:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
тога при нажатии автоматом переключается на последнию запись и пока не прокрутишь скрол вообще не реагирует, после прокрутки скрола все норм.
мне кажется, что Вы не всё рассказываете. у Вас явно работает какой-то ещё обработчик события. Вот он и приводит к подобному поведению. (проверяйте все обработчики событий, назначенных на DBGrid1 и связанный DataSet ).
О том, что Вы не говорите правду, свидетельствует хотя бы тот факт, что код
Цитата:
Код:
var
   integer:id;
вообще не должен компилироваться!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.10.2013, 08:56   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

вы меня раскусили))) id глобальный))) у DBGrid'a 2 обработчика DBGrid1CellClick и DBGrid1DrawColumnCell во втором раскраска строк ее отключал эффекта не какого.
Нашел проблему

после манипуляций с записями выполняется вот такая функция

Код:
procedure TestConnectionForBase();
var i:Byte;
   count:Integer;
begin
   try
      count:=0;
      DataModule2.SDSMainForm.Close;
      DataModule2.SDSMainForm.DataSet.CommandText:='select * from vahta_table where FlagExit=0';
      DataModule2.SDSMainForm.Active:=True;
      DataModule2.SDSMainForm.Open;
      DataModule2.SDSMainForm.Last;//проблема вот в этой строчке переход на последнюю запись.
      count:=DataModule2.SDSMainForm.RecordCount;
      MainF.lblStatus.Font.Color:=clLime;
      MainF.lblStatus.Caption:='Статус подключения к базе: Подключено';
     // if count>1 then
       //  begin
            for i := 1 to 2 do
               MainF.DBGrid1.Fields[0].Visible:=False;
            MainF.DBGrid1.Fields[7].Visible:=False;
            for i := 1 to 2 do
               MainF.DBGrid1.Fields[8].Visible:=False;
            for i := 1 to 3 do
               MainF.DBGrid1.Fields[9].Visible:=False;
       //  end;
   except
      on E : Exception do
              begin
                // if chkError.Checked=true then
                  ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message);
                  MainF.lblStatus.Font.Color:=clRed;
                  MainF.lblStatus.Caption:='Статус подключения к базе: Нет подключения';
              end;
   end;
end;
но без нее я не получу количество выбранных записей. Возможно их как то еще можно получить?
В принципе эту функцию я переправил. Но не могли бы вы подсказать как организовать адекватный подсчет выбранных записей

Последний раз редактировалось Lokos; 21.10.2013 в 09:01.
Lokos вне форума Ответить с цитированием
Старый 21.10.2013, 09:04   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Lokos Посмотреть сообщение
вы меня раскусили))) id глобальный)))
Ага, попался!


Цитата:
Сообщение от Lokos Посмотреть сообщение
но без нее я не получу количество выбранных записей. Возможно их как то еще можно получить?
О. А теперь серьёзно.
Вы хотите сказать, что строчка:
Цитата:
Код:
    count:=DataModule2.SDSMainForm.RecordCount;
не возвращает количество записей?!!!


и ещё. важно.
из этих двух строк кода:
Цитата:
Код:
      DataModule2.SDSMainForm.Active:=True;
      DataModule2.SDSMainForm.Open;
оставьте ОДНУ (я бы оставил Open - но это, в принципе, не имеет разницы).
Вы ДВАЖДЫ открываете датасет!!

Последний раз редактировалось Serge_Bliznykov; 21.10.2013 в 09:06.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.10.2013, 09:09   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так попробуйте
Код:
  DataModule2.SDSMainForm.Last;
  count:=DataModule2.SDSMainForm.RecordCount;
  DataModule2.SDSMainForm.First;
Можно кол-во записей и отдельным запросом получить. А с циклами вообще не понял - зачем одно и то же в цикле делать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.10.2013, 09:14   #8
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

опа с двойным открытием и впрямь косяк.

RecordCount насколько я знаю возвращает номер текущей записи.

следовательно если выполнить метод Last то выполнится переход на последнюю запись и RecordCount покажет количество записей) Иначе не как(

хм сейчас попробовал все работает и без Last.
Идиотом себя ощущаешь до этого не работало
Lokos вне форума Ответить с цитированием
Старый 21.10.2013, 09:15   #9
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так попробуйте
Код:
  DataModule2.SDSMainForm.Last;
  count:=DataModule2.SDSMainForm.RecordCount;
  DataModule2.SDSMainForm.First;
Можно кол-во записей и отдельным запросом получить. А с циклами вообще не понял - зачем одно и то же в цикле делать?
с циклом сам не знаю проект год назад делал( может что то было(

Вспомнил
в принципе можно обойтись и без циклов но тогда придется сделать такую запись
Код:
MainF.DBGrid1.Fields[0].Visible:=False;
MainF.DBGrid1.Fields[0].Visible:=False;
MainF.DBGrid1.Fields[7].Visible:=False;
MainF.DBGrid1.Fields[8].Visible:=False;
MainF.DBGrid1.Fields[8].Visible:=False;
MainF.DBGrid1.Fields[9].Visible:=False;
MainF.DBGrid1.Fields[9].Visible:=False;
MainF.DBGrid1.Fields[9].Visible:=False;

Последний раз редактировалось Lokos; 21.10.2013 в 09:20.
Lokos вне форума Ответить с цитированием
Старый 21.10.2013, 09:18   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
опа с двойным открытием и впрямь косяк.
На самом деле это масло маслянное. Open просто делает Active:=True; а SetActive ничего не делает, если свойство не меняется. Но то что одно из них лишнее - факт
Цитата:
RecordCount насколько я знаю возвращает номер текущей записи.
Не правильно. Возвращает кол-во записей в DataSet- е. Last делают для того, что бы все нужные данные понянуло с базы, тогда и RecordCount правильный будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.10.2013 в 09:21.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать чтоб по клику в TreeView в DBGrid yaskin БД в Delphi 8 13.05.2012 10:42
Фильтрация по дв.клику DBGrid. sanchosss БД в Delphi 3 07.12.2011 13:52
по клику на ячейку дублировать содержимое johny_03 Microsoft Office Excel 2 20.09.2011 10:34
Создание новой формы по клику на стору в DBGrid insense БД в Delphi 9 14.06.2010 13:28
Как правильно получить координаты по клику на ячейку таблицы? Stilet JavaScript, Ajax 3 26.08.2009 16:19