Як визначити зміну фокуса рядки в tdbgrid

CPU not found. Press any key to continue

Використовуйте подія OnDataChange об'єкта Datasource, з'єднаного з DBGrid. Якщо параметр State в обробнику подія дорівнює dsBrowse, значить ви перейшли в новий рядок (або тільки що відкрили таблицю).

Чому сітка не підтримує таку подію? Оскільки сітка може бути не єдиним елементом управління, оторбажающім дані з поточного рядка і може бути не єдиним елементом, що дозволяє здійснювати переміщення від рядка до рядка. За допомогою Datasource обробка події здійснюється централізовано.

Я не впевнений в тому, що проблему можна вирішити, обробляючи подія одинарного клацання, для відстеження події зміни рядків я рекомендую використовувати подія TDatasource.OnDataChange, а для колонок - TDBGrid.OnColEnter / Exit.

Особисто я користуюся наступного робочого технологією:
  1. Для того, щоб виявити зміни поточного рядка, скористайтеся подією TDataSource OnDataChange. OnDataChange виникає під час переміщення або клацанні на іншому рядку. Обробник події може виглядати приблизно так:

де Field є колонкою, де відбулася зміна.

Поля TTable можуть використовуватися для порівняння поточних вибраних рядків полів (ключ) до ваших вимог. З тією ж метою можна використовувати і властивість TDBGrid Fields. Для прикладу:


  • Для відстеження зміни колонки, використовуйте події TDBGrid OnColExit OnColEnter. Для визначення обраної до теперішнього часу колонки скористайтеся властивостями TDBGrid SelectedField і SelectedIndex.

    Коли вибирається інша колонка іншого рядка, ви отримуєте події OnColExit, OnColEnter і OnDataChange.

  • Можна піти і "кривим" шляхом, взявшись за обробку події TDBGrid OnDrawDataCell, яке виникає коли осередок вибирається, або коли сітка скролліруется. Обробник події може виглядати приблизно так:

    При зміні осередку ви отримуєте потік подій, тому вам потрібно якимось чином їх фільтрувати.

  • Якщо у вас немає проблем у створенні "101 зміни" стандартних компонентів - що є проблемою для мене 8-), то спробуйте це. Це легко.

    Щоб мати доступ до індексу рядка або колонки вибраної комірки, ви повинні успадкувати ваш клас від TCustomGrid і опублікать властивості часу виконання Row і Col (поточні рядок і колонка сітки, не таблиці !!):

    у відповідній процедурі або обробнику події здійсните приведення типу:

    з чого я можу зробити висновок, що ви повинні це зробити програмним шляхом. Маємо на увазі, що сітка вже існує, і у вас є доступ до основної таблиці TTable:

    Можуть бути помилки, але це повинно допомогти.

    Подивіться на наступний код, він може вам допомогти. Він бере у елемента управління свойст 'Name' і поміщає його в властивість 'Caption' мітки.