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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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á...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 :-)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
''' <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: m.plsko@hse.cz

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

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