Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2012, 19:08   #1
BlackFishSQL
Форумчанин
 
Аватар для BlackFishSQL
 
Регистрация: 02.04.2011
Сообщений: 136
По умолчанию MDI-окна

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

Опишу проблему! Есть главная форма(MainForm) и дочерняя(ChildForm).
Есть две кнопки CreateButton- создающаяя дочерние окна и кнопка Button1- кнопка для выравнивания окон. С нею то и проблемы.Я хочу сделать такой механизм. Выбирая в ComboBox1 вариант выравнивания и нажимая кнопку выровнять а хочу применить этот вариант! но что-то ни очень работает!
MainModule
Код:
unit MainModule;
...........
type
  TMainForm = class(TForm)
    Panel1: TPanel;
    CreateButton: TButton;
    Button1: TButton;
    GroupBox1: TGroupBox;
    ComboBox1: TComboBox;
    Edit1: TEdit;
    procedure CreateButtonClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses ChildUnit;

procedure TMainForm.CreateButtonClick(Sender: TObject);
begin
 ChildForm:=TChildForm.Create(Owner);
 Edit1.Text:=IntToStr(MDIChildCount);
end;

procedure TMainForm.Button1Click(Sender: TObject); // процедура выравнивания
begin
 case ComboBox1.ItemIndex of
  0 : Cascade;
  1 : begin
       TileMode:=tbHorizontal;
       Tile;
      end;
  2 : begin
       TileMode:=tbVertical;
       Tile;
      end;
 end;
end;
end.
И хотел ещё что бы в Edit1 на главнойформевыводилось текущее кол. доч форм.

Последний раз редактировалось BlackFishSQL; 29.02.2012 в 19:31.
BlackFishSQL вне форума Ответить с цитированием
Старый 29.02.2012, 19:11   #2
BlackFishSQL
Форумчанин
 
Аватар для BlackFishSQL
 
Регистрация: 02.04.2011
Сообщений: 136
По умолчанию

Код:
unit ChildUnit;

interface
..........
type
  TChildForm = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;

var
  ChildForm: TChildForm;

implementation

uses MainModule;

{$R *.dfm}

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:=caFree;
 MainForm.Edit1.Text:=IntToStr(MDIChildCount);
end;

end.
когда кол. доч. форм увеличивается то всё работает а когда 1 закрываю в edit 1 пишит 0.
с выравниванием о просто не риагирует.
BlackFishSQL вне форума Ответить с цитированием
Старый 29.02.2012, 19:18   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если вы создаете несколько дочерних форм, то что будет в ChildForm? Правильно, указатель на последнюю созданную форму. Забудьте вообще про эту переменную при работе с MDI-формами. Смотрим свойства главной формы MDIChildCount и MDIChildren. Дочерние формы могут и уничтожаться. А где вы собираетесь счетчик в Edit1 уменьшать? Лучше всего наверно в OnDestroy дочерней формы. Соответственно и код в Button1Click никуда не годный.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.02.2012, 19:30   #4
BlackFishSQL
Форумчанин
 
Аватар для BlackFishSQL
 
Регистрация: 02.04.2011
Сообщений: 136
По умолчанию

то есть в onDestroy дочерней формы написать что-то типа:
MainForm.Edit1.Text:=IntToStr(MDICh ildCount-1);

а сначало выполнится какое действие onClose или onDestroy& ведь в onClose я уже получается уничтожаю и лсвобождаю память присвоив соответствующее значение параметру Action.

Посмотри мой 1 пост продедуру выравнивания! Я везде убрал СhildForm.
BlackFishSQL вне форума Ответить с цитированием
Старый 29.02.2012, 19:39   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и в OnClose если передаете caFree. Память освождает метод Destroy, который и вызывает OnDestroy перед освобождением памяти. А что в посте #1? ChildForm там так и осталось. Самый удобный способ - ActionList и стандарные Action-ы из групы Window. И нацелить на них пункты меню.

ADD

Код:
MainForm.Edit1.Text:=IntToStr(MainForm.MDIChildCount-1);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.02.2012 в 19:49.
Аватар вне форума Ответить с цитированием
Старый 29.02.2012, 19:47   #6
BlackFishSQL
Форумчанин
 
Аватар для BlackFishSQL
 
Регистрация: 02.04.2011
Сообщений: 136
По умолчанию

Ага количество работает! А MDIChildCount это свойство главноного MDI окна?

А что тогда с выравниванием!
Код:
procedure TMainForm.Button1Click(Sender: TObject); // процедура выравнивания
begin
 case ComboBox1.ItemIndex of
  0 : Cascade;
  1 : begin
       TileMode:=tbHorizontal;
       Tile;
      end;
  2 : begin
       TileMode:=tbVertical;
       Tile;
      end;
 end;
end;

Последний раз редактировалось BlackFishSQL; 29.02.2012 в 21:13.
BlackFishSQL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MDI окна arsik Помощь студентам 0 24.11.2011 13:36
MDI окна... chiffa Общие вопросы Delphi 12 12.05.2011 22:49
MDI окна svyatoi777 Общие вопросы Delphi 2 07.01.2011 01:29
MDI Окна RIO Общие вопросы .NET 8 06.05.2008 16:06
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13