StringGrid - вставка компонентов, проблема отображения.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

StringGrid - вставка компонентов, проблема отображения.

Сообщение wofs » 25.11.2017 14:01:16

Добрый день!
Создаю в рантайме нужный мне компонент:
Код: Выделить всё
       new(p_CheckBoxStockOnly);
       p_CheckBoxStockOnly^:=TCheckBox.Create(StringGrid);
       p_CheckBoxStockOnly^.Parent:=StringGrid;
       p_CheckBoxStockOnly^.Visible:=False;

       new(p_CheckBoxClearPrice);
       p_CheckBoxClearPrice^:=TCheckBox.Create(StringGrid);
       p_CheckBoxClearPrice^.Parent:=StringGrid;
       p_CheckBoxClearPrice^.Visible:=False;

       new(p_ComboBoxGroupAlgorithm);
       p_ComboBoxGroupAlgorithm^:= TCombobox.Create(StringGrid);
       with p_ComboBoxGroupAlgorithm^ do begin
         Parent:=StringGrid;
         Style:= csDropDownList;
         Items.Add('Фон + Цена');
         Items.Add('Фон + Идент.');
         Hint:='Выберите алгоритм поиска группы (только для "Группы в строках").';
         ShowHint:=true;
         Visible:=false;
       end;     


В событии onDrawCell рисую их в гриде:
Код: Выделить всё
     if  (acol=1) and (aRow=19) then
     begin
       if StringGrid.AutoEdit then
         begin
           TCheckBox(p_CheckBoxStockOnly^).Top:=arect.Top;
           TCheckBox(p_CheckBoxStockOnly^).Left:=arect.Left+50;
           TCheckBox(p_CheckBoxStockOnly^).Visible:=True;
         end;
     end;

     if  (acol=1) and (aRow=20) then
     begin
       if StringGrid.AutoEdit then
         begin
           TCombobox(p_ComboBoxGroupAlgorithm^).Width:=Arect.Width-5;
           TCombobox(p_ComboBoxGroupAlgorithm^).Top:=arect.Top+2;
           TCombobox(p_ComboBoxGroupAlgorithm^).Left:=arect.Left+2;
           TCombobox(p_ComboBoxGroupAlgorithm^).Visible:=True;
         end;
     end;

     if  (acol=1) and (aRow=21) then
     begin
       if StringGrid.AutoEdit then
         begin
           TCheckBox(p_CheckBoxClearPrice^).Top:=arect.Top;
           TCheckBox(p_CheckBoxClearPrice^).Left:=arect.Left+50;
           TCheckBox(p_CheckBoxClearPrice^).Visible:=True;
         end;
     end; 


В событии onTopLeftChanged скрываю ненужные мне компоненты при скроллинге:
Код: Выделить всё
var
    i:integer;
begin
   for i:=TStringGrid(Sender).VisibleRowCount to TStringGrid(Sender).rowcount-1 do
   begin
      case i of
        14: if p_CheckBoxGroupInRows <> nil then p_CheckBoxGroupInRows^.Visible:= false;
        19: if p_CheckBoxStockOnly <> nil then p_CheckBoxStockOnly^.Visible:= false;
        20: if p_ComboBoxGroupAlgorithm <> nil then p_ComboBoxGroupAlgorithm^.Visible:= false;
        21: if p_CheckBoxClearPrice <> nil then p_CheckBoxClearPrice^.Visible:= false;
      end;
   end; 

При открытии формы имею следущую проблему (при условии, что грид полностью умещается по высоте формы):
Скриншот 25-11-2017 133544.png


Если кликнуть по второй колонке, в любой строке (col=1) мышкой, то отображение нормализуется:
Скриншот 25-11-2017 133622.png


Понимаю, что что-то с моей отрисовкой компонент в гриде, только никак не могу понять в чем именно - помогите, пожалуйста.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение vitaly_l » 25.11.2017 14:54:18

redrow и/или repaint для грида, после открытия формы - пробовали? (что-то отрисовывается потом судя по коду хайдится, но экран после хайдинга не перерисовывает и поэтому такой дефект) ИМХО
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение wofs » 25.11.2017 15:26:39

vitaly_l писал(а):redrow и/или repaint для грида, после открытия формы - пробовали?

Код: Выделить всё
StringGrid.Repaint;

решило проблему - спасибо!
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение alexs » 27.11.2017 10:11:16

Совет - для работы с чекбоксом - не обязательно его создавать. Можно просто при кустомной отрисовке в гриде использовать темы и самому нарисовать чек-бокс. Сам грид так и работает - он чекбоксы сам рисует.
Из плюсов - нее будет лишних вызовов onEnter/OnExit при редактировании таких данных - логика упрощается.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение wofs » 27.11.2017 21:46:03

alexs писал(а):Совет - для работы с чекбоксом - не обязательно его создавать. Можно просто при кустомной отрисовке в гриде использовать темы и самому нарисовать чек-бокс. Сам грид так и работает - он чекбоксы сам рисует.
Из плюсов - нее будет лишних вызовов onEnter/OnExit при редактировании таких данных - логика упрощается.

Ничего не понял, извините - видимо мое время еще не пришло :)
У меня потребность в 3х чекбоксах в гриде на весь проект. СтрингГрид использую для заполнения настроек - вместо кучи едитов и пары-тройки чекбоксов. Мне показалось удобнее.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение alexs » 28.11.2017 10:59:35

чтобы нарисовать чекбокс - всего 7 строк :-)

Код: Выделить всё
      if Trigger.Active then
        Details := ThemeServices.GetElementDetails(tbCheckBoxCheckedNormal)
      else
        Details := ThemeServices.GetElementDetails(tbCheckBoxUncheckedNormal);
      CSize := ThemeServices.GetDetailSize(Details);

      PaintRect := Bounds(R.Left + ((HeaderControl1.Sections[1].Width - CSize.cx) div 2) , (R.Top + R.Bottom - CSize.cy) div 2, CSize.cx, CSize.cy);
      ThemeServices.DrawElement(TreeView1.Canvas.Handle, Details, PaintRect, nil);
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: StringGrid - вставка компонентов, проблема отображения.

Сообщение wofs » 28.11.2017 18:28:02

alexs писал(а):чтобы нарисовать чекбокс - всего 7 строк :-)

Спасибо! Попробую!
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru