Me.Hide() při Form_Load   zodpovězená otázka

VB.NET

Zdravím, zajímalo by mě jak se dá schovat formulář hned při spuštění. Myslel jsem, že to půjde jednoduše takhle, ale nefunguje to

        Dim Param As String = System.Environment.CommandLine.ToLower
        If Param.Contains("/startup") Then Me.Hide()

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A co dát formulář mimo obrazovku?

  Private Sub Form1_Load(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles MyBase.Load
    Dim l As Integer = Me.Left
    Dim t As Integer = Me.Top
    Me.Top = Me.Height + Screen.PrimaryScreen.Bounds.Height + 100
    Me.Left = Me.Width + Screen.PrimaryScreen.Bounds.Width + 100
    MsgBox("Formulář je mimo obrazovku, po OK bude vrácen...")
    Me.Top = t
    Me.Left = l
  End Sub

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Hezký den,

a co takhle:

Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Me.Visible = False
    End Sub

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Použít událost Shown, to by možná šlo. Hned jak budu mít možnost, tak to vyzkouším

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To nebude to pravé, provede se Load a pak teprve Shown - Form se tedy na okamžik objeví. Před Load se provede Invalidated, to bude lepší

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Naprostá hloupost. Událost Invalidated nastává při požadavku na překreslení části okna, tudíž by to nastávalo prakticky pořád.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To přece není problém Invalidate ukončit, pokud není potřeba. Kdo chce, ať vyzkouší

Public Class Form1
  Dim cislo As Integer = 0
  Private Sub Form1_Invalidated(ByVal sender As Object, ByVal e As System.Windows.Forms.InvalidateEventArgs) Handles Me.Invalidated
    If cislo > 0 Then Exit Sub ' již nechci formulář skrývat
    Me.Visible = False
    MsgBox("Formuláři  nastaveno ""Me.Visible = False"", po OK se nalouduje, ale nebude vidět..." & vbCrLf & vbCrLf & _
            "Důkaz - proměnná 'cislo' je nula " & vbCrLf & "cislo = " & cislo, MsgBoxStyle.Information, "událost Invalidate")
  End Sub

  Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    cislo = 19
    ' záměrně vyvolám Invalidate
    Me.Invalidate() ' ale skrytí se nezopakuje, cislo > 0
    Me.Text = "cislo je " & cislo & " - nastaveno v 'Shown'"
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    cislo = 5
    MsgBox("Formulář je naloudovaný, ale stále skrytý, po OK bude vidět (provede se ""Me.Visible = True"")..." & vbCrLf & vbCrLf & _
            "Důkaz - proměnná 'cislo' byla v 'Load' změněna na pět " & vbCrLf & "cislo = " & cislo, MsgBoxStyle.Information, "událost Load")
    ' záměrně vyvolám Invalidate
    Me.Visible = True
    Me.Invalidate() ' ale skrytí se nezopakuje, cislo > 0
  End Sub
End Class

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No tak s takovým spraskem bych vás hnal rychlostí zvuku... Proč zcela zbytečně provádět kód, který je podstatný pouze při spuštění aplikace PŘI KAŽDÉ ŽÁDOSTI O PŘEKRESLENÍ OKNA (byť je to jen testování podmínky)?!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jaké zbytečné provádění kódu mate na mysli? To vám tolik vadí Exit Sub? Je to horší než "že oželíte některé ulehčující funkce které poskytuje Application Framework"?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je vidět, že stále nechápete k čemu slouží událost Invalidate a jaké má důsledky použití zbytečného kódu v této metodě... Ty funkce o kterých jsem mluvil oželíte pouze ve zjednodušené formě jak je nabízí Application Framework, běžným způsobem (jako se to dělá v C# kde Application Framework není) samozřejmě jdou používat nadále.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nepoužitelné. Událost Shown nastává při každém volání metody Show, tudíž může nastat v momentě kdy to není žádoucí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdy se provede automaticky Invalidate a Shown kromě startu aplikace?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdybyste četl pozorně, tak byste odpovědi na tuto otázku nalezl v mých předchozích reakcích.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"Událost Invalidated nastává při požadavku na překreslení části okna, tudíž by to nastávalo prakticky pořád. "

A kdy automaticky vznikne ten požadavek na překreslení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lze to udělat jednoduše za cenu toho, že oželíte některé ulehčující funkce které poskytuje Application Framework (automatické ukládání konfigurace, zjednodušené používání událostí aplikace).

Ve vlastnostech projektu na kartě Application zrušte zaškrtnutí políčka Enable application framework, jako Startup object vyberte Sub Main a přidejte do projektu nový modul s následujícím kódem:

Module Module1
  'Deklarace hlavního okna
  Private WithEvents _mainForm As Form1
  'Tzv. Entry Point (vstupní bod pro spuštění aplikace)
  Public Sub Main()
    'Nastavení základních parametrů
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)
    'Vytvoření instance hlavního okna
    _mainForm = New Form1
    'Pokud bude nalezen parametr, zobrazit okno
    If Environment.CommandLine.ToLower.Contains("/startup") Then
      _mainForm.Show()
    End If
    'Spustit smyčku zpracování zpráv
    Application.Run()
  End Sub
  'Zajistit ukončení aplikace při uzavření hlavního okna
  Private Sub _mainForm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles _form1.FormClosed
    Application.Exit()
  End Sub
End Module

Uvědomte si, že tímto způsobem přebíráte veškerou režii správy hlavního okna aplikace na sebe (abyste se nedivil, že když to ten parametr nenajde tak aplikace poběží ale žádné okno se nezobrazí, uživatel nebude mít možnost ukončit aplikaci jinak než Správcem úloh).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já jsem si to myslel, že by to mělo takhle nějak jít (používal jsem to ve VB6), ale nemohl jsem na to přijít. Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback