Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> компонент TDBCheckListBox синхронизация 
:(
    Опции темы
elvis79
Дата 23.6.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.11.2008
Где: Украина, Ивано-Фр анковск

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



Создаю компонент TDBCheckListBox -- список значений из таблици БД с возможностю выбора. Для связи с БД взял TFieldDataList. Второй день бьюсь с синхронизацией, т.е. чтоб когда двигатся в гриде по записям в лист-боксе тоже выделялась соответствующая запись. Переопределил процедуру:
Код

procedure TZDBCLBDataLink.DataSetScrolled(Distance: Integer);
begin
  inherited;
  if ValidListField then
    with FCheckListBox do
      ItemIndex := Items.IndexOf(DataSet.FieldByName(FieldName).AsString);
end;


Все работает при перемещении с помощю стрелок, мышки, вызова Next, First, Last, Prev, но вызов функции Locate пропускает это событие. Как сделать так, чтоб не пропускал?


PM MAIL WWW ICQ Jabber   Вверх
Frees
Дата 23.6.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



а в каком пакете ты взял TDBCheckListBox?

стандартного такого вроде нет


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
elvis79
Дата 23.6.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.11.2008
Где: Украина, Ивано-Фр анковск

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



Это название моего компонента. TCheckListBox который подключается к таблице БД и отображает одно из полей
PM MAIL WWW ICQ Jabber   Вверх
pseud
Дата 23.6.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(elvis79 @  23.6.2009,  11:06 Найти цитируемый пост)
 TCheckListBox который подключается к таблице БД и отображает одно из полей

т.е. одно из полей содержит некий checkable список?


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
elvis79
Дата 23.6.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.11.2008
Где: Украина, Ивано-Фр анковск

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



Нет, в таблице бд не указано какой елемент выделен. Да и не в этом вопрос

Код

  TZorDBCheckListBox = class;

  TZorDBCLBDataLink = class(TFieldDataLink)
  private
    FCheckListBox: TZorDBCheckListBox;
  protected
    procedure DataSetScrolled(Distance: Integer); override;
    procedure ActiveChanged; override;
    procedure RecordChanged(Field: TField); override;
    function ValidListSource: Boolean;
    function ValidListField: Boolean;
  public
    constructor Create(AOwner: TZorDBCheckListBox); reintroduce; virtual;
  end;


  TZorDBCheckListBox = class(TCheckListBox)
  private
    { Private declarations }
    FListLink: TZorDBCLBDataLink;
    FListField: string;
    procedure SetListField(const Value: string);
    procedure SetListSource(const Value: TDataSource);
    function GetListSource: TDataSource;
  protected
    { Protected declarations }
    procedure RefreshList; virtual;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Items;
  published
    { Published declarations }
    property ListSource: TDataSource read GetListSource write SetListSource;
    property ListField: string read FListField write SetListField;
  end;

//***********************

{
срабатывает при скролировании -- выделяет в листбоксе 
элемент связаный с активной записью таблици БД
}
procedure TZorDBCLBDataLink.DataSetScrolled(Distance: Integer);
begin
  inherited;
  if ValidListField then
    with FCheckListBox do
      ItemIndex := Items.IndexOf(DataSet.FieldByName(FieldName).AsString);
end;

{
заполнение списка значениями поля БД
}
procedure TZorDBCheckListBox.RefreshList;
var
  VOldPlace: TBookmark;
begin
  if FListLink.ValidListSource and FListLink.DataSet.Active
    then
    with FListLink.DataSet do
    begin
      DisableControls;
      FListLink.FieldName := FListField;
      if FListLink.ValidListField then
      begin
        VOldPlace := FListLink.DataSet.GetBookmark;
        Items.Clear;
        First;
        while not Eof do
        begin
          Items.Add(FieldValues[FListField]);
          Next;
        end;
        FListLink.DataSet.GotoBookmark(VOldPlace);
      end;
      EnableControls;
      Enabled := True;
    end
  else
  begin
   Enabled := False;
   Items.Clear;
  end;
end;


Вопрос. Если я скролирую dataset с помощью прцедур Next, First, Last, Prev, перемещаюсь с помощью курсора по записям то все ок -- код процедуры DataSetScrolled срабатывает. А если вызвать функцию Locate для DataSet, то єтот код пропускается. Пошаговая отладка показала что курсор туда не попадает.

Смотрел исходники TDBGrid, TDBEdit -- не помогли мне они (

Код

Компонент разработан на примере TmmDBListRadioGroup "Разработка DB-Aware компонентов" http://www.rsdn.ru/?article/delphi/dbaware.xml


Это сообщение отредактировал(а) elvis79 - 23.6.2009, 13:43
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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