StringGrid и FormResize

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

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

StringGrid и FormResize

Сообщение Mushroomer » 20.12.2017 14:54:04

Здравствуйте.

Есть PageControl с несколькими TabSheet-ами, на одном из которых лежит StringGrid.
В событии FormResize:
Код: Выделить всё
StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];

Если активен TabSheet с таблицей, ColWidths[2] при изменении ширины формы меняет ширину как положено.
Если переключиться на другой TabSheet, изменить ширину формы и вернутся на TabSheet с таблицей, то обнаруживается, что ColWidths[2] ширину не изменила.
Columns в StringGrid имеют разную ширину (если бы одинаковую то StringGrid1.AutoFillColumn := true спасло бы "Гиганта мысли, отца русской демократии и особу, приближенную к императору".
Может, что-нибудь посоветуете?
Последний раз редактировалось Mushroomer 20.12.2017 22:44:57, всего редактировалось 1 раз.
Mushroomer
новенький
 
Сообщения: 20
Зарегистрирован: 04.12.2017 15:07:39

Re: StringGrid и FormResize

Сообщение vitaly_l » 20.12.2017 16:10:03

Mushroomer писал(а):Если переключиться на другой TabSheet, изменить ширину формы и вернутся на TabSheet с таблицей, то обнаруживается, что ColWidths[2] ширину не изменила

Естественно не изменила, т.к. FormResize и переключение TabSheet <=== это не одно и тоже. Соответственно, нужно на переключение TabSheet повесить тот же самый код что и на FormResize. Тогда всё за-фурычит.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid и FormResize

Сообщение Mushroomer » 20.12.2017 19:21:14

vitaly_l писал(а):Естественно не изменила

Мне почему-то кажется, что это противоестественно.
Событие FormResize происходит не зависимо от того на какой вкладке PageControl-а я нахожусь. А в событии FormResize написано
Код: Выделить всё
StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];

Пробовал в событии TabSheet.Show писать тот же код - не помогает.
Mushroomer
новенький
 
Сообщения: 20
Зарегистрирован: 04.12.2017 15:07:39

Re: StringGrid и FormResize

Сообщение vitaly_l » 20.12.2017 19:35:05

Mushroomer писал(а):не помогает

Попробуйте кнопку разместить на форме, с кодом из FormResize и после переключения кликать по ней.
Кроме того, обязательно, добавьте туда StringGrid1.repaint; , после кода из FormResize.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid и FormResize

Сообщение Лекс Айрин » 20.12.2017 20:51:48

Mushroomer писал(а):Мне почему-то кажется, что это противоестественно.
Событие FormResize происходит не зависимо от того на какой вкладке PageControl-а я нахожусь.


Событие Resize не посылается при переключении на другую вкладку. Это вполне нормальное явление. Окно же не знает, что при этом оно должно изменить размер. Так что тебе придется либо самостоятельно послать это сообщение, либо продублировать код.

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

Второй способ более муторно оформляется -- надо добавить несколько модулей поддержки, а потом уже посылать сообщение. Если делать это кросс-платформенно. Так что откровенно говоря, не думаю, что он так уж реально необходим в данном случае. Да и придется поискать как называется само сообщение.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: StringGrid и FormResize

Сообщение Mushroomer » 20.12.2017 22:22:46

Печально, но в delphi xe6 это работает без всякого гемороя. Будем искать ...

Добавлено спустя 20 минут 9 секунд:
В событии PageControl1MouseDown прописал
Код: Выделить всё
StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];

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

Re: StringGrid и FormResize

Сообщение Лекс Айрин » 21.12.2017 09:43:50

Mushroomer писал(а):Печально, но в delphi xe6 это работает без всякого гемороя. Будем искать ...


Что, если подумать, является косяком дельфи.

Кстати, можно просто на оба события повесить один и тот же обработчик.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: StringGrid и FormResize

Сообщение vitaly_l » 21.12.2017 10:06:09

Mushroomer писал(а):Печально, но в delphi xe6 это работает без всякого гемороя. Будем искать ...

Добавлено спустя 20 минут 9 секунд:
В событии PageControl1MouseDown прописал
StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];

Стало легче.

УЖАС!!! Совершенно не художественный подход к программированию! Сразу видно, человек знает только примитивный Делфи xe6.
Ну там же есть onShow для каждой TabSheet! Вот в этот onShow для TabSheet, на которой лежит StringGrid - сделайте вызов функции onResaze и выкиньте уже этот Ваш примитивный Дельфи вместе с допотопным Борландом из головы, они Вам мешают учиться настоящему Художественному программированию. Вы бы ещё на onMouseMove - прописали перерисовку...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid и FormResize

