Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: sub Main() - не понимаю... Добавлено: 17.09.08 19:29  

Автор вопроса:  DimDoc

Ответить

  Ответы Всего ответов: 26  

Номер ответа: 16
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #16 Добавлено: 02.10.08 17:31
Привет Всем!!!
Все ответы интересные. Чего спорите-то?
 Steel Brand - однозначно Всё объяснил (это для продвинутых).
А я то только пытаюсь понять что к чему.
Зато вопросы читаете не внимательно...
Ну не получалось у меня. Не беда. Не боги горшки обжигали.....
спрашиваю
Как запустить проект из Sub Main()?

Steel Brand отвечает
Зачем эта морока с Sub Main?

сам нахожу ответ
 

Решение найти удалось... Теперь весь код выглядит так:
Module Module1
    Public f As Form1
    Sub main()
        f = New Form1
        Application.Run(f)
    End Sub
End Module

Обратите внимание - никакого f.show() !!!

Steel Brand возмущается моей тупости
Ну тебе же показали как Application.Run работает, что не ясно?

Это в смысле:
4) Application.Run запускает цикл обрабокти сообщений, если не делать свой Sub Main то все равно эта функция будет вызываться неявно.
?
да... это правда... Но вот в чём штука: как только программист написал процедуру Main() - с этого момента он должен ЯВНО НАПИСАТЬ APPLICATION.RUN(стартовая форма).
в случае с одной формой это выглядит просто (и действительно Steel Brand прав -
Зачем эта морока с Sub Main?
. Объяснюсь ещё раз - исключительно с учебной целью.):
  1.  
  2. Module Module1
  3.      Sub Main()
  4.           Dim f1 as New Form1
  5.           Application.run(f1)
  6.      End Sub
  7. End Module


Второй пример: основная форма и форма заставка (тоже - исключительно с учебной целью)
  1.  
  2. Module ModuleMain
  3.     Sub main()
  4.         Dim f1 As New Form1
  5.         Dim s As New SplashScreen1
  6.         s.Timer1.interval = 1000  ' таймер будет "тикать" 1 раз в секунду        
  7.         s.Timer1.Start()              ' запускаем таймер (смотри процедуру ниже)
  8.         s.ShowDialog()               ' здесь используется именно модальная форма
  9.         Application.Run(f1)
  10.     End Sub
  11. End Module
  12. определяем условие скрытия формы заставки:
  13. [source]
  14.  Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  15.         Static mNext As Long
  16.         mNext += 1
  17.         If mNext = 3 Then mNext = Nothing : Timer1.Stop() : Me.Hide()
  18.     End Sub


Ну вроде разобрался.
Да и Steel Brand пишет:
Перечитай еще раз тему, тебе на все вопросы ответили

Ну не на все, допустим...
Извините срочно убегаю....

Ответить

Номер ответа: 17
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #17 Добавлено: 02.10.08 20:06
Я одного не понимаю.. Зачем ты создаешь Sub main() когда эта процедура создается автоматически при создании проекта? И все твои открытия там написаны!

Ответить

Номер ответа: 18
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #18 Добавлено: 03.10.08 02:08
Если Вас удовлетворяет то, что
создается автоматически при создании проекта
- никаких возражений не имею.
Лично для себя я понял, что управлять процессом загрузки приложения можно только через Sub Main().
Можно определить - запущено Ваше приложение или нет ещё задолго до загрузки всех форм и инициализации переменных.
Можно произвольно изменить время отображения заставки на экране.
Пользователям легче перенести одну длительную загрузку в начале, чем многократные загрузки форм в ходе работы с приложением.
Если это не так - покажите на примере.

Ответить

Номер ответа: 19
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #19 Добавлено: 03.10.08 02:11
Может немного не точно выразился...
Не
только через Sub Main().
, а удобнее через Sub Main().

Ответить

Номер ответа: 20
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #20 Добавлено: 03.10.08 02:12
Кстати, где бы на эту автоматически сгенерированную Sub Main() взглянуть?

Ответить

Номер ответа: 21
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #21 Добавлено: 03.10.08 08:28
В С# стартовая процедура выглядит так выглядит так:
  1.  
  2.     static class Program
  3.     {
  4.         /// <summary>
  5.         /// The main entry point for the application.
  6.         /// </summary>
  7.         [STAThread]
  8.         static void Main()
  9.         {
  10.             Application.EnableVisualStyles();
  11.             Application.SetCompatibleTextRenderingDefault(false);
  12.             Application.Run(new Form1());
  13.         }
  14.     }



В VB.NET из за извращенцев которые ввели в этот язык пространство имен My (My.Application, My.Settings & etc) стартовая процедура несколько изменена и находится в недрах класса MyApplication, и сама процедура загрузки приложения выглядит следующим образом
  1.  
  2. '------------------------------------------------------------------------------
  3. ' <auto-generated>
  4. '     This code was generated by a tool.
  5. '     Runtime Version:2.0.50727.1433
  6. '
  7. '     Changes to this file may cause incorrect behavior and will be lost if
  8. '     the code is regenerated.
  9. ' </auto-generated>
  10. '------------------------------------------------------------------------------
  11.  
  12. Option Strict On
  13. Option Explicit On
  14.  
  15.  
  16. Namespace My
  17.     
  18.     'NOTE: This file is auto-generated; do not modify it directly.  To make changes,
  19.     ' or if you encounter build errors in this file, go to the Project Designer
  20.     ' (go to Project Properties or double-click the My Project node in
  21.     ' Solution Explorer), and make changes on the Application tab.
  22.     '
  23.     Partial Friend Class MyApplication
  24.         
  25.         <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
  26.         Public Sub New()
  27.             MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
  28.             Me.IsSingleInstance = false
  29.             Me.EnableVisualStyles = true
  30.             Me.SaveMySettingsOnExit = true
  31.             Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
  32.         End Sub
  33.         
  34.         <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
  35.         Protected Overrides Sub OnCreateMainForm()
  36.             Me.MainForm = Global.vbTest.Form1
  37.         End Sub
  38.     End Class
  39. End Namespace



Раположена она в файле Application.Designer.vb и управляется ечрез свойства проекта.
И чтобы работать со Splashsreen тебе надо внимательно ознакомиться с классом My.Application. Там есть достаточо много настроек для приложения. Кроме того в VB предусмотрен ряд событий типа Startup и Shutdown и т.д., которые так же помогут управлять приложением в целом

Ответить

Номер ответа: 22
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #22 Добавлено: 03.10.08 14:02
Спасибо EROS за подробный ответ!
Мне это очень интересно.

Ответить

Номер ответа: 23
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #23 Добавлено: 03.10.08 14:10
Ещё раз спасибо....
EROS - посмотрите пожалуйста мой вопрос:

форма отображается, но не получает фокус...

Пробовал переписать через Main() - всё получилось, фокус на поле ввода.

Это я что-то настраиваю при компиляции не так?

Ответить

Номер ответа: 24
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #24 Добавлено: 04.10.08 00:45
да... это правда... Но вот в чём штука: как только программист написал процедуру Main() - с этого момента он должен ЯВНО НАПИСАТЬ APPLICATION.RUN(стартовая форма).

Совершенно верно. Потом что до того как программист написал процедуру Main, эта процедура была за него создана системой и в ней была аналогичная строчка кода.

Steel Brand возмущается моей тупости

Ну я пролистал страницу одним вращением скорла, не следил кто кому отвечал, просто увидел что рабочий код был приведен, кем он был приведен я не разбирался.

Лично для себя я понял, что управлять процессом загрузки приложения можно только через Sub Main().

Я тебе скажу - совсем не только через Sub Main (ниже я покажу как).

Можно определить - запущено Ваше приложение или нет ещё задолго до загрузки всех форм и инициализации переменных.

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

Кстати, где бы на эту автоматически сгенерированную Sub Main() взглянуть?

Если работаешь с C#, открой автоматически сгенерированный файл Program.cs и увидишь.
Под VB .NET, как сказал EROS, его так просто не увидишь потому что там немного другая модель (я бы сказал, VB .NET дает Windows-программисту гораздо больше помощи чем C#, что, в принципе, сложилось исторически, что бы не говорили сторонники C# в его защиту :)

Но если воспользоваться прогарммой Reflector то эту процедуру легко найти:
  1.     <EditorBrowsable(EditorBrowsableState.Advanced), STAThread, DebuggerHidden> _
  2.     Friend Shared Sub Main(ByVal Args As String())
  3.         Try
  4.             Application.SetCompatibleTextRenderingDefault(WindowsFormsApplicationBase.UseCompatibleTextRendering)
  5.         End Try
  6.         MyProject.Application.Run(Args)
  7.     End Sub


То что привел EROS - это инициализация WindowsFormsApplicationBase, это не совсе то.

Теперь что касается того что ты собственно хочешь сделать.

1) Создаешь Splash-форму, на ней вообще может не быть ни строчки кода.
2) Создаешь основную форму приложения, там уже пиши сколько хочешь кода
3) Заходишь в свойства проекта, вкладка Application
4) Устанавливаешь опции Startup Form и Splash Screen
5) Жмешь View Application Events. При этом будет создан файл ApplicationEvents.vb
6) Создаешь в этом файле обработчик нужных тебе событий, их там не много.

Например что-то типа такого, я вставил задержку чтоб симитировать какой-то длительный процес загрузки

  1.         Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
  2.             System.Threading.Thread.Sleep(10000)
  3.         End Sub


Жмешь F5 и прозреваешь :)

Это так сказать типа круиз-контроля, можно все это лепить в Sub Main но чтоб это делать, нужно четко понимать что делаешь и как это будет работать.

Ответить

Номер ответа: 25
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #25 Добавлено: 04.10.08 02:53
Спасибо, Steel Brand!!!
Чтобы понять - нужно переварить информацию...
Сейчас этим и займусь.

Ответить

Номер ответа: 26
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #26 Добавлено: 04.10.08 16:42
Чтобы найти правду - ты должен верить

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам