Save a Save As   zodpovězená otázka

WinForms

Zdravím. Jak napsat kód, který do SaveFileDialogu vrací otevřený soubor? Do ToolStripMenu s názvem File jsem vložil 3 položky, Open, Save a Save As. Save As je klasický SaveFileDialog, kde se otevírá Okno kam napíšu jak název souboru, tak typ přípony, ale jak změnit kód, aby mi přepisoval soubor, který jsem předtím otevřel???

Mám vytvořit proměnnou za Open.FileName a pak na ni odkázat v úkonu SAVE?? Jenže zase když se klikne na tlačítko SAVE tak by se neměl zobrazovat Dialog s ukládáním.

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

Samozřejmě se musí poprvé také zavolat SaveFileDialog, poté si jen uložíte do proměnné cestu a pak budete volad uložení s touto cestou. Zachvíli vám sem hodím kód...

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

Tak kód vám sem nedám, ale přečtěte si toto: http://msdn.microsoft.com/en-us/library/... pomůže to.

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

Dobrý den,

když jsem to kdysi řešil psal jsem to takto.Ovšem nevím jestli někdo ktomu nebude mít nějaké výhrady (nejsem si jist zda je to naprosto správný způsob)

Dim cesta As String
    Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveAsToolStripMenuItem.Click
        Dim sfd As New SaveFileDialog
        With sfd
            .Title = "Ulozit soubor"
            .InitialDirectory = "C:"
            .FileName = ""
            .Filter = "*.rtf|*.rtf"
        End With
        If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
            cesta = sfd.FileName
            Dim fil As New IO.StreamWriter(sfd.FileName)
            fil.Write(RichTextBox1.Text)
            fil.Close()
        End If
    End Sub

    Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click
        If cesta = String.Empty Then
            SaveAsToolStripMenuItem_Click(sender, e)
        Else
            Dim fil As New IO.StreamWriter(cesta)
            fil.Write(RichTextBox1.Text)
            fil.Close()
        End If
    End Sub

Snad to pomůže.Přeji pěkný den.

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

Rád bych vás upozornil, že né každý má disk C. Jako já mám třeba pouze D.

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

Tento kód byla jen ukázka. Dalo by se tam toho vytknout víc. Prostě ať si to kdo chce upravý jak chce :) Navíc standartně má vetšina lidí C:

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

Pokud nemáte rozvrtané PC jako já :).

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

Díky mockrát za příspěvky.

Mohl byste mi vysvětlit následující řádek? Jsem toho ražení že když nepochopím co úkony znamenají tak se to nenaučím:-)

sfd.ShowDialog = Windows.Forms.DialogResult.OK

Jinak je mi zbytek jasný:-)

Já tedy v podstatě použiji pouze toto:

Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click
        Dim fil As New IO.StreamWriter(cesta)
        fil.Write(RichTextBox1.Text)
        fil.Close()
End Sub

s tím, že musím ještě založit proměnnou cesta, kde by měly být údaje z OpenFileDialogu, je to tak?

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

If sfd.ShowDialog = Windows.Forms.DialogResult.OK then

'kod

End If

