[Решено]Не могу полноценно управлять вторым окном.

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

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

[Решено]Не могу полноценно управлять вторым окном.

Сообщение SilverShadow » 30.11.2015 23:39:51

Создал пример для объяснения проблемы. В нём тупо создаю меню для изменения размеров окна 4 label, которым присваиваются исходные и текущие значения width & height. Всё без проблем - меняются из меню размеры окна, на label отображаются актуальные значения. Когда вызываю вторую форму, размеры из меню не изменяются, а если таскаю её за края - тоже не отображаются актуальные размеры. Сакраментальный вопрос - что я делаю не так?
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure MenuItem2Click(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem5Click(Sender: TObject);
    procedure MenuItem6Click(Sender: TObject);
    procedure MenuItem7Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

uses unit2;

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  label1.Caption:='Initial width: ' + inttostr(form1.Width);
  label2.Caption:='Initial height: ' + inttostr(form1.Height);
  label3.Caption:='Current width: ' + inttostr(form1.Width);
  label4.Caption:='Current height: ' + inttostr(form1.Height);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  label3.Caption:='Current width: ' + inttostr(form1.Width);
  label4.Caption:='Current height: ' + inttostr(form1.Height);
end;

procedure TForm1.MenuItem2Click(Sender: TObject);
begin
  form1.Close;
end;

procedure TForm1.MenuItem3Click(Sender: TObject);
begin
  RunForm2;
end;

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  form1.Width:=form1.Width+10;
end;

procedure TForm1.MenuItem5Click(Sender: TObject);
begin
  form1.Width:=form1.Width-10;
end;

procedure TForm1.MenuItem6Click(Sender: TObject);
begin
  form1.Height:=form1.Height+10;
end;

procedure TForm1.MenuItem7Click(Sender: TObject);
begin
  form1.Height:=form1.Height-10;
end;

end.


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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Menus;

type

  { TForm2 }

  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;

    procedure FormResize(Sender: TObject);
    procedure MenuItem2Click(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem5Click(Sender: TObject);
    procedure MenuItem6Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

  procedure RunForm2;

var
  Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }

procedure RunForm2;
begin
  with TForm2.Create(Application) do
  try
    label1.Caption:='Initial width: ' + inttostr(form2.Width);
    label2.Caption:='Initial height: ' + inttostr(form2.Height);
    label3.Caption:='Current width: ' + inttostr(form2.Width);
    label4.Caption:='Current height: ' + inttostr(form2.Height);
    ShowModal;
   finally
    free;
  end;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
  label3.Caption:='Current width: ' + inttostr(form2.Width);
  label4.Caption:='Current height: ' + inttostr(form2.Height);
end;

procedure TForm2.MenuItem2Click(Sender: TObject);
begin
  ModalResult := mrOK;
end;

procedure TForm2.MenuItem3Click(Sender: TObject);
begin
  form2.Width:=form2.Width+10;
end;

procedure TForm2.MenuItem4Click(Sender: TObject);
begin
  form2.Width:=form2.Width-10;
end;

procedure TForm2.MenuItem5Click(Sender: TObject);
begin
  form2.Height:=form2.Height+10;
end;

procedure TForm2.MenuItem6Click(Sender: TObject);
begin
  form2.Height:=form2.Height-10;
end;

end.


Если понажимать в меню второй формы пункты изменения размеров, то один раз значения изменятся при ручном изменении размеров окна, и затем снова не отображаются.
Последний раз редактировалось SilverShadow 01.12.2015 00:11:54, всего редактировалось 1 раз.
SilverShadow
новенький
 
Сообщения: 22
Зарегистрирован: 10.03.2010 17:48:59

Re: Не могу полноценно управлять вторым окном.

Сообщение скалогрыз » 30.11.2015 23:50:13

SilverShadow писал(а):Если понажимать в меню второй формы пункты изменения размеров, то один раз значения изменятся при ручном изменении размеров окна, и затем снова не отображаются.


тебе ещё везёт, что программа с ошибкой не валится!

так вот попробуй.
Код: Выделить всё
procedure RunForm2;
begin
  form2:=TForm2.Create(Application);
  with form2 do
  try
    label1.Caption:='Initial width: ' + inttostr(form2.Width);
    label2.Caption:='Initial height: ' + inttostr(form2.Height);
    label3.Caption:='Current width: ' + inttostr(form2.Width);
    label4.Caption:='Current height: ' + inttostr(form2.Height);
    ShowModal;
   finally
    free;
    form2:=nil;
  end;
 
end;

помни! with - зло! глобальные переменные - зло! паскаль - зло!

следить за сообщениями (warning-ами) компилятора - добро!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Не могу полноценно управлять вторым окном.

Сообщение SilverShadow » 01.12.2015 00:11:25

Спасибо, помогло! А в чём дело было? Ведь и переменных никаких не объявлялось сверх тех, что были. А пример работы с окнами взят с этого сайта, http://www.freepascal.ru/article/lazarus/20050523080000.
SilverShadow
новенький
 
Сообщения: 22
Зарегистрирован: 10.03.2010 17:48:59

Re: [Решено]Не могу полноценно управлять вторым окном.

Сообщение скалогрыз » 01.12.2015 00:16:50

SilverShadow писал(а):Спасибо, помогло! А в чём дело было?

напрямую отвечать не буду, но намекну, что на указанном сайте, в примере с модальным окном нигде нет кода:
Код: Выделить всё
label1.Caption:='Initial width: ' + inttostr(form2.Width);

и подобного ему.

Предлагаю решить проблему "в чём было дело?" самостоятельно!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: [Решено]Не могу полноценно управлять вторым окном.

Сообщение SilverShadow » 01.12.2015 00:25:50

Thanks!!!
SilverShadow
новенький
 
Сообщения: 22
Зарегистрирован: 10.03.2010 17:48:59


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru