Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обновление sCheckListBox


Автор: neweraser 14.6.2018, 15:37
Всем привет! Имеется такая процедура:
Код

procedure TDModule.AdvQueryAfterScroll(DataSet: TDataSet);
var
  i: Integer;
  Skills, CurSkill: String;
begin
  Skills:= AdvQuery.FieldByName('SKILLS').AsString;
  for i:= 0 to MainForm.SkillsSCheckListBox.Items.Count - 1 do
  begin
    CurSkill:= '"' + MainForm.SkillsSCheckListBox.Items[i] + '";';
    if AnsiPos(CurSkill, Skills) <> 0 then
      MainForm.SkillsSCheckListBox.Checked[i]:= True
    else
      MainForm.SkillsSCheckListBox.Checked[i]:= False;
  end;
end;

В которой я пробегаюсь по списку SkillsSCheckListBox и, если текущая запись найдена в поле датасета SKILLS - отмечаю чекбокс. Т.е. приходится так извращаться после каждого перехода по датасету, из-за чего список уж очень неприятно моргает. Можно ли как-то убрать мерцание или переписать прорисовывание, чтобы менялись только сами чекбоксы без текста после них? 
Надеюсь правильно донёс  smile 
DoubleBuffered пробовал - не помогает

Автор: Romikgy 14.6.2018, 20:21
как часто вызывается AdvQueryAfterScroll ?

Добавлено @ 20:28
Код

procedure TDModule.AdvQueryAfterScroll(DataSet: TDataSet);
var
  i: Integer;
  Skills, CurSkill: String;
begin
  Skills:= AdvQuery.FieldByName('SKILLS').AsString;
SendMessage(MainForm.SkillsSCheckListBox.Handle, WM_SETREDRAW, 0, 0);
  for i:= 0 to MainForm.SkillsSCheckListBox.Items.Count - 1 do
  begin
    CurSkill:= '"' + MainForm.SkillsSCheckListBox.Items[i] + '";';
    if AnsiPos(CurSkill, Skills) <> 0 then
      MainForm.SkillsSCheckListBox.Checked[i]:= True
    else
      MainForm.SkillsSCheckListBox.Checked[i]:= False;
  end;
SendMessage(MainForm.SkillsSCheckListBox.Handle, WM_SETREDRAW, 1, 0);
MainForm.SkillsSCheckListBox.Refresh; // надо или нет не уверен.....
end;

Автор: neweraser 15.6.2018, 08:57
Цитата(Romikgy @  14.6.2018,  20:21 Найти цитируемый пост)
как часто вызывается AdvQueryAfterScroll ?

По мере того, как пользователь выбирает записи в датасете, т.е. может крутить колесиком мыши, перебирая их довольно быстро, а может по одной тыкать мышкой.

Цитата(Romikgy @  14.6.2018,  20:21 Найти цитируемый пост)
MainForm.SkillsSCheckListBox.Refresh; // надо или нет не уверен.....

Не надо, с рефрешем мерцает)

Но в общем-то заметно меньше стало мерцать, не пойму от чего зависит, иногда чекбоксы отрисовываются красиво, а иногда моргают. Тему наверное закрываю, если есть еще идеи - напишите плз, буду пробовать, но и на этом большущее спасибо!  smile 

Да, может кому пригодится, в uses нужно добавить Messages и WinProcs, если их там нет.

Автор: Romikgy 15.6.2018, 09:32
Цитата(neweraser @  15.6.2018,  07:57 Найти цитируемый пост)
если есть еще идеи 

я так понимаю состояния Checked[i] меняется редко .... я бы хранил отдельно список всех состояний и только в случае , если хоть один поменял статус перерисовывал все....

Автор: neweraser 15.6.2018, 10:01
Цитата(Romikgy @  15.6.2018,  09:32 Найти цитируемый пост)
состояния Checked[i] меняется редко

Там более 30 чекбоксов, при выборе строки в датасете часть из них (от 2-х до 15) перерисовывается. Если только как-то перерисовывать отдельно взятые чекбоксы, но я думаю так дольше будет работать, или я не правильно понимаю)))

хм... Отключил DoubleBuffered и все заработало как надо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)