Kód v této podmínce se spustí po tom co se zobrazí příslušný dialog a uživatel KLEPNE NA OK. Tato podmínka zamezuje pádu aplikace.(Situace kdy uživatel klepne na Cancel a předá se špatná hodnota StreamReaderu nebo Writeru.

 Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click
        If cesta = String.Empty Then
            SaveAsToolStripMenuItem_Click(sender, e)
        Else
            Dim fil As New IO.StreamWriter(cesta)
            fil.Write(RichTextBox1.Text)
            fil.Close()
        End If
    End Sub

Todle by jste měl použít celé. Tato podmínka tu není jen tak pro nic za nic:

 If cesta = String.Empty Then
            SaveAsToolStripMenuItem_Click(sender, e)
        Else

Podmínka se ptá jestli proměnná cesta obsahuje nějaký textový řetězec. Tzn. pokud proměnná cesta neobsahuje textový řetězec zavolá se příslušná procedura kde je savefiledialog. Pokud prměnná cesta obsahuje textový řetězec, tak se pustí tento kód.

  Dim fil As New IO.StreamWriter(cesta)
            fil.Write(RichTextBox1.Text)
            fil.Close()

Jestli není něco jasné tak se ptejte.

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

SaveAsToolStripMenuItem_Click(sender, e) ale toto nějak nechápu. Co v tom znamená, že se má spustit SFD. Ono je to myšleno tak, že se má spustit celá procedura kliknutí na Save As?? A pokud je vyplněná tak se spustí jako Save bez spuštění a zobrazení SaveDialogového okna. Chápu to správně????

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

Pokiaľ je cesta neznáma(ten If) tak sa zavolá celá procedúra SaveAs a tá spustí SFD, pokiaľ je známa, tak SFD netreba.Zbytočne písať dvakrát kód pre spustenie SFD, tak sa využíva jedna procedúra na obe prípady, keď treba zobraziť SFD.

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

Vytknul bych 2 věci:

1. Obsluhy událostí byste neměl volat přímo a předávat jim sender a e. které jste vzal kdoví kde.

SaveAsToolStripMenuItem_Click(sender, e)

Přestože se v té metodě vůbec nepoužívají, časem tam někdo přidá něco, co je používat bude a vznikne z toho problém, který se nehledá tak snadno. Tady v této konkrétní situaci je to jedno, ale je dobré si zvyknout dávat kód, který se volá z více míst, do separátní funkce (třeba s názvem SaveAs) a z obsluhy událostí jej jen volat.

2. Máte tam dvakrát kód, který ukládá soubor. To patří taky do separátní funkce. Vždycky je dobré snažit se vyvarovat opakujícímu se kódu.

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

Díky za připomínky. Vím, že kód by se neměl opakovat (taky tomu ve svých aplikacích zamezuji) , ale tady je evidentní, že pán je začátečník tak proč to komplikovat :)

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

No ono mi hlavně šlo pouze o to, abych se dozvěděl jaký je rozdíl mezi ukládáním do souboru a uložením otevřeného souboru. Jsem na tento problém narazil právě u svého takového většího projektu a myslel jsem, že by to šlo napsat jako odkaz na prodělaný OFD a vytáhnout z něj ty údaje.

Ale za ty kódy jsem moc rád a děkuji za ně.

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

To nemáte zač a přeji ať se Vám projekt vydaří. Mohu se jentak ze zvědavosti zeptat oč se jedná ? :)

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

No stručně:-)

Existuje java aplikace na mobil, která tahá z GPS modulu souřadnice a umí je zobrazit na mapě, jmenuje se TrekBuddy. Já pro tuto aplikaci dělám program, abych si mohl vytvářet GPX soubory s Waypointy.

Zatím má můj program 4 formuláře. První je na tvorbu GPX souborů jenom jako čistých Waypointů nezávislých na sobě, druhý je na navigaci ten se od prvního liší tím, že zapíše waypointy tak za sebe, aby se na mapě zobrazily jako čára podle které se dá jet, třeba na kole, třetí je konvertor souřadnic do dvou formátů a poslední je právě na úpravu gpx souborů a tady jsem právě potřeboval to save a save as.

Další problém byl export do .gpx totiž tento soubor vypadá jako XML a jde otevřít a upravovat v NotePadu, ale nejde to normálně uložit v SFD s tím, že si tam člověk napíše příponu |*.gpx| to už jaksi ne no:-) Na to mi právě odpověděl vážený pan Herceg, že je potřeba buď sehnat přesnou specifikaci souboru nebo knihovnu, která to píše. A tady jsem taky skončil, nevím kde hledat. Jinak program vyvíjím dál a dál. Vždycky mě napadne co bych ještě mohl udělat a hned k tomu sednu a píšu:-)

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

Nepomôže toto:

http://www.topografix.com/gpx.asp

http://www.topografix.com/GPX/1/1/

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

Tak to jsem asi potřeboval:-) No to je myslím určitě ono

Mockrát díky zkusím z toho dostat to co potřebuju, což je v podstatě vše:-)

