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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2010, 06:03   #1
KaimNotark
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 23
По умолчанию убрать фокус из ячейки DBGreed

Добрый день, уважаемые форумчане.

К сожалению не смогу коротко объяснить суть задачки,
поэтому "не буду краток" )))

1. Имеется ДБГреед, в котором отображаются данные из запроса.
2. В ячейках одного столбца рисуется ЧекБокс.

3. При первом кликании по ЧекБоксу ставится/убирается крыжик.
3.1. Соответственно , фокус остается в этой ячейке
3.2. В БД записывается значение
3.3. Все работете прекрасно

4. При втором крикании по этому же ЧекБоксу
4.1. Квадратик ЧекБокса исчезает
4.2. Появляется поле (видимо, в режиме FocusControl)
4.3. В этом поле мигает курсор, значение поля выделено синим (видимо в фокусе)

Так вот, проблема в пункте 4. Иными словами, при повторном кликании по ЧекБоксу все должно проходить как в пункте 3.

Пытался решить задачку следующими путями:
1. Решил убрать фокус из ДБГрееда на другой компонент.
1.1. Фокус убирается,
1.2. Однако проблема не решается.

2. Решил пременить FocusControl
2.1. После кликания по ЧекБоксу перенес этот FocusControl на соседнюю ячейку
2.2. Проблема решается
2.3. Возникает другая, юзер может по ошибке удалить данные из соседней ячейки.

Сдается мне, что я пытаюсь бороться со следствием проблемы. Вызвано это тем, что я не понимаю сущности происходящих процессов при кликании по ячейке ДБГрееда.

Может кто просветит?

Мне , наверное , нужна функция обратная FocusControl. Есть таковая?

Последний раз редактировалось KaimNotark; 17.02.2010 в 06:05. Причина: мысль пришедая позднее...
KaimNotark вне форума Ответить с цитированием
Старый 17.02.2010, 08:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А поставить для ДбГрида ReadOnly не пробовал или задача того не желает?
И кстати в его Options поставить нужные в False чтоб нельзя было редактировать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.02.2010, 06:36   #3
KaimNotark
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А поставить для ДбГрида ReadOnly не пробовал или задача того не желает?
И кстати в его Options поставить нужные в False чтоб нельзя было редактировать.
Попробовал - не помогло

Еще варианты ???
KaimNotark вне форума Ответить с цитированием
Старый 18.02.2010, 07:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Еще варианты ???
Чтоб что-то говорить нужно программу потрогать. Обычно то что я предложил хватает, значит стратегия тобой выбрана такая, что не годятся те методы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.02.2010, 03:52   #5
KaimNotark
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чтоб что-то говорить нужно программу потрогать. Обычно то что я предложил хватает, значит стратегия тобой выбрана такая, что не годятся те методы.
Разбираясь с примерами вышеописанной задачки столкнулся с тем, что везде подобную задачу решают с использованием "ListSelect". Пример кода см. ниже (код_1).

Я же, не зная и не понимая что такое "ListSelect", пошел другим путем – см. ниже код_2.

Видимо, выбрал не ту "дорожку". Прошу, если не трудно, объяснить что такое "ListSelect" и как он работает, т.к. хотелось бы писать прогу осознанно. В код_1 попытался понять самостоятельно. Результатами этой попытки явились ремарки к коду. Почитайте их, и если мое понимание не верно – исправьте комментарии.


код_1:

Код:
//---------------  ПРИ КЛИКАНИИ ПО ЯЧЕЙКЕ ГРИДА -----------------------------------------
procedure TformColorGrid.DBGridCellClick(Column: TColumn);
Var Value : Integer;
begin
   // смотрим по какой ячейке кликнули Check или не Check
   IF CompareText(Column.Field.FieldName , 'Check') = 0

   Then    // если ячейка, по которой кликнули - это Check
   Begin   // тогда
        // считываем значение ячейки Species No
        // видимо, чтобы определить номер записи, в кот. поставить флаг
        Value:=Column.Field.DataSet.FieldByName('Species No').AsInteger;
        { }
        // если количество выделенных строк больше нуля, то
        IF ListSelect.Count > 0
        Then
// смотрим, есть ли среди выделенных строк та, по которой кликнули
            IF ListSelect.IndexOf(Pointer(Value)) >=0
            Then 
// если есть, то удаляем ее из списка
              ListSelect.Delete(ListSelect.IndexOf(Pointer(Value)))
            Else
              Begin
// а если нету, то добавляем
              ListSelect.Add(Pointer(Value));
              End
        Else
          Begin
          ListSelect.Add(Pointer(Value));
          End;
         
    End;
код_2:

Код:
//---------------  ПРИ КЛИКАНИИ ПО ЯЧЕЙКЕ ГРИДА -----------------
// ставим или убераем флаг в ЧекБоксе и меняем значение в таблице БД

procedure TF_Vodila.DBGrid1CellClick(Column: TColumn);
Var
  FLAGV : boolean; // флаг состояния ячейки
  
begin
   //------- смотрим по какой ячейке кликнули V_WORK или не V_WORK
   IF CompareText(Column.Field.FieldName , 'V_WORK') = 0

   Then    // если ячейка, по которой кликнули - это V_WORK
      Begin   // тогда

        // смотрим поставлен флаг или нет
      if ZQuery_Vodila.FieldByName('V_WORK').AsInteger=1
      then FLAGV:=true
      else FLAGV:=false;

      ZQuery_Vodila.Edit; // переводим таблицу в режим редактирования

            if  FLAGV // если значение ячейки D_WORK1 равно 1, тогда
            then ZQuery_Vodila.FieldByName('V_WORK').AsInteger:=0 // присваеваем ему 0
            else ZQuery_Vodila.FieldByName('V_WORK').AsInteger:=1; // иначе присваеваем ему 1

      ZQuery_Vodila.Post; // сохраняем значение в таблице

   end;
   
End;
KaimNotark вне форума Ответить с цитированием
Старый 19.02.2010, 07:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ListSelect, это объект класса TList, использующийся для динамического списка. В приведенном тобой коде_1 он используется для хранения м.м.м... видимо номеров (по уникальному ключу) записей, которые ну похоже были выделены.
т.е. если запись выделяется - ее номер помещается в список, а если выделение снимается - то из списка удаляется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать фокус со StringGrid? TwiX Общие вопросы Delphi 2 25.08.2009 01:32
Как убрать фокус с TrackBar?????? NBSTUDIO Общие вопросы Delphi 1 11.08.2009 16:24
Убрать лишнее из ячейки. `Dmitry Microsoft Office Excel 8 24.03.2009 19:07
Убрать фокус со всех компонентов ? chandrasecar Общие вопросы Delphi 5 21.12.2008 00:56
Как разделить число и текст в одной ячейки на две ячейки. neboskreb Microsoft Office Excel 2 15.04.2008 19:39