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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюк CheckListBox со стилем lbVirtual, не реагирует на изменение состояния chk 
:(
    Опции темы
MetalFan
  Дата 4.6.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



столкнулся однажды со следующей проблемой:
при использовании CheckListBox в "виртуальном" режиме
компонент перестает реагировать на нажатия чеков. так же игнорируется программное изменение состояния(
вместо правки компонента сделал упрощенный аналог на простом листбоксе.
кто сталкивался с таким глюком, кто как решил его?
з.ы. D6. в аттаче пример проекта. у кого посвежее IDE - поверьте плиз! может уже поправлен он)

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  CheckListBox_VirtualMode.rar 1,47 Kb


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
skyboy
Дата 5.6.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



столкнулся с тем же. почему-то, мне думается, проблему решить совсем не просто :(
код из сорцов:
Код

procedure TCheckListBox.SetChecked(Index: Integer; AChecked: Boolean);
begin
  if AChecked <> GetChecked(Index) then
  begin
    TCheckListBoxDataWrapper(GetWrapper(Index)).SetChecked(AChecked);
    InvalidateCheck(Index);
  end;
end;


Обратите внимание: происходит вызов некоегого getWrapper. Класс TCheckListBoxDataWrapper описан следующим образом:
Код

  TCheckListBoxDataWrapper = class
  private
    FData: LongInt;
    FState: TCheckBoxState;
    FDisabled: Boolean;
    FHeader: Boolean;
    procedure SetChecked(Check: Boolean);
    function GetChecked: Boolean;
  public
    class function GetDefaultState: TCheckBoxState;
    property Checked: Boolean read GetChecked write SetChecked;
    property State: TCheckBoxState read FState write FState;
    property Disabled: Boolean read FDisabled write FDisabled;
    property Header: Boolean read FHeader write FHeader;
  end;

Т.е. этот класс-обертка используется для хранения специфических относительно родителя(TCustomListBox) свойств отдельных item'ов: checked, enabled и прочие. Объект этого класса(тут уже пошли догадки - некогда глубоко копать) является оберткой вокруг "честного" items.objects(эта обертка устанавливается через сообщение, потому и лень дебажить глубже) так, что при необходимости программист получает items.objects, как будто никакой обертки там и нет. Причем обертка создается автоматически:
Код

function TCheckListBox.GetWrapper(Index: Integer): TObject;
begin
  Result := ExtractWrapper(Index);
  if Result = nil then
    Result := CreateWrapper(Index);
end;

и программисту вроде бы как видима быть не должна. Но это все работает в том случае, если объекты хранятся статически. Если же их запрашивать каждый раз заново по индексу(при Style = lbVirtual), то обертка все равно создается. Но нигде не сохраняется. И при  следующей перерисовке элемента(и, соотвественно, запросе данных) создается новая обертка. И свойство checked там по умолчанию установлено в false. Получается, и невозможно при стиле lbVirtual обеспечить хранение состояния. Разве что создавая СВОЙ объект таким образом, чтоб он наследовал TCheckListBoxDataWrapper, что не всегда возможно.
И, что самое обидно, что они не использовали интерфейсы - только приведение напрямую к классу, что, по-моему, исключает возможность решения проблемы, кроме как:
а) коррекции класса TCheckLisTBox
б) коррекции своего класса, чтоб он был наследником от TCheCKListBoxDataWrapper
Меня, например, оба варианта не устраивают :( Так что, пойду, как и MetalFan, сделаю себе фичу на listbox'e с multiselect'ом smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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