Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор определенной строки в DBGrid, Не могу правильно выделить нужную строку 
V
    Опции темы
Kbl4AH
Дата 26.6.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Здравствуйте, уважаемые.
Я столкнулся со следующей проблемой...

У меня на форме есть DBGrid, который заполняется данными из OracleDataSet, причем количество строк постоянно для любого запроса.
Я обновляю запись в таблице через OracleQuery и, чтобы в DBGrid отобразились измененные данные, обновляю OracleDataSet 
Код

OracleDataSet.Refresh;

После этого автоматически выделяется 1-я строка в DBGrid, а мне нужно, чтобы выделение оставалось на редактируемой строке (чтобы было удобно работать, если DBGrid содержит большое количество строк).  
Пошарил немного в DRKB и наваял процедуру:
Код

type
TFake = class(TDBGrid);

procedure TForm1.ObnovlenieGrida(Sender: TObject);

var
 Nach: Integer;
begin

 Nach:= TFake(DBGrid1).Row;
 with DataModule do OracleDataSet1.Refresh;
 TFake(DBGrid1).Row:= Nach;

end;

Получилось, но только не так как нужно:(
Вроде выделяется нужная строка, но когда начинаю стрелками перемещаться по DBGrid, то выясняется, что движение все равно начинается с 1-й строки, а не с выделенной.
Подскажите, пожалуйста, как сделать правильно.
Заранее всем признателен!

Это сообщение отредактировал(а) Kbl4AH - 26.6.2008, 21:16
PM MAIL ICQ   Вверх
Deniz
Дата 27.6.2008, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Можно через первичный ключ или уникальный набор полей.
Код
i:=DataSet.FieldByName('Первичный Ключ').asInteger;
DataSet.Close;
DataSet.Open;
DataSet.Locate('Первичный Ключ', i, []);



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Данкинг
Дата 28.6.2008, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Запоминай текущую строку, а потом на неё возвращайся. Как вариант.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Kbl4AH
Дата 28.6.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



2Deniz У меня в запросе сделано объединение запросов из 2-х таблиц. Как в данном случае использовать первичный ключ?
2Данкинг Так я вроде так и делаю: 
Цитата

Вроде выделяется нужная строка, но когда начинаю стрелками перемещаться по DBGrid, то выясняется, что движение все равно начинается с 1-й строки, а не с выделенной.

PM MAIL ICQ   Вверх
Vas
Дата 29.6.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Код

var SaveBookmark:TBookmark;
Begin
  if OracleDataSet.Active then
    begin
      OracleDataSet.DisableControls;
      SaveBookmark:=OracleDataSet.GetBookmark;
      OracleDataSet.Refresh;
      OracleDataSet.GotoBookmark(SaveBookmark);
      OracleDataSet.EnableControls;
    end;



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Deniz
Дата 30.6.2008, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Kbl4AH @  28.6.2008,  16:36 Найти цитируемый пост)
У меня в запросе сделано объединение запросов из 2-х таблиц. Как в данном случае использовать первичный ключ?
Читай внимательно:
Цитата(Deniz @  27.6.2008,  08:41 Найти цитируемый пост)
или уникальный набор полей.


Vas, неплохо бы после переоткрытия проверить валидность закладки.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Vas
Дата 30.6.2008, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Deniz, если закладка не валидна ничего не произойдет, указатель останется на первой записи. 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 2.9.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Vas @ 30.6.2008,  06:46)
если закладка не валидна ничего не произойдет, указатель останется на первой записи.

2Vas Использовал кусок кода, который ты привел выше. Все замечательно работает. Но только сейчас обнаружил маленький нюанс. Оказывается число записей возвращаемых ДатаСетом может измениться. И в случае, когда в Гриде была  выделена последняя строка (после апдейта таблицы эта запись не возвращается запросом), после обновления ДатаСета выдается ошибка "Bookmark not found". Типа запрос выдавал 15 записей (а у меня была выделена именно 15-я строка и я сделал ее апдейт), а после апдейта он возвращает 14, и при обновлении ДатаСета Делфи ругается(((
Подскажи, пожалуйста, как избавиться от этого?
PM MAIL ICQ   Вверх
Vas
Дата 2.9.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Странно, вообще, если закладка не найдена, он должен просто становиться на первую и все. Мессагу можно подавить блоком try ..except.
Та запись на которой стоит букмарк остается на месте, и становится просто 14 в порядке, я правильно понял?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 2.9.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Vas @ 2.9.2008,  15:58)
Странно, вообще, если закладка не найдена, он должен просто становиться на первую и все. Мессагу можно подавить блоком try ..except.
Та запись на которой стоит букмарк остается на месте, и становится просто 14 в порядке, я правильно понял?

Нет, 15-я запись в обновленной выборке вобще отсутствует, а 14 других остаются.
А как трай/ексцепт пользоваться? Просто в начале блока поставить трай, а в конце ексцепт?
И еще после ошибки прога начинает глючить - исчезает возможность перемещения по строкам Грида (всегда выделена одна строка).
(((

Это сообщение отредактировал(а) Kbl4AH - 2.9.2008, 23:34
PM MAIL ICQ   Вверх
Deniz
Дата 3.9.2008, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Vas @  2.9.2008,  18:58 Найти цитируемый пост)
Странно, вообще, если закладка не найдена, он должен просто становиться на первую и все. Мессагу можно подавить блоком try ..except.
а ведь давно было:
Цитата(Deniz @  30.6.2008,  08:47 Найти цитируемый пост)
Vas, неплохо бы после переоткрытия проверить валидность закладки. 

Kbl4AH,
Цитата(Deniz @  27.6.2008,  08:41 Найти цитируемый пост)
Можно через первичный ключ или уникальный набор полей.
но если хотите добить закладки - удачи.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Kbl4AH
Дата 3.9.2008, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Vas vs Deniz  Кто кого?  О_о
)))

2Deniz  Мне кажется, что первичный ключ или уникальный набор не подойдет, ведь после апдейта таблицы исходная запись уже не выбирается, то есть опять будет попытка выделения строки, которая отсутствует в Гриде.

2Vas Добавил условие на проверку валидности
Код

if OracleDataSet1.BookmarkValid(SaveBookmark) then
  OracleDataSet1.GotoBookmark(SaveBookmark);

Вроде нормально все стало работать)))

P.S. Бывалые люди, подскажите, пожалуйста, где можно почитать нормальную доку на русском по компонентам палитр DataAccess и DataControls, а то с пендосовским плохо дружу? Может ссылочки какие знаете хорошие или так у кого на винте есть и можете выслать или выложить? Очень надо...

Это сообщение отредактировал(а) Kbl4AH - 3.9.2008, 08:07
PM MAIL ICQ   Вверх
Vas
Дата 3.9.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Итак провел тест все нормально работает без проверки валидности закладки и без всяких блоков try..except, указатель при отсутствии записи  становится на первую запись в гриде, никаких мессаг не выдается, так что х.з. почему у вас так не получается. Я ставил указатель на последнюю запись в гриде, другой человек ее удалял, после рефреша грида указатель выскочил на первую и все, причем рефреш у меня в проге делается программно через каждую минуту.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 3.9.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Vas @ 3.9.2008,  10:36)
Я ставил указатель на последнюю запись в гриде, другой человек ее удалял, после рефреша грида указатель выскочил на первую

Хм О_о
А у меня не так. Когда удаляю последнюю строку грида (закладка становится не валидна, а значит не срабатывает условие
Код

if OracleDataSet1.BookmarkValid(SaveBookmark) then
  OracleDataSet1.GotoBookmark(SaveBookmark);
), то автоматом выделяется последняя (номер закладки - 1) существующая строка.

Это сообщение отредактировал(а) Kbl4AH - 3.9.2008, 12:50
PM MAIL ICQ   Вверх
Vas
Дата 4.9.2008, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Kbl4AH @  3.9.2008,  12:48 Найти цитируемый пост)
Когда удаляю последнюю строку грида

Ты сам удаляешь? Зачем закладки при удалении использовать, они больше нужны при обновлении грида, когда не знаешь что там другие наделали. А после удаления сам и позиционируй куда надо указатель, строки то удаленной точно нет smile


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1209 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.