Ještě jednou díky

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

Tak to jsem asi potřeboval:-) No to je myslím určitě ono

Mockrát díky zkusím z toho dostat to co potřebuju, což je v podstatě vše:-)

Ještě jednou díky

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

1.A je rozumnejšie mať v projekte stovky podobných procedúr?

Keď si niekto proste zapíše pred metódu poznámku, že netreba používať tie dve parametre, tak ktokoľvek iný, kto

by mohol na projekte pracovať, to bude vedieť.

Public Function btnOpen_Click(sender As Object,e As EventArgs)
  OpenFile()
End Function

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

To je nesmyslný argument. Sice se takhle většina aplikací píše, ale dělat se to tak správně nemá a u velký aplikací, které jsou takhle psány, to způsobuje obrovské problémy s rozšiřitelností a udržovatelností.

Obsluha události by měla dělat tyto věci (některé lze samozřejmě vynechat):

1. vytažení hodnot z komponent

2. zavolání metody z nějaké business vrstvy (minimálně v jiné třídě, rozhodně ne přímo ve formuláři)

3. podle výsledků té metody zaktualizovat komponenty

Ve formuláři by neměl být žádný kód, co sahá do databáze nebo něco počítá, načítá či ukládá. To patří do jiných tříd (každá třída by měla být dělána jen pro jeden účel a nemá dělat víc různých věcí).

Vymýšlet různé výjimky a popisovat je v komentářích je opět u větších aplikací cesta do pekel - vždycky je výhodnější se snažit, aby API (pojmenování a způsoby použití metod a tříd) bylo co nejpříjemnější a intuitivní (abych ho mohl použít ideálně i bez mnoha komentářů a bez krajních případů).

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

Dobre, tak budem v jednoformulárovej aplikácii mať zvlášť triedu, ktorá ukladá a načíta súbory, zvlášť triedu, ktorá vypočitá scénu, a tretiu, ktorá napr. bude obsluhovať výnimky a vypisovať hlášky.

Je to rozumnejšie ?

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

Rozhodně ano.

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

No tak to potom vravte riemerovi. V tých tutoriáloch o XNA je to všetko nacpané v jednej triede, v jednom súbore. A pritom by sa to dalo pekne rozdeliť na jednotlivé komponenty a každú keď aj nie do inej triedy, ale aspoň do iného súboru a dať metódam nejaký prefix.

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

ako je správne písať triedy ? myslím tím pridávať ich do Form1.vb alebo vytvoriť samostatnú Class.vb ? Používam druhé riešenie - Class.vb ,ale dopočul som sa ,že je vtom minimálne spomalenie aplikácie ,ale prehladnosť v kóde je perfektná.

Teoreticky je množtvo tried neobmedzené ,ale kolko je asi rozumné ich vytvoriť ? ja používam na každú často používanú a potrebnu/zložitú funkciu samostatnú Class.vb triedu.

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

dopočul som sa ,že je vtom minimálne spomalenie aplikácie

Kdo vám takovouhle krávovinu řekl? Žádné zpomalení, které by stálo za řeč, se přidáním nové třídy rozhodně nekoná. Ani když těch tříd přidáte tisíc, tak to na rychlost aplikace nemá vliv, pokud obsahují stejný kód, který byste měl ve třídě jedné.

Jediné, v čem to může být pomalejší, je, že spustitelný soubor bude o pár bajtů větší (u tisíce tříd asi o pár kB), což znamená naprosto zanedbatelné zpomalení při spouštění souboru.

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

Mám to od jedného násťročného. Ďakujem Vám za objasnenie :-)

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

Vyřešil jsem to jednoduše. Vytvořil jsem si proměnnou hned v základu aplikace, kterou mám jako:

 
Dim saver As string = string.empty

A sem se ukládá vždy cesta (FileName) z OFD nebo SFD, pokud nebylo nic otevřený nebo uložený, odkáže se na Save As.

Je to jednoduchý sice jsem musel vytvořit další proměnnou, ale co na tom :-)

Díky moc za odpovědi

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