StringGrid и FormResize

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

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

Mushroomer
новенький
Сообщения: 20
Зарегистрирован: 04.12.2017 14:07:39

Сообщение Mushroomer »

vitaly_l писал(а): вот эту "хрень"
я убрал.
Всем большое спасибо, тема исчерпана.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Mushroomer писал(а):Всем большое спасибо, тема исчерпана.

И кстати более логично и разумно сделать вот так:

Код: Выделить всё

procedure TForm1.TabSheet3Show(Sender: TObject);
begin
   StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];
end;     

procedure TForm1.FormResize(Sender:TObject);
begin
   TabSheet3Show(nil);
end;

потому что, в FormResize - могут понадобится и другие действия несвязанные с TabSheet3Show.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Mushroomer
Для вашей ситуации вообще код писать не надо
В стрингриде есть свойство StringGrid1.AutoFillColumns
Его включаем
У колонок грида есть свойство .SizePriority
Для тех кто не должен ресайзиться ставим 0
Для всех прочих - 1
Всё.
Кстати это же поведение и DBGrid-а есть.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

alexs писал(а):код писать не надо

по моему, у него нужно делать на onShow только:

Код: Выделить всё

StringGrid1.Refresh;

т.к. при неактивном TabSheet не посылается команда на AutoFillColumns.
И если делать StringGrid1.Refresh и/или StringGrid1.Repaint,
то вот это будет лишней строкой: StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];
при включенном AutoFillColumns

.
Mushroomer
новенький
Сообщения: 20
Зарегистрирован: 04.12.2017 14:07:39

Сообщение Mushroomer »

alexs писал(а):alexs » 21.12.2017 13:46:41

Большое спасибо!

vitaly_l писал(а):на onShow StringGrid1.Refresh;
- это первое, что я пробовал.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Mushroomer писал(а):это первое, что я пробовал.

Вы технически не могли это пробовать "первым", т.к. onShow у Вас не работало (как минимум - пол топика, не работало).
Я Вам об этом пишу, т.к. судя по ответу, Вы, до сих пор не поняли где именно нужно указать StringGrid1.Repaint.
Впрочем пофигу.
Mushroomer
новенький
Сообщения: 20
Зарегистрирован: 04.12.2017 14:07:39

Сообщение Mushroomer »

vitaly_l писал(а):Вы, до сих пор не поняли где именно нужно указать StringGrid1.Repaint.

Вы должны делать скидку на то, что не все люди умны так как Вы.
StringGrid1.Repaint я прописывал здесь.

Код: Выделить всё

procedure TForm1.TabSheet4Show(Sender: TObject);
begin
  StringGrid1.Repaint;
end;
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Mushroomer писал(а):прописывал здесь

Так Вы же говорите, что в Вашей версии Лазаруса - именно эта функция (TForm1.TabSheet4Show) - не работает.
Соответственно и StringGrid1.Repaint; - не запускалось.
Mushroomer писал(а):Вы должны делать скидку

хрена лысого! Никаких скидок! Сегодня сделаешь программистам скидку, а завтра начнут падать самолёты и взрываться АЭС. Вон слышали, полетели все Фискальные накопители и страна понесла мультитриллиардный ущерб. А кто виноват? Правильно! Виноваты, программисты, которым делали скидку. Так что, никаких скидок, раз уж взялись писать крутые программы, будь-те любезны понимать почему они не работают, и осознавать от чего самолёты падают.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

vitaly_l писал(а):т.к. при неактивном TabSheet не посылается команда на AutoFillColumns.

Неправда ваша
Сейчас проверил GTK/WIN32 - всё работает.
Lazarus 1.9.0 r56811M FPC 3.1.1 x86_64-linux-gtk2
Lazarus 1.9.0 r56811M FPC 3.1.1 i386-win32-win32/win64
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

alexs писал(а):всё работает

"сдаюсь". Хотя и не понимаю: Зачем программе, отправлять hidden элементу, команду на refresh|repaint + AutoFillColumns?
Хотя, я всё ещё решаю задачу ТС с onShow в TabSheet... а у Вас скорее всего, работает onShow для StringGrid, так что 100% сдаюсь, т.к. 100% должно работать.
Последний раз редактировалось vitaly_l 21.12.2017 13:39:12, всего редактировалось 2 раза.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Может потому что ресайз<>отрисовка?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

alexs писал(а):ресайз<>отрисовка

Первое разве не вызывает второе. Нет?
А как же оно ресайзится без перерисовки?
Что опять самолёты падают и взрываются АЭС?

Или оно вначале ресайзится но не перерисовывается?
Так я поэтому и писал, что нужно сделать repaint.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

ресайз не требует прорисовки скрытого
но скрытые элементы должны пересчитать свои координаты для правильной отрисовки по требованию.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

alexs писал(а):скрытые элементы должны пересчитать свои координаты для правильной отрисовки по требованию

Дык я об этом и говорил, пол топика, предлагая сделать repaint.

И очень поддерживаю вот этот вариант, т.к. он в 100 раз более разумный, нежели городить огород:
alexs писал(а):В стрингриде есть свойство StringGrid1.AutoFillColumns
Его включаем
У колонок грида есть свойство .SizePriority
Для тех кто не должен ресайзиться ставим 0
Для всех прочих - 1
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

3 раза мышкой нажать, чтобы установить в инспекторе объектов значения свойств - это огород? А писать костыли - это не огород?
Просто зачем писать код, который дублирует штатный функционал?
Ответить