Загрузка форм в память

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Загрузка форм в память

Сообщение AlekseyVB » 20.01.2010 (Ср) 17:02

Необходимо при запуске первой формы программы загрузить в память все остальные формы. В ВБ6 для этого были специальные события...

Нашёл способ в событии Лоад основной формы:
Form2.Show
Form2.Hide
Form3.Show
Form3.Hide
.....

Но происходит мерцание открывающихся и закрывающихся форм.

Если ли другой способ загрузки форм в память без отображения?

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Загрузка форм в память

Сообщение Debugger » 20.01.2010 (Ср) 17:13

Load Form2

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 20.01.2010 (Ср) 17:14

Во-первых надо создавать экземпляры форм, а не отобажать их прототипы
Во-вторых формы не надо никуда загружать, их надо создавать

Например у нас есть три формы: Form1, Form2, Form3. Form1 - главная, с её отображения начинается видимая часть работы программы (если ты думаешь, что она отображается путем Form1.Show, то ты неправ: создается экземпляр класса Form1 и у него вызывается процедура ShowDialog).
Что бы можно было отобразть остальные формы, надо создать и их экземляры:
Код: Выделить всё
Private frm2 as Form2, frm3 as Form3

Private Sub FormaLoad(...) Handles ...
frm2 = new Form2
frm3 = new Form3
...
End Sub

А после этого с формами можно делать что угодно - они готовы к работе, никакой ерунды типа
AlekseyVB писал(а):
Код: Выделить всё
Form2.Show
Form2.Hide
не надо.

Добавлено:
В процессе работы надо оперировать только объектами frm2 и frm3, а Form2, Form3 трогать не следует.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 20.01.2010 (Ср) 17:58

Во-вторых формы не надо никуда загружать, их надо создавать
Ну это кому что надо.
Если вопрос стоит - как загрузить форму, в смысле создать ее описатели и заставить построить дерево(то есть если вопрос - какой аналог Load из VB6) то это делает метод CreateControl
А это frm2 = new Form2 просто создает экземпляр, никакого отношения к Load не имеет.

По поводу того, нужно ли создавать экземпляр Form самому, или пользоваться экземпляром одноименным с классом(который ты назвал "прототипом") - кому как нравится. Утверждение "трогать не следует" эмм... Излишне резкое
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 20.01.2010 (Ср) 18:16

ANDLL писал(а):А это frm2 = new Form2 просто создает экземпляр, никакого отношения к Load не имеет.
Дык понятно, просто надо же к какому-то событию прикрутить. Можно к клику, к лостфокусу, да к чему угодно, не суть.

ANDLL писал(а):По поводу того, нужно ли создавать экземпляр Form самому, или пользоваться экземпляром одноименным с классом(который ты назвал "прототипом") - кому как нравится. Утверждение "трогать не следует" эмм... Излишне резкое
Но почему-то любой мануал гласит, что использовать стоит именно экземляры классов.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 20.01.2010 (Ср) 18:18

Но почему-то любой мануал гласит, что использовать стоит именно экземляры классов.
Эта фраза сама по себе показывает некоторое недопонимание.
Form1 - это уже именно экземпляр класса Form1. А никакой не "прототип". В .NET и в VB незапрещено создавать типы и переменные с одинаковыми именами
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 20.01.2010 (Ср) 18:21

Дык понятно, просто надо же к какому-то событию прикрутить. Можно к клику, к лостфокусу, да к чему угодно, не суть.
Ась? Автор спросил чем заменить show\hide. Так вот new Form их не заменит
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 20.01.2010 (Ср) 18:56

{предыдущий текст выпилен, что бы не путать остальных людей, читающих этот топик}

Короче говоря использование From1 действительно невозбранно, т.к. это одноименный экземляр объекта, создаваемый фреймворком в недрах My.MyProject.MyForms вот таком кодом:
Код: Выделить всё
<DebuggerNonUserCode> _
Public Function get_Form1() As Form1
    Me.m_Form1 = MyForms.Create__Instance__(Of Form1)(Me.m_Form1)
    Return Me.m_Form1
End Function

Создание же дополнительных экземпляров форм может понадобиться при использовании нескольких одинаковых форм или для аналогичных задач.
Последний раз редактировалось MIT 21.01.2010 (Чт) 12:59, всего редактировалось 1 раз.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 20.01.2010 (Ср) 21:08

Елки палки.

You must be kidding.

Основы. В .NET есть понятие класс.
У каждого класса могут быть статические и нестатические члены.
При этом не может быть членов "вне класса". То есть любая не локальная переменная это обязательно член(статический или нет) какогото класса.
Пространство имен всех членов данного класса одно. Это значит что не может быть членов внутри класса с одинаковой сигнатурой. Сигнатура - это имя и набор параметров. И все. Никаких модификаторы, например доступа или статичности в сигнатуре нет.

Если это непонятно\вызывает возражения дальше читать нет смысла.

Теперь про не основы.

Есть класс Form. У него есть инстанционные методы Show, Hide и много других.
Тот факт что это методы инстанционные, значит что они вызываются Expression.Method(...), где Expression - выражение типа нашего класса.
Метод Form.Show - инстанционный метод. Значит в записи FormX.Show() FormX - это выражение типа FormX, а не класс FormX.

Теперь о том откуда такой взялся.
Очень просто. У проекта VB.NET с формой есть класс MyProject+MyForms. У этого класса есть Public свойство FormX.
VB некиим необычным образом миксует namespace'ы и получается что члены вышеописанного класса доступны в кратком виде. И поэтому когда ты пишешь FormX.Show() VB понимает, что ты обращаешься к свойству FormX вышеописанного класса.

Отчего да почему ты пишешь Form2 = Nothing а потом Form2 снова живой? Потому что так устроен getter свойства Form2. Тебе это кажется странным?

Также может навести на мысли, что Form2 - это никакой не экземляр,
Как бы когда говорят "A" это экземпляр то конечно же не имеют ввиду что это экземпляр. Важно понимать что экземпляр класса это "вещь в себе". Какаято переменная может ссылаться на некий экземпляр, но быть экземпляром не может. В этом смысле приведенный тобой код лично мне не наводит на мысли.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 20.01.2010 (Ср) 21:11

Если мы зададим свойство экземляру-класса-Form2 то, вот удивительно, сам класс Form2 отреагирует на это изменение:
Выделенное словосочетание смысла не имеет. Что подразумевалось под ней?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Загрузка форм в память

Сообщение Dmitriy2003 » 20.01.2010 (Ср) 22:22

ANDLL писал(а):Если вопрос стоит - как загрузить форму, в смысле создать ее описатели и заставить построить дерево(то есть если вопрос - какой аналог Load из VB6) то это делает метод CreateControl


CreateControl does not create a control handle if the control's Visible property is false.
You can either call the CreateHandle method or access the Handle property to create the control's
handle regardless of the control's visibility, but in this case, no window handles are
created for the control's children.

что же получиться если учесть пожелания ТС :?:

Добавленно:
Метод - "Г" - заГрузка нескольких форм :D (сорри на vb лень переписывать) - Про принцип молчу он "Г" - однако чем больше ядер у проца тем эфективнее этот - "Г" - метод.
Вложения
wfa1.rar
(26.33 Кб) Скачиваний: 115

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

Re: Загрузка форм в память

Сообщение Денис » 21.01.2010 (Чт) 9:39

Dmitriy2003 писал(а):wfa1


Дак это ж на шарпе!!! О_о

Но даже не зная шарпа я разглядел, что формы 1,2,3 - одинаковы. Тогда зачем нам три класса? Делаем один класс и каждая кнопка создает (показывает) свой экземпляр одного класса. (при старте кнопочной формы создаются и загружаются три экземпляра, а при нажатии на кнопки показываются.)

Простой пример: есть класс frmСправочник. Но справочников в БД много, и неужели мне на каждый нужно строить свою форму? Нет. Я строю одну форму-справочник, а при отображении разных справочников из БД просто создаю новый экземпляр и привязываю к нужной мне справочной таблице из БД.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 9:57

Создал Form1 и Form2

В событии Form2_Load стоит Msgbox("Hi")

Так вот способы:
Dim frm2 as Form2
frm2 = New Form2
и
Form2.CreateControl()

выполняющиеся в первой форме не вызывают появление Msgbox...

wfa1.rar

У меня не открывается( пользуюсь vb2005 express

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

Re: Загрузка форм в память

Сообщение Денис » 21.01.2010 (Чт) 10:24

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

В общем, объясни, для чего тебе загруженные в пямять формы?
Последний раз редактировалось Денис 21.01.2010 (Чт) 11:06, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 10:47

Код: Выделить всё
Module Module1
    Public a As Integer
End Module

Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        a = 10
    End Sub
End Class

Public Class Form1
    Public frm2 As Form2

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        frm2 = New Form2
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(a)
    End Sub
End Class


Msgbox после нажатия на кнопку выдает результат 0, а не 10...

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

Re: Загрузка форм в память

Сообщение Денис » 21.01.2010 (Чт) 11:09

AlekseyVB писал(а):[code]

Всё-всё-всё. Проехали. Этот код не работает. Перечитай мое исправленное сообщение выше:

Зачем тебе выполнять код в неотображенных формах. Ответь вслух на этот вопрос и тебе будет предложено решение в стиле .Net
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 11:26

Мне нужно что бы приложение быстро работало (быстрый переход от форме к форме). То есть возможно пусть дольше загружается вначале, но в последствии будет работать быстрее при переходе к новой ещё не открытой форме.

Кроме того при запуске приложения необходимо что бы выполнялся код (который находится не в стартовой форме) на проверку определенных условий, от значений которых будет зависить дальнейший путь работы программы (грубо говоря если еслти True то один ход действия программы, если False другой). Конечно, наверно, можно это условие установить в главной форме, но всё же. Проверка условий (выполняемых в других формах) или выполнение каких-либо других действий (установленных в других формах) необходима не только при запуске, но и при дальнейшем действии. Но тут впринципе я вижу выход если прописать код в модуле и оттуда его вызывать из разных форм.

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

Re: Загрузка форм в память

Сообщение Денис » 21.01.2010 (Чт) 11:38

AlekseyVB писал(а):1. что бы приложение быстро работало (быстрый переход от форме к форме).
2. при запуске приложения необходимо что бы выполнялся код (который находится не в стартовой форме) на проверку определенных условий


1. Пока не знаю, ждём ответов опытных.
2. Вот это могу сказать точно: Логика приложения не должна храниться в интерфейсе (формах). Для этого есть модули и классы. RTFM.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 21.01.2010 (Чт) 13:03

1. что бы приложение быстро работало (быстрый переход от форме к форме).
Работать оно и так будет быстро, никаких взмахов волшебной палочки не надо. Тормоза могут быть только из-за перегруженности обработчиков события Load.

P.S. Подправил пост по поводу создания экземпляров, см. выше.

Добавлено:
Ахаха, всех понесло...
Последний раз редактировалось MIT 21.01.2010 (Чт) 13:22, всего редактировалось 1 раз.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 13:18

Слышал о какой-то игре что в ней не происходит прогрузки (Loading...) при переходе персонажем из одной локации в другую))) так как все локации загружаются в начале запуска игры. Хочу осуществить такое же)))

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Загрузка форм в память

Сообщение Dmitriy2003 » 21.01.2010 (Чт) 14:10

Денис писал(а):Но даже не зная шарпа я разглядел, что формы 1,2,3 - одинаковы. Тогда зачем нам три класса?


Тогда-бы был MDI - "Г" - интерфэйс. Что ТС - мне кажется совсем не нужно. Неужеле, не смущает смена - MessageLooop, :)

AlekseyVB писал(а):У меня не открывается( пользуюсь vb2005 express

Чтож прикажете - уважаемый каждый фаил из проекта пооддельности выкладывать :) , скачайте лучше WinRar - если лень - коротко - можно играть со свойством Opacity формы.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 21.01.2010 (Чт) 15:02

вот таком кодом
Я бы тут сбавил ход... А m_Form1 как объявлена?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 21.01.2010 (Чт) 15:03

Код: Выделить всё
Public m_Form1 As Form1
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Загрузка форм в память

Сообщение ANDLL » 21.01.2010 (Чт) 15:10

И атрибутов нет?
Ясно, тогда отбой.
В некотором сложном приближении лучше все таки использовать именно свои переменные, а не вот эти.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 15:18

Чтож прикажете - уважаемый каждый фаил из проекта пооддельности выкладывать , скачайте лучше WinRar - если лень - коротко - можно играть со свойством Opacity формы.

WinRar то есть))) при открытии файла *.sln выдает ошибку и указывает что необходима более поздняя версия программы))

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Загрузка форм в память

Сообщение Dmitriy2003 » 21.01.2010 (Чт) 15:30

AlekseyVB писал(а):WinRar то есть))) при открытии файла *.sln выдает ошибку и указывает что необходима более поздняя версия программы))

Да-уж не углядел, 2005 студию я уже снес, если у вас нет C#2005 EE - то остается тока ручками собрать (CSC.EXE поможет)- но я думаю вам это совсем не нужно. :)

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Загрузка форм в память

Сообщение MIT » 21.01.2010 (Чт) 15:36

ANDLL писал(а):И атрибутов нет?
Нет, это просто глобальная переменная, которая, кстати, доступна как My.MyProject.Forms.m_Form1, хотя и не видима из-за интересных аттрибутов класса:
Код: Выделить всё
<MyGroupCollection("System.Windows.Forms.Form", "Create__Instance__", "Dispose__Instance__", "My.MyProject.Forms"), EditorBrowsable(EditorBrowsableState.Never)> _
Friend NotInheritable Class MyForms


ANDLL писал(а):В некотором сложном приближении лучше все таки использовать именно свои переменные, а не вот эти.
О чем я и говорил в самом начале...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Загрузка форм в память

Сообщение Dmitriy2003 » 21.01.2010 (Чт) 18:05

AlekseyVB писал(а):Необходимо при запуске первой формы программы загрузить в память все остальные формы.
Если ли другой способ загрузки форм в память без отображения?


Есть и много разных, в приложениее способ на базе ApplicationContext от мсдн :) (Написан на С# (vs2008 .NET FW 2.0)) :)
Вложения
wfa1.1.rar
C#-VS2008-NET.FW-2.0 (ApplicationContext)
(17.72 Кб) Скачиваний: 100

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 21.01.2010 (Чт) 19:05

Вообщем, насколько я понял, прямого аналога Load Form2 как это было в ВБ6 в .Net нету. Только "обходные" пути.

P.S. Буду рад если это окажется не так :D

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: Загрузка форм в память

Сообщение AlekseyVB » 22.01.2010 (Пт) 9:16

А объясните недалекому простым языком чем в действие отличается?
Код: Выделить всё
Form2.Show
от
Код: Выделить всё
Dim frm2 as Form2, frm2 = New Form2
От этого зависит скорость программы или что?

След.

Вернуться в Visual Basic .NET

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

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

    TopList