Переход-Форма-Форма

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Переход-Форма-Форма

Сообщение SLIM » 29.07.2008 (Вт) 21:03

Вот дошел до момента взаимодйствия между формами. Тут соответственно возникли вопросы. Как ПРАВИЛЬНО открыть вторую (и др.) формы из главной. На данный момент я действую методом Show. Но что-то мне подсказывает что это не правильно (видимо название говорит мне). Соответственно закрытие методом Hide. Просто мне кажется что при таком раскладе формы просто висят в воздухе. Видимо и методы эти разработаны для другого. Слышал про оператор Load, но как им пользоваться не знаю.
Есть также событие формы Load, но его невозможно (и впринципе естественно) из другой формы (+Unload).
Так вот. еще раз вопрос: как правильно реализовать взаимодействие между формами. (Кстати еще хотел бы уточнить зачем нужны MDI формы, т.е. зачем я знаю, кто-нибудь использовал и для чего?)
Пишите жизнь на чистовик.....переписать не удастся.....

ZOD
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 24.03.2004 (Ср) 19:54
Откуда: Barnaul

Сообщение ZOD » 29.07.2008 (Вт) 21:44

Form.Hide действительно скрывает форму. При этом она остается в памяти. Для выгрузки формвы из памяти:
Код: Выделить всё
    Unload Form1
    Set Form1 = Nothing

Load`ом соответственно ее можно загрузить обратно.

Примером MDI приложения является Word, Excel, да и сам ВБ6. Наверное их кто-нибудь да использует ;)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 29.07.2008 (Вт) 22:10

А что происходит при загрузке многоформового приложения? Загружается только одна форма? Или все? Ведь я методом Show показываю, а не загружаю вторую форму. Соответственно следует что ворма загружается при загрузке всего приложения? А если это не так, то значит при методе Shoqw происходит и загрузка формы.
Пишите жизнь на чистовик.....переписать не удастся.....

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 30.07.2008 (Ср) 6:51

SLIM
Ты создаёшь в проекте одну главную форму (MDIform) и одну форму "внутреннюю" (form). MDI форма всегда будет загружена, а с помощью Dim ты сможешь загрузить столько копий form, сколько тебе нужно.

К примеру, форма называется frmDocument. Воспользуемся тем, что форма это тоже класс, и создадим новую форму также, как объект любого класса:

Код: Выделить всё
Dim frmD As New frmDocument
frmD.Show


Чтобы лучше разобраться можешь при старте Visual Basic выбрать VB Aplication Wizard и потом жать "Next" до самого конца. Получишь простой, но рабочий пример MDI приложения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.07.2008 (Ср) 7:44

SLIM писал(а):А если это не так, то значит при методе Shoqw происходит и загрузка формы.

Разумеется. Форма загружается при обращении к любому методу или свойству незагруженной формы.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 7:55

Вот дошел до момента взаимодйствия между формами.

Я считаю не лишним напомнить, что форма это класс, и тебя должно волновать взаимодействие между экземплярами форм, а не между формами.

На данный момент я действую методом Show. Но что-то мне подсказывает что это не правильно (видимо название говорит мне). Соответственно закрытие методом Hide.

Методы Show и Hide это всё равно что Visible = True и Visuble = False, с единственным отличием, что метод Show позволяет указать владельца окна и модальность показа.

Слышал про оператор Load, но как им пользоваться не знаю.

Нет такого оператора. Есть функция Load.

зачем нужны MDI формы, т.е. зачем я знаю, кто-нибудь использовал и для чего?)

Неужели их ещё кто-то непоиспользовал?


А что происходит при загрузке многоформового приложения?

Ничего из того, что ты думаешь.
Загружается только одна форма? Или все?

Ни загружается ни одного экземмпляра форм. Слово загружается здесь вообще не уместно.
Я напоминаю ещё раз, что форма это класс, и на неё распространяется всё то же поведение, что и на классы. Задай себе вопрос: "Что происходит при загрузке многоклассового приложения? Загружаются все классы или только один?" и сразу поймёшь, насколько это тупо.

Экземпляр формы создаётся явно при создании через оператор New, или неявно, при обращении к сброшенной DAN-ссылке.

МануAll-ная статья о DAN-ссылках к сожалению был утрачена, так бы сейчас отправил читать.

а с помощью Dim ты сможешь загрузить столько копий form, сколько тебе нужно.

Чушь. Ключевую роль здесь играет New. А тот пример, который ты привёл ниже: вообще с DAN-ссылкой, а их (такие ссылки) тщательно не разобравшись с ними, вообще нельзя использовать новичкам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Сообщение Alprog » 30.07.2008 (Ср) 8:30

Чушь.


Так и знал, что прийдёт Хакер и раскритикует :(
Последний раз редактировалось Alprog 30.07.2008 (Ср) 8:49, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 8:33

К сожалению приходится; иначе один (с неправильно выстроенными причинно-следственными связими) научит другого так, что и второго эти связи будут выстроены так же неправильно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 30.07.2008 (Ср) 9:04

Потому профессионалы и говорят, что лучшее объяснение - код.
Я почитав форум, вообще отказался от неявного создания экземпляров форм. Всегда делаю модуль, в нем - Sub Main, в ней
Код: Выделить всё
Public fMainForm As frmMain

Sub Main()

  Set fMainForm = New frmMain
  fMainForm.Show

End Sub

По сути, такой "загрузочный" модуль - аналог DPR-файла в Delphi.
Само собой, блоков Set - Show может быть сколько угодно, например:
Код: Выделить всё
  Set fMainForm = New frmMain
  fMainForm.Show

  Set fPropForm = New frmProperties
  fMainForm.Show 0, fMainForm

  Set fToolsForm = New frmToolbar
  fMainForm.Show 0, fMainForm

Здесь, при запуске кода, на экране появляется некая абстрактная Основная Форма, а над ней плавают немодальные формы: Инструменты и Свойства.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 30.07.2008 (Ср) 9:20

Кстати: а чем плохо выгружаться через END при необходимости завершить прогу? Память, занимаемая прогой не будет перераспределена? Почиму так? Или это чьё-то заблуждение?
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.07.2008 (Ср) 9:59

Proxy писал(а):Кстати: а чем плохо выгружаться через END при необходимости завершить прогу?

Много чем.
Чтобы в долгие объяснения не вдаваться, хотя бы тем, что маскируется кривизна твоей программы. Если при выгрузке формы программа не завершается, значит у тебя в программе недоработка. По End ты ее не увидишь.
Lasciate ogni speranza, voi ch'entrate.

it.egor
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 29.07.2008 (Вт) 13:51

Сообщение it.egor » 30.07.2008 (Ср) 10:55

alibek писал(а):Если при выгрузке формы программа не завершается, значит у тебя в программе недоработка. По End ты ее не увидишь.

если программа не имеет кода в form_unload, то end использовать можно! иначе лучше писать отдельную процедуру для быстрого завершения программы (канефна, если в проекте много форм и надо выполнять какий-то операции при конце проги)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 10:58

it.egor
У тебя программа исчерпытвается формами и их Unload-событиями? То, например, что форм вообще может не быть, зато может быть огромная объектная модель со специальными правилами выгрузки, тебе не очевидно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

it.egor
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 29.07.2008 (Вт) 13:51

Сообщение it.egor » 30.07.2008 (Ср) 11:01

у меня - да... про объектные модели ничего не скажу, тк не приходилось такое делать...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.07.2008 (Ср) 11:07

it.egor, не было, не значит, что не будет в будущем. Лучше сразу делать все правильно.
Весь мир матрица, а мы в нем потоки байтов!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 30.07.2008 (Ср) 20:57

Ни загружается ни одного экземмпляра форм. Слово загружается здесь вообще не уместно.
Я напоминаю ещё раз, что форма это класс, и на неё распространяется всё то же поведение, что и на классы. Задай себе вопрос: "Что происходит при загрузке многоклассового приложения? Загружаются все классы или только один?" и сразу поймёшь, насколько это тупо.

Ну....это я впринципе уяснил. А что по поводу "выгрузке формы"? Что происходит при закрытии формы. И опять таки. New Form создается при открытии формы (Любой)? Т.е. в этот момент создается та самая ссылка New?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2008 (Ср) 21:01

А что по поводу "выгрузке формы"? Что происходит при закрытии формы.

Скрытие. Ничего более.

С памятью экзмемпляра формы с его объектами ничего при этом не случается. А случается в других случаях. И эти случая распространяются на форму также, как и на обычные классы. Разберись сначала с обычными классами. Тогда все вопросы по формам автоматически отпадут.

И опять таки. New Form создается при открытии формы (Любой)? Т.е. в этот момент создается та самая ссылка New?

Ничего не понял.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 31.07.2008 (Чт) 2:39

Вот пример хороший:
http://bbs.vbstreets.ru/viewtopic.php?p ... b867dc41c3
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.07.2008 (Чт) 7:16

SLIM писал(а):И опять таки. New Form создается при открытии формы (Любой)? Т.е. в этот момент создается та самая ссылка New?
Если я правильно понял, то мысль была следующая:
"Создается ли при открытии формы ее новый экземпляр?"
Если вопрос был именно этот, то ответ: "Нет".
Весь мир матрица, а мы в нем потоки байтов!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 31.07.2008 (Чт) 22:34

Вот пример хороший:

Это не хороший пример...
Скрытие. Ничего более.

Т.е. она в пямяти?
Если вопрос был именно этот, то ответ: "Нет".

Понял верно.

И еще. Я тут повоял следующее. Значит при загрузке формы1 проверяются некоторые значения, при получении определенного результата форма загружается, если нет, то должна выгрузиться. Форма1 загружается допустим при нажатии кнопочки-пимпочки из формы0. Так вот если я на событие кнопочки пишу Load форма1, происходит след-ее. В событии формы1 LoadForm происходит проверка, и если значение не то, то я ее выгружаю Unload. Всего этого я не вижу при нажатии кнопки, но приложение выдает ошибку мол форма уже выгружена. Приложение останавливается на срочке загрузки формы Load Форма1....вот так
Пишите жизнь на чистовик.....переписать не удастся.....

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 01.08.2008 (Пт) 8:34

SLIM
А если фразу
при загрузке формы1 проверяются некоторые значения, при получении определенного результата форма загружается

исправить следующим образом:
при выполнении процедуры Main() проверяются некоторые значения, при получении определенного результата форма загружается

Это в начале загрузки проекта.
А в случае с пимпочкой ИМХО Вы продолжаете упорно не хотеть понять разницу между формой(классом) и экземплярами этой формы. Правильный код в кнопке может создавать сколько угодно копий-экземпляров, каждый из которых будет создавать такое же неограниченное количество таких же экземпляров

Кидаем на форму кнопку, копируем этот код и смотрим на результат
Код: Выделить всё
Private Sub Command1_Click()

  Dim Copia As Form     'Объявляем переменную типа Form

  Set Copia = New Form1 'Создаем экземпляр класса Form1
    Load Copia          'Загружаем экземпляр
    Copia.Show          'Выводим на экран
  Set Copia = Nothing   'Уничтожаем ссылку на экземпляр формы (сам он остается в памяти)

End Sub
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2008 (Пт) 8:57

Денис писал(а):
Код: Выделить всё
Private Sub Command1_Click()

  Dim Copia As Form     'Объявляем переменную типа Form

  Set Copia = New Form1 'Создаем экземпляр класса Form1
    Load Copia          'Загружаем экземпляр
    Copia.Show          'Выводим на экран
  Set Copia = Nothing   'Уничтожаем ссылку на экземпляр формы (сам он остается в памяти)

End Sub
После
Код: Выделить всё
Set Copia = Nothing
в памяти уже ничего не остается, вернее остается странный объект без явной ссылки на него.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.08.2008 (Пт) 9:01

Viper
Остаётся. Load помещает ссылку на экземпляр формы в коллекцию Forms. Чтобы её и оттуда убрать, надо делать Unload. Иначе, этот экземпляр формы будет жить и после Set = Nothing.
Последний раз редактировалось Хакер 01.08.2008 (Пт) 9:07, всего редактировалось 2 раз(а).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.08.2008 (Пт) 9:02

Остается в Forms.
Если форма информационная и с ней работать больше не надо, то именно так лучше делать.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2008 (Пт) 9:04

Хакер, я уточнил свой пост. Понятно, что форма останется висеть до вызова Unload.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.08.2008 (Пт) 9:06

Viper
Где-же уточнил?

После выполнения
Код: Выделить всё
Set Copia = Nothing

остаётся висеть такой же нормальный и полноценный объект формы, какой бы висел, если бы было так:

Код: Выделить всё
Private Sub Command1_Click()

  Dim Copia As Form     'Объявляем переменную типа Form
  Dim Copia2 As Form

  Set Copia = New Form1 'Создаем экземпляр класса Form1
  Set Copia2 = Copia

    Load Copia          'Загружаем экземпляр
    Copia.Show          'Выводим на экран

  Set Copia = Nothing   'Уничтожаем ссылку на экземпляр формы (сам он остается в памяти)

End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2008 (Пт) 9:21

Viper писал(а):После
Код: Выделить всё
Set Copia = Nothing
в памяти уже ничего не остается, вернее остается странный объект без явной ссылки на него.
Так вот оно, уточненный вариант. Явной ссылки нет, однако форма вполне себе останется жить как на экране, так и в коллекции Forms.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.08.2008 (Пт) 9:24

в памяти уже ничего не остается, вернее остается странный объект

Вот этим я не доводен.
Вернее действительно остаётся, только не странный объект, а вполне нормальный.

Что значит нет явной ссылки? Какие ссылки считать явными, а какие нет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.08.2008 (Пт) 9:24

А что такое Forms, как не явная ссылка?
С циклическими ссылками еще можно придумать такую ситуацию, но здесь не тот случай.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2008 (Пт) 11:35

Уговорили!
После
Код: Выделить всё
Set Copia = Nothing
форма остается на экране и в коллекции Forms. Любые последующие с ней манипуляции возможны только через Forms.
Весь мир матрица, а мы в нем потоки байтов!

След.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 60

    TopList