Сообщение Mushroomer » 21.12.2017 10:28:53

vitaly_l писал(а):Ну там же есть onShow для каждой TabSheet! Вот в этот onShow для TabSheet, на которой лежит StringGrid - сделайте вызов функции onResaze

Друг мой, если бы вы внимательно читали то, что я писал ранее, вы бы заметили, что я пробовал такой вариант с отрицательным результатом.

Лекс Айрин писал(а):Кстати, можно просто на оба события повесить один и тот же обработчик.

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

Re: StringGrid и FormResize

Сообщение vitaly_l » 21.12.2017 10:47:28

Mushroomer писал(а):vitaly_l писал(а): Ну там же есть onShow для каждой TabSheet! Вот в этот onShow для TabSheet, на которой лежит StringGrid - сделайте вызов функции onResaze

Mushroomer писал(а): Друг мой, если бы вы внимательно читали то, что я писал ранее, вы бы заметили, что я пробовал такой вариант с отрицательным результатом.

Если бы Вы умели внимательно читать, и осознавали бы прочитанное, то заметили бы разницу между: Show и onShow для TabSheet.

Добавлено спустя 7 минут 77 секунд:
Mushroomer писал(а):TabSheet.Show

И ещё немного ликбеза... TabSheet.Show <== это далеко не событие onShow... Повторяю, постарайтесь заметить разницу, между Show и onShow Друг мой :wink: .

Так вот, onShow нужно брать для TabSheet, а не для PageControl !
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid и FormResize

Сообщение Mushroomer » 21.12.2017 11:52:43

vitaly_l писал(а):то заметили бы разницу между: Show и onShow для TabSheet

Признаю, что написал не правильно, конечно я имел ввиду событие onShow для TabSheet.
vitaly_l писал(а):Повторяю, постарайтесь заметить разницу, между Show и onShow
- ушел в магазин за учебником, а вы проверьте пока на деле как ваш совет работает.

Лекс Айрин писал(а):Кстати, можно просто на оба события повесить один и тот же обработчик.

Сделал по вашему совету, все работает. Будьте добры, гляньте, правильно ли я сотворил обработчик на два события, вдруг я чего не учитываю.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  Grids;
type
  { TForm1 }

  TForm1 = class(TForm)
    PageControl1: TPageControl;
    StringGrid1: TStringGrid;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    procedure FormCreate(Sender: TObject);
  private
    procedure OwnFormResize(Sender: TObject);
  end;

var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  OnResize := @OwnFormResize;
  PageControl1.Pages[3].OnResize := @OwnFormResize;
end;

procedure TForm1.OwnFormResize(Sender:TObject);
begin
  StringGrid1.ColWidths[2] := StringGrid1.ClientWidth - StringGrid1.ColWidths[0] - StringGrid1.ColWidths[1];
end;
end.
Mushroomer
новенький
 
Сообщения: 20
Зарегистрирован: 04.12.2017 15:07:39

Re: StringGrid и FormResize

Сообщение vitaly_l » 21.12.2017 12:09:08

Mushroomer писал(а):проверьте пока на деле как ваш совет работает

Код: Выделить всё
procedure TForm1.TabSheet3Show(Sender: TObject);
begin
  FormResize(Self);
end;     

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

И у меня получилось на одну строку меньше кода.

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  PageControl1.Pages[3].OnResize := @FormResize;
end;

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

И опять у меня получилось на одну строку меньше кода.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: StringGrid и FormResize

Сообщение Mushroomer » 21.12.2017 12:22:24

vitaly_l писал(а):И у меня получилось на одну строку меньше кода.

Не знаю почему, но ваш вариант у меня не работает.
Lazarus 1.8.0 r56594 FPC 3.0.4 i386-win32-win32/win64

Не работает FormResize(Self);
Второй вариант в норме.
Mushroomer
новенький
 
Сообщения: 20
Зарегистрирован: 04.12.2017 15:07:39

Re: StringGrid и FormResize

Сообщение Лекс Айрин » 21.12.2017 12:36:45

Mushroomer, можно и так. А в принципе, достаточно назначить один обработчик прямо в дизайнере форм. Так делают, обычно, если надо создавать формы/компоненты динамически.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: StringGrid и FormResize

Сообщение vitaly_l » 21.12.2017 12:38:07

Mushroomer писал(а):Не знаю почему, но ваш вариант у меня не работает.
Lazarus 1.8.0 r56594 FPC 3.0.4 i386-win32-win32/win64

Точно не уверен, но мой хрустальный ванго-шар, подсказывает, что Вы забыли убрать вот эту "хрень" из кода:

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  OnResize := @OwnFormResize;
  PageControl1.Pages[3].OnResize := @OwnFormResize;
end;

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

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru