С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
1

Динамическое создание n -ного количества форм

12.11.2013, 10:40. Показов 5574. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу прощения, если уже есть такая тема, но ничего путного не нашел.
Пишу что-то вроде аськи (диплом) на дельфи. (обмен сообщениями приватно и в общем чате).
Соответственно, мне нужно для каждого человека делать отдельную форму, в которой будет приватный чат только с одним человеком. И в эту же форму надо кидать то, что пишет этот человек (с сокетами я разобрался).
А значит Главное окно, в котором есть ClientSocket, должно как-то передавать в дочернюю форму какие-либо данные.
В итоге, вопрос у меня такой: как мне при создании n-ного количества форм через

Delphi
1
2
3
4
5
6
7
8
9
10
var 
  FormChat: TForm; 
 
implementation
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  FormChat:=TForm.Create(Application); 
  FormChat.Show; 
end;
обратиться ко всем созданным формам поочередно (неизвестно, сколько будет созданных форм) для их идентификации?

Пытался через FindComponent, но он ищет именно на форме, а не сами формы.

Подскажите, плиз.

P.S.: при использовании
Delphi
1
2
3
  FormChat:=TForm.Create(Application); 
  SetWindowLong(FormChat.Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
  FormChat.Show;
если я сворачиваю главное окно, то сворачиваются и убираются с панели задач все новые созданные формы.
Как бы сделать их независимыми?

Спасибо
0
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
12.11.2013, 10:40
Ответы с готовыми решениями:

Динамическое создание неизвестного числа форм
простите за столь сырой вопрос, но все же: как программно создавать новые формы, так чтобы по...

Динамическое создание форм (runtime) с параметрами взятыми из файла
Задача такая: нужно написать программу для работы с БД. Специфика - много разнообразных форм: формы...

Динамическое создание форм
Всем привет. Если я создаю форму таким образом TForm1* Form1 = new TForm1(Application); я...

Динамическое создание форм
Здравствуйте, хочу создать динамически чекбокс с проверкой, но почему-то(Скорее всего неправильно...

28
пофигист широкого профиля
4754 / 3191 / 860
Регистрация: 15.07.2013
Сообщений: 18,482
12.11.2013, 10:50 2
Цитата Сообщение от klaxwork Посмотреть сообщение
Пытался через FindComponent
Сами формы перечислены в списке Screen.Forms
0
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
12.11.2013, 10:52  [ТС] 3
Цитата Сообщение от northener Посмотреть сообщение
Сами формы перечислены в списке Screen.Forms
Прошу прощения, можно хоть какой-нить примерчик использования? Дальше я сам, по аналогии.

Вопрос в P.S. остается в силе...
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
12.11.2013, 11:01 4
Цитата Сообщение от klaxwork Посмотреть сообщение
FormChat:=TForm.Create(Application);
Delphi
1
Application.CreateForm(TForm, formChat);
0
пофигист широкого профиля
4754 / 3191 / 860
Регистрация: 15.07.2013
Сообщений: 18,482
12.11.2013, 11:02 5
Цитата Сообщение от klaxwork Посмотреть сообщение
можно хоть какой-нить примерчик использования?
http://docwiki.embarcadero.com... 8Delphi%29
http://docwiki.embarcadero.com... 8Delphi%29
2
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
12.11.2013, 11:04  [ТС] 6
Valenth, Прошу прощения, это к чему? К P.S.? Если да, то не работает. При сворачивании главного окна, дочерние тоже исчезают.
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
12.11.2013, 11:15 7
klaxwork, к P.S. Рекомендую создавать формы именно так. А насчёт зависимости: первая форма, созданная дельфой, является главной (MainForm) и её события отражаются на всей программе (сворачивание, закрытие). Как в делфи 7 главная форма - это полоска сверху. Если её свенуть - свернётся всё.

Как вариант - сделать невидимую форму и создать её первой, чтобы она была главной. Но это плохая идея. Странно, что у Вас есть такая необходимость.

Добавлено через 2 минуты
Если хотите как, например, в квипе - окно с контактами спряталось, а чат остался - запретите окну с контактами сворачиваться, а по кнопке "закрыть" - делать Form.Hide();

Delphi
1
2
3
4
5
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  self.Hide();
  CanClose := false;
end;
1
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
12.11.2013, 11:18  [ТС] 8
Valenth, да, необходимость существует. Ведь в той же самой аське при закрытии основного окна со списком пользователей окна/формы с чатами остаются на месте. И каждое из них можно свернуть/развернуть независимо от главного окна.

А если такой вариант?
Форму с логином/паролем при успешной авторизации делать Form1.Visible:=False; ?
И в системном трее оставить у часов значек, при нажатии на который будет открываться список...

Тогда возникает вопрос: как мне перехватить закрытие формы со списком по Alt-F4 или по крестику и свернуть в трей без закрытия?

Спасибо.

Мда.
Пока писал -- предложили то же самое...
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
12.11.2013, 11:23 9
Цитата Сообщение от klaxwork Посмотреть сообщение
Тогда возникает вопрос: как мне перехватить закрытие формы со списком по Alt-F4 или по крестику и свернуть в трей без закрытия?
Ну я предложил выше только Вам придётся предусмотреть другие способы закрытия приложения.
Главной формой лучше всё-таки сделать форму с контактами.
1
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
12.11.2013, 11:45  [ТС] 10
Цитата Сообщение от Valenth Посмотреть сообщение
Ну я предложил выше только Вам придётся предусмотреть другие способы закрытия приложения.
Главной формой лучше всё-таки сделать форму с контактами.
В принципе, я почти так и подумал...
После авторизации на нем показывается до поры скрытая панель со списком поверх логина с паролем.
Эта панель сразу после авторизации обновляется. Дальше это окно можно свернуть в трей.
Так же там существует флаг. По умолчанию =0. Если нажимается кнопка закрыть, то он меняется на 1 и программа пытается закрыть главное окно.
Т.о. отслеживаем закрытие по крестику и не даем закрыть раньше времени.

В общем спасибо за ответ!
Дальше уже по алгоритму буду разбираться.

Добавлено через 8 минут
Да, тему можно закрывать. Всем спасибо!
0
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
16.11.2013, 12:05  [ТС] 11
Снова открываю тему...

Дело в том, что формы должны иметь имена вида 'User_'+IntToStr(UserId) и сколько этих форм будет открыто -- неизвестно.
А мне нужно, чтоб в любое время программа могла проверить, не закрыта ли эта форма; если закрыта, то открыть иначе передать в эту форму какие-то данные в какой либо компонент, к примеру в ChatMemo...

И вот вопрос: как можно сделать так (без явного описания всех возможных имен форм), чтоб можно было обращаться так: ('User'+IntToStr(UserId)).Memo2.Lines.Add('bla-bla-bla');?
При чем обращаться без перебора в Screen.Forms...

Спасибо.
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
16.11.2013, 12:07 12
Динамический массив типа
Delphi
1
array of TForm
для учёта всех форм. И дописать функции, которые будут удалять из массива форму, добавлять новую и возвращать указатель на форму по её имени.
0
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
16.11.2013, 12:31  [ТС] 13
Динамический массив не катит...
Дело в том, что формы могут быть открыты в любом порядке (это что-то типа аськи и я могу открыть форму сначала с юзером 45, а потом с юзером 3).
И мне что, создавать массив из 45 форм и только в 45 и 3 создавать формы?

Пробный проект тут:
http://files.mail.ru/557C98038... D631430390

При нажатии на Button1 создается новая форма
При нажатии на Button2 выводятся имена всех форм.

И еще: как я понял, при закрытии формы -- она остается в памяти. Как мне очистить память от закрытых форм?
Спасибо.
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
16.11.2013, 12:48 14
Цитата Сообщение от klaxwork Посмотреть сообщение
Дело в том, что формы могут быть открыты в любом порядке (это что-то типа аськи и я могу открыть форму сначала с юзером 45, а потом с юзером 3).
И мне что, создавать массив из 45 форм и только в 45 и 3 создавать формы?
У Вас будет массив из двух элементов, только и всего. Зачем связывать индекс массива и id пользователя? Если надо, чтобы форма запоминала id пользователя, то записывайте его в свойство Tag формы. Или сделайте свою структуру массива:
Delphi
1
2
3
4
5
6
type
  MyArrItem = record
    userID: integer;
    form: TForm;
  end;
  MyArr = array of MyArrItem;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33003 / 21306 / 8183
Регистрация: 22.10.2011
Сообщений: 36,609
Записей в блоге: 8
16.11.2013, 13:03 15
Пары Name=Value никто не отменял:

Delphi
1
2
3
4
5
6
7
8
9
var
  frms : TStringList;
// ...
  frms := TStringList.Create;
  frms.AddObject('1=Form1', Form1);
  frms.AddObject('2=Form2', Form2);
 
  ShowMessage(frms.Objects[frms.IndexOfName('1')].ClassName); // TForm1
  ShowMessage(frms.Objects[frms.IndexOfName('2')].ClassName); // TForm2
, безо всякого перебора со стороны программиста, Дельфи сама занимается этим...
0
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
16.11.2013, 13:53  [ТС] 16
Цитата Сообщение от Valenth Посмотреть сообщение
У Вас будет массив из двух элементов, только и всего. Зачем связывать индекс массива и id пользователя? Если надо, чтобы форма запоминала id пользователя, то записывайте его в свойство Tag формы. Или сделайте свою структуру массива:
Delphi
1
2
3
4
5
6
type
  MyArrItem = record
    userID: integer;
    form: TForm;
  end;
  MyArr = array of MyArrItem;
А как мне обращаться к форме с номером, к примеру, UserID=6?
Или UserID=15?
Или надо будет все-таки перебирать все записи в поисках нужного UserID?

Прошу прощения за такие нескромные, и может быть, наивные вопросы. Просто я дельфи изучал выборочно.
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
16.11.2013, 14:24 17
Цитата Сообщение от klaxwork Посмотреть сообщение
А как мне обращаться к форме с номером, к примеру, UserID=6?
Или UserID=15?
Или надо будет все-таки перебирать все записи в поисках нужного UserID?
Перебором. Это не так уж сильно нагружает проц, как кажется. А про метод, описанный UI, ничего сказать не могу. Возможно, тем способом и проще.
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
16.11.2013, 16:05 18
А кто подскажет чем будет отличаться динамически созданная форма от "нормально" созданной?
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
16.11.2013, 16:52 19
NIKOLAYY, ничем.
0
16 / 16 / 3
Регистрация: 28.05.2013
Сообщений: 233
16.11.2013, 22:11  [ТС] 20
Цитата Сообщение от Valenth Посмотреть сообщение
У Вас будет массив из двух элементов, только и всего. Зачем связывать индекс массива и id пользователя? Если надо, чтобы форма запоминала id пользователя, то записывайте его в свойство Tag формы. Или сделайте свою структуру массива:

Delphi
1
2
3
4
5
6
type
  MyArrItem = record
  userID: integer;
    form: TForm;
  end;
  MyArr = array of MyArrItem;
Допустим я создал 3 формы.
Получатся формы в массиве:
Delphi
1
2
3
MyArr[0].form:=TFChat.CreateNew(Application);
MyArr[1].form:=TFChat.CreateNew(Application);
MyArr[2].form:=TFChat.CreateNew(Application);
Но если я удалю MyArr[1].form.Free, то в будущем как мне проверить (без использования каких либо дополнительных переменных и флагов), есть ли что либо на этом месте?
Код:
Delphi
1
2
3
4
if MyArr[1].form.Free<>nil then
begin
  ...
end;
не работает.

Подскажите, пожалуйста...
0
16.11.2013, 22:11
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
16.11.2013, 22:11
Помогаю со студенческими работами здесь

Map и динамическое создание форм
Всем привет. Никак не могу решить задачу на главной форме есть StringGrid в который...

Динамическое создание форм (Не MFC)
Допустим есть созданная форма в ресурснике, а в ней есть поле для ввода(Edit Control) и даже...

Динамическое создание подчиненных форм
Доброго времени суток, Посоветуйте хорошую книгу, дабы разобраться с классами в Access. Стоит...

Динамическое создание контролла на одной из нескольких форм
Есть 2 формы и отдельно созданный класс. В первой форме есть массив int, который передается в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru