Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> У формы родитель форма, создание своего дизайнера 
V
    Опции темы
shmelina
Дата 5.6.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Для некой программы разрабатывается собственный дизайнер формы.

Первое что пришло в голову, это создать форму и в качестве родителя указать ей другую форму.
Вроде получилось как надо. Но есть несколько "но":
1. Заголовок у дочерней формы неактивный. Но с этим можно жить.
2. Если по полю TEdit (который на дочерней форме) кликнуть левой кнопкой мышки, то оно не получает фокус и курсор туда не ставится. Но ставится, почему-то, правой кнопкой.

Вопрос: можно ли поведение этой формы сделать стандартным?
К сожалению, MDI решение не получится применить.

Чтобы лучше понять что я имею в виду сделайте простую программу:

1. Создайте главную форму (Form1). Положите на нее кнопку. Напишите обработчик для этой кнопки:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self); // Форма убрана из AutoCreateForms
  Form2.Parent := Form1;
  Form2.Show; 
end;


2. Создайте вторую форму (Form2) и разместите на ней несколько TEdit.

3. ВСЕ! Попробуйте запустить приложение, нажать кнопку и посмотреть как ведет себя дочерняя форма.

Всякие шаманства с CreateParams результатов не принесли. Возможно не все делал правильно.

Удалось лишь только отключить заголовок окна дочерней формы и она стала вести себя правильно.

Код

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_CHILD or WS_DLGFRAME or WS_SIZEBOX;
end;


Но без заголовка как-то грустно. Есть идеи?


M
THandle
Модератор: используйте подсветку кода!

PM MAIL   Вверх
RomanEEP
Дата 5.6.2009, 22:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



http://www.delphi7.nl/forms.php
там есть пример - Form in a form moveable and resizeable
PM MAIL   Вверх
Louken
Дата 6.6.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.9.2008
Где: Кострома

Репутация: 1
Всего: 1



Цитата(shmelina @  5.6.2009,  17:32 Найти цитируемый пост)
К сожалению, MDI решение не получится применить.

А можно поинтерисоваться, по какой причине?

Я как то пару лет назад делал нечто подобное, что и дизайнер формы Delphi2005 и более поздних версий Delphi. Т.е. форма, не получающая фокус, с изменяющимися размерами, на ней можно размещать контролы, перемещать их, изменять их размеры и т.д., т.е. стандартные действия редактора. Все размеры, в том числе и размеры формы изменяются с помощью маркеров, рисуемых над контролами. Т.е. почти тот же функционал, что и в Delphi.
И все это было сделано именно с помощью модальной формы, хотя можно, наверно, переделать и на немодальную форму.
PM MAIL ICQ   Вверх
shmelina
Дата 8.6.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Цитата

А можно поинтерисоваться, по какой причине?

Форма, на которой будет лежать форма, сама является MDIChild.
Цитата

Я как то пару лет назад делал нечто подобное, что и дизайнер формы Delphi2005 и более поздних версий Delphi. Т.е. форма, не получающая фокус, с изменяющимися размерами, на ней можно размещать контролы, перемещать их, изменять их размеры и т.д., т.е. стандартные действия редактора. Все размеры, в том числе и размеры формы изменяются с помощью маркеров, рисуемых над контролами. Т.е. почти тот же функционал, что и в Delphi.
И все это было сделано именно с помощью модальной формы, хотя можно, наверно, переделать и на немодальную форму.

Ты про модальную форму или про MDI?
PM MAIL   Вверх
shmelina
Дата 8.6.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Цитата(RomanEEP @ 5.6.2009,  22:53)
http://www.delphi7.nl/forms.php
там есть пример - Form in a form moveable and resizeable

Огромное спасибо! Пример помог!

Правда я использовал оттуда только:
Код

PostMessage(Form2.Handle, WM_NCACTIVATE, integer(true), 0);


Всякие CreateParams и BroadCast я не использовал. Возможно чего-то не понимаю.  Да и в примере как-то не корректно, на мой взгляд, они использованы.
Например, там есть идея делать активной или неактивной дочернюю форму на событиях OnActive и OnDeactive у главной формы. Странно. Во-первых, надо делать на событиях приложения (Application), а не главной формы. Во-вторых, при обоих событиях посылается команда сделать дочернее окно активным! Ну да ладно, главное у меня получилось. 

Привожу упрощенный код для двух форм. Вернее для одной, для второй ничего делать не надо.
Код

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin // Если приложение активно, то дочерняя форма тоже активна
  if Assigned(Form2) then
    PostMessage(Form2.Handle, WM_NCACTIVATE, integer(true), 0);
end;

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin // Если приложение не активно, то дочерняя форма тоже не активна
  if Assigned(Form2) then
    PostMessage(Form2.Handle, WM_NCACTIVATE, integer(false), 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin // Показываем дочернюю форму
  Form2 := TForm2.Create(Self);
  Form2.Parent := Form1;
  Form2.Show;
  // Делаем заголовок активным, чтобы дочерняя форма "вела" себя правильно
  PostMessage(Form2.Handle, WM_NCACTIVATE, integer(true), 0); 
end;


Добавлено через 3 минуты и 3 секунды
А есть примеры как сделать квадратики у элементов на форме, чтобы за них менять размеры?
Пока все управляется кнопками. 

Хочется поменьше извращений и побольше стандартных методов.
PM MAIL   Вверх
RomanEEP
  Дата 8.6.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



В том примере форма меняет размеры, можешь просто подрисовать квадратики у углов формы и пусть юзер думает что он за них тянет smile
Есть еще вариант сделать эти квадратики компонентом TShape и двигать их

Это сообщение отредактировал(а) RomanEEP - 8.6.2009, 20:24
PM MAIL   Вверх
Louken
Дата 8.6.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.9.2008
Где: Кострома

Репутация: 1
Всего: 1



Цитата(shmelina @  8.6.2009,  10:29 Найти цитируемый пост)
ЦитатаА можно поинтерисоваться, по какой причине?Форма, на которой будет лежать форма, сама является MDIChild.

Так и знал.

Цитата(shmelina @  8.6.2009,  10:29 Найти цитируемый пост)
Ты про модальную форму или про MDI?

Про MDI конечно же, чето я попутал.

Цитата(shmelina @  8.6.2009,  11:21 Найти цитируемый пост)
А есть примеры как сделать квадратики у элементов на форме, чтобы за них менять размеры?

Цитата(RomanEEP @  8.6.2009,  20:22 Найти цитируемый пост)
Есть еще вариант сделать эти квадратики компонентом TShape и двигать их

не стоит так делать, лучше панельки с каким-то цветом, а то TShape не смогут быть поверх TWinControl компонентов.

В свое время сам долго бился над этой проблемой и меня посетила гениальная до простоты мысль (мне такой она показалась в начале), которая решила все мои броблемы, с этими квадратиками над контролами. Сделай прозрачный контрол, разверни его на всю форму и сдели за тем, чтоб он всегда был поверх остальных контролов (BringToFront после создания каждого нового контрола). И тогда на этом прозрачном контроле можно рисовать все что угодно, квадратики, рамку перемещения контрола и прочее.
Хотя в этом способе, так же имеются недостатки, типа мерцание будет, когда надо будет перерисовать всю форму, чтоб убрать квадратики например, но с этим можно бороться. 

PM MAIL ICQ   Вверх
shmelina
Дата 9.6.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Цитата(RomanEEP @ 8.6.2009,  20:22)
В том примере форма меняет размеры, можешь просто подрисовать квадратики у углов формы и пусть юзер думает что он за них тянет smile
Есть еще вариант сделать эти квадратики компонентом TShape и двигать их

Я уже не про форму, а про контролы на форме.

Правильно ли я понял, что стандартных (почти готовых) методов нет, нужно все делать ручками?
PM MAIL   Вверх
Louken
Дата 9.6.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.9.2008
Где: Кострома

Репутация: 1
Всего: 1



Цитата(shmelina @  9.6.2009,  09:30 Найти цитируемый пост)
Правильно ли я понял, что стандартных (почти готовых) методов нет, нужно все делать ручками?

Естественно
PM MAIL ICQ   Вверх
shmelina
Дата 10.6.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Спасибо за советы/ответы. Хороший форум. Буду сюда ходить smile.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.