Autosave   zodpovězená otázka

VB.NET, WinForms

Dnes ještě jeden dotaz.

Mám napsanou třídu, která mi zajišťuje ukládání.

Chtěl bych aby probíhalo i automatické ukládání např. po deseti minutách do vlastního souboru pro případ výpadku proudu, či uživatelské chybě, že aplikaci zavře bez uložení (i když je varován)

Jelikož se bude aplikace nadále rozšiřovat, tak chci mít kód ukládání jenom jeden.

Sub UlozeniBalance()

        If Form1.SaveFile_Balance.ShowDialog() = DialogResult.OK Then
            Dim soubor As String = Form1.SaveFile_Balance.FileName
            If File.Exists(soubor) Then
                If MsgBox("Soubor existuje. Přepsat?", MsgBoxStyle.OkCancel Or MsgBoxStyle.Question, "Přepsání souboru") = MsgBoxResult.Cancel Then Exit Sub
            End If

            Dim save As New RecordWriter(soubor)

            ' kod verze aplikace
            save.write("[VERZE]")
            save.write("ver.1,0")

            ' Informace
            save.write("[INFORMACE]")
.
.
.

            save.close()
            MsgBox("Soubor uložen", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")
        Else
            MsgBox("Soubor nebyl uložen", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")
        End If
End Sub

Je v tomto případě vhodné použít Goto, nebo použít druhou možnost viz níže.

Popřípadně použít třetí možnost, která mě nenapadá...

    Sub UlozeniBalance(Optional ByVal autosave As Boolean = False)
        Dim soubor As String
        If autosave = True Then
            soubor = IO.Path.Combine(Application.StartupPath, "Backup/neco.blc")
        Else
            If Form1.SaveFile_Balance.ShowDialog() = DialogResult.OK Then
                soubor = Form1.SaveFile_Balance.FileName
                If File.Exists(soubor) Then
                    If MsgBox("Soubor existuje. Přepsat?", MsgBoxStyle.OkCancel Or MsgBoxStyle.Question, "Přepsání souboru") = MsgBoxResult.Cancel Then Exit Sub
                End If
            Else
                MsgBox("Soubor nebyl uložen", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")
                Exit Sub
            End If
        End If

        Dim save As New RecordWriter(soubor)

        ' kod verze aplikace
        save.write("[VERZE]")
        save.write("ver.1,0")

        ' Informace
        save.write("[INFORMACE]")
.
.
.


        ' konec verze 1.0

        save.close()
        MsgBox("Soubor uložen", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")


    End Sub

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

Ahoj,

nějak z toho přízpěvku nevidím, kde by jsi to Goto chtěl použít.

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

K přeskočení uživatelského vybrání do jakého souboru budeme ukládat.

Sub UlozeniBalance()
Dim soubor As String

  If autosave = True Then 
      soubor = IO.Path.Combine(Application.StartupPath, "Backup/neco.blc")
      Goto neco
  Else
  End If

        If Form1.SaveFile_Balance.ShowDialog() = DialogResult.OK Then
            soubor = Form1.SaveFile_Balance.FileName
            If File.Exists(soubor) Then
                If MsgBox("Soubor existuje. Přepsat?", MsgBoxStyle.OkCancel Or MsgBoxStyle.Question, "Přepsání souboru") = MsgBoxResult.Cancel Then Exit Sub
            End If

neco: 
           Dim save As New RecordWriter(soubor)

            ' kod verze aplikace
            save.write("[VERZE]")
            save.write("ver.1,0")

            ' Informace
            save.write("[INFORMACE]")
.
.
.

            save.close()
            MsgBox("Soubor uložen", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")
        Else
            MsgBox("Soubor nebyl uložen", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "Uložení souboru kombinace MT, AT")
        End If
  autosave = False
End Sub

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

Pokud jsem tě pochopil :-)

    ''' <summary>
    ''' Ukládání balance
    ''' </summary>
    ''' <param name="autosave">True - auto / False - dialog</param>
    ''' <remarks></remarks>
    Private Sub UlozeniBalance(Optional ByVal autosave As Boolean = False)

        'cesta k souboru
        Dim soubor As String = String.Empty

        If autosave Then
            'automat. ukládání
            soubor = IO.Path.Combine(Application.StartupPath, "xxxxxx.xxx")
            Me.SaveBalanceByRecordWriter(soubor)
        Else
            'použití dialogového okna
            Using dlg As New Form1.SaveFile_Balance()
                If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
                    soubor = dlg.FileName
                Else
                    Exit Sub
                End If
            End Using
        End If

        'kontrola souboru
        If IO.File.Exists(soubor) Then
            If MessageBox.Show("Soubor existuje! Přepsat?", "Přepsání souboru ?", MessageBoxButtons.YesNo, _
                               MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) <> Windows.Forms.DialogResult.OK Then
                Exit Sub
            End If
        End If

        'soubor je prázdný
        If soubor = String.Empty Then Exit Sub

        'uložení
        Me.SaveBalanceByRecordWriter(soubor)
    End Sub

    ''' <summary>
    ''' Procedura pro uložení
    ''' </summary>
    ''' <param name="fileName">název souboru</param>
    ''' <remarks></remarks>
    Private Sub SaveBalanceByRecordWriter(ByVal fileName As String)

        'pokud RecordWrite implementuje IDisposable
        'jinak tak jak to máš ty dim rw as new recordwriter(soubor)
        Using rw As New RecordWriter(fileName)
            With rw
                .write("[VERZE]")
                .write("ver.1,0")
                .write("[INFORMACE]")
                .close()
            End With
        End Using

    End Sub

Prosím tě, pošli mi svoje tč. na mail: [email protected]

Chodily jsme spolu na SPŠS Chrudim, dal bych řeč.

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

Zdravím,

a není jednodušší ukládat po každé změně hodnot? Tím dosáhnete toho, že po vypnutí proudu neztratíte nic.

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

Otázka zněla zda se v tomto případě dá použít GoTo (jelikož jsem se na pár diskuzích dočetl "nevraživost" ohledně Goto :). Ne řešit otázku ukládání.

Soubor, který ukládám má několik tisíc řádků. Nebylo by vhodné po každé změně nějaké buňky zatěžovat procesor ukládáním.

Každopádně díky za snahu a přečtení.

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

Goto by v tomhle případě vhodný určitě nebylo.

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

Základní problém je, že funkce má dělat jednu věc a ne dvě nebo tři.

Funkce, kterou píšete, má ukládat soubor, nic víc, nic míň. Zobrazit hlášku, že už to je hotovo, nebo že nastala chyba, má být minimálně v jiné funkci, typicky dokonce v jiné třídě nebo vrstvě aplikace.

Pak byste nemusel řešit takovéhle nesmysly s goto.

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