GetOpenFileName

Jistě znáte z windows standartní dialogy pro otevření, nebo uložení souboru.
Pomocí API funkcí "GetOpenFileName" a "GetSaveFileName" je můžete snadno využít
v VB. Jejich použitím si ušetříte spoustu práce s vytvářením vlastního dialogu.
Funkce GetOpenFileName zobrazí dialog "Otevřít soubor".
Návratovou hodnotou je řetězec cesty včetne jména souboru, formát řetězce záleží na použití kostanty OFN_ALLOWMULTISELECT .

Parametry funkce:
pOpenfilename

proměnná typu OPENFILENAME

Parametry struktury OPENFILENAME:
lStructSize

?
hwndOwner

Handle objektu k nemuž bude dialog vázán.
hInstance

?
lpstrFilter

Nastavuje filtr na daný tip souborů jenž budou v dialogu zobrazeny.
Filtry lze kombinovat pomocí operátoru zřetězení "&" a klíčového slova vbNullChar,
na konci seznamu filtrů se uvádí dvakrát vbNullChar.
Příklad -> lpstrFilter = "Textové soubory" & vbNullChar & "*.txt" & vbNullChar & _
"Audio soubory" & vbNullChar & "*.wav" & vbNullChar & "Divné soubory" & _
vbNullChar & "*.stb" & vbNullChar & vbNullChar
lpstrCustomFilter

?
nMaxCustFilter

?
nFilterIndex

Při zadání více druhů typů souborů zde můžete určit který bude použit jako default (čísluje se od jedničky).
lpstrFile

Nastavuje "buffer" pro vrácenou cestu včetně jména souboru.
nMaxFile

Velikost "bufferu" "lpstrFile".
lpstrFileTitle

Nastavuje buffer pro vrácenou cestu včetně jmen souborů pokud je použit vícenásobný výběr.
nMaxFileTitle

Velikost "bufferu" lpstrFileTitle.
lpstrInitialDir

Nastavuje default cestu jenž dialog otevře. Např. "C:\Dokumenty".
lpstTitle

Popis jenž bude zobrazen v titulkovém pruhu dialogu. Např. "Otevřít soubor..."
flags

Flag určuje za jakých podmýnek bude soubor k dispozici. Flagy lze kombinovat operátorem "OR"
při použití kostant, nebo je rovnou sčítat (např. flags = &H1 + &H200).

OFN_READONLY = &H1

Zobrazí na dialogu zaškrtávací políčko "Otevřít jen pro čtení"
OFN_HIDEREADONLY = &H4

Nezobrazí na dialogu zaškrtávací políčko "Otevřít jen pro čtení"
OFN_NOCHANGEDIR = &H8

?
OFN_SHOWHELP = &H10

Zobrazí tlačítko pro nápovědu (jak s ním pracovat to nevím).
OFN_NOVALIDATE = &H100

Nekontroluje neplatné znaky v názvu souboru
OFN_ALLOWMULTISELECT = &H200

Umožní vybrat více souborů najednou. Vrácena je cesta a názvy souborů oddělené mezerou.
Např. "C:\Dokumenty souborA.txt souborB.txt souborC.txt"

Deklarace:

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Příklad mého použití: (tohle jsem si trochu poupravil pro svou potřebu)



'#### Modul ####

Option Explicit

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Public Function OtevriSoubor(ByVal Handle As Long, ByVal Multiselect As Byte, _
Optional ByVal Titulek As String, Optional ByVal Cesta As String, _
Optional ByVal IndexFiltru As Byte, Optional ByVal FiltrTypu As String) As String

Dim soubor As OPENFILENAME

soubor.hwndOwner = Handle
soubor.lpstrTitle = IIf(Titulek = "", "Otevřít soubor...", Titulek)
soubor.lpstrInitialDir = Cesta
soubor.nFilterIndex = IndexFiltru
soubor.lpstrFilter = IIf(FiltrTypu = "", "Všechny soubory" & vbNullChar & "*.*" & vbNullChar & vbNullChar, FiltrTypu)
soubor.lpstrFile = vbNullChar & Space(255 - 1)
soubor.nMaxFile = 255
soubor.lpstrFileTitle = Space(255)
soubor.nMaxFileTitle = 255
soubor.flags = IIf(Multiselect, &H200, 0) + &H4
soubor.lStructSize = Len(soubor)

If GetOpenFileName(soubor) = 0 Then Exit Function

OtevriSoubor = Left(soubor.lpstrFile, Len(soubor.lpstrFile) - 1)

End Function


#### libovolné místo v programu ####

Dim JmenoSouboru As String

JmenoSouboru = OtevriSoubor(Form1.hwnd, 0, , "C:\Dokumenty", , "Textové soubory" & vbNullChar & _
"*.TXT" & vbNullChar & "Divné soubory" & vbNullChar & "*.stb" & vbNullChar & vbNullChar)

Debug.Print IIf(JmenoSouboru = "", "Soubor neni!", JmenoSouboru)




GetSaveFileName

Tato funkce zobrazí dialog "Uložit soubor". Návratovou hodnotou je řetězec cesty včetne jména souboru.
Použití je v podstatě stejné jako "GetOpenFileName", pouze přibila jedna konstanta parametru "flags".
Proto už uvedu pouze příklad.
 

Tohle je navíc:
OFN_OVERWRITEPROMPT = &H2

Ověřuje zda soubor již existuje. Pokud ano, zeptá se uživatele zda chce soubor přepsat.
'#### Modul ####

Option Explicit

Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Public Function UlozSoubor(ByVal Handle As Long, Optional ByVal Titulek As String, _
Optional ByVal Cesta As String, Optional ByVal IndexFiltru As Byte, _
Optional ByVal FiltrTypu As String) As String

Dim soubor As OPENFILENAME

soubor.hwndOwner = Handle
soubor.lpstrTitle = IIf(Titulek = "", "Uložit soubor...", Titulek)
soubor.lpstrInitialDir = Cesta
soubor.nFilterIndex = IndexFiltru
soubor.lpstrFilter = IIf(FiltrTypu = "", "Všechny soubory" & vbNullChar & "*.*" & vbNullChar & vbNullChar, FiltrTypu)
soubor.lpstrFile = vbNullChar & Space(255 - 1)
soubor.nMaxFile = 255
soubor.lpstrFileTitle = Space(255)
soubor.nMaxFileTitle = 255
soubor.flags = &H2 + &H4
soubor.lStructSize = Len(soubor)

If GetSaveFileName(soubor) = 0 Then Exit Function

UlozSoubor = Left(soubor.lpstrFile, Len(soubor.lpstrFile) - 1)

End Function

'#### libovolné místo v programu ####

Dim JmenoSouboru As String

JmenoSouboru = UlozSoubor(Form1.hwnd, , "C:\Dokumenty", , "Všechny soubory" & vbNullChar & _
"*.*" & vbNullChar & vbNullChar)

Debug.Print IIf(JmenoSouboru = "", "Soubor neni!", JmenoSouboru)


CharLower

Funkce převede obsah proměnné typu String na malá písmena, přičemž číslice a jiné znaky jsou přeskočeny.
Návratovou hodnotou je převedený řetězec.

Parametry:
lpsz

řetězec pro převedení

Deklarace:
Declare Function CharLower Lib "user32.dll" Alias "CharLowerA" _
(ByVal lpsz As String) As String

Použití:
Debug.Print CharLower("ReTeZeC123456") '(vrátí "retezec123456")


CharUpper

Funkce převede obsah proměnné typu String na velká písmena, přičemž číslice a jiné znaky jsou přeskočeny.
Návratovou hodnotou je převedený řetězec.

Parametry:
lpsz

řetězec pro převedení

Deklarace:
Declare Function CharUpper Lib "user32" Alias "CharUpperA" _
(ByVal lpsz As String) As String

Použití:
Debug.Print CharUpper("ReTeZeC123456") '(vrátí "RETEZEC123456")


DeleteFile

Bez řečí odstraní zvolený soubor z média. Pokud nastane chyba tzn. soubor neexistuje nebo
má nastavený atribut "Jen pro čtení" vrátí 0, jinak 1.
Pozor nepřesouvá do "Koše"!!!

Parametry:
lpFileName

název souboru včetně cesty

Deklarace:
Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" _
(ByVal lpFileName As String) As Long

Použití:
Dim test As Long
test = DeleteFile("C:\TestovaciSoubor.txt")
Debug.Print IIf(test, "Vse je v poradku", "Nastala chyba")

 

Dnes to bylo krátké a proto na závěr přidám něco o zachytitelných chybách.
K těm může dojít za běhu a vývoje aplikace nebo v době kompilace.
Zachytitelné chyby lze testovat a odpovídat na ně. k tomu slouží příkaz On Error a objekt Err.
Čísla chyb v rozsahu 1 – 1000, která nejsou využita, jsou rezervována pro budoucí použití v programu Visual Basic.

Kód Zpráva
3 Return bez GoSub
5 Neplatné volání procedury
6 Přetečení
7 Nedostatek paměti
9 Index mimo rozsah
10 Pole je pevné nebo dočasně zamknuté
11 Dělení nulou
13 Typ nesouhlasí
14 Nedostatek místa v řetězci
16 Příliš složitý výraz
17 Požadovanou operaci nelze provést
18 Přerušeno uživatelem
20 Obnovení bez chyby
28 Nedostatek místa v zásobníku
35 Sub, Function, or Property není definováno
47 Knihovnu DLL využívá příliš mnoho aplikací
48 Chyba při načítání knihovny DLL
49 Chybná konvence volání knihovny DLL
51 Vnitřní chyba
52 Špatný název nebo číslo souboru
53 Soubor nebyl nalezen
54 Špatný režim souboru
55 Soubor je již otevřen
57 Vstupně-výstupní chyba zařízení
58 Soubor již existuje
59 Chybná délka záznamu
61 Plný disk
62 Vstup za koncem souboru
63 Chybné číslo záznamu
67 Příliš mnoho souborů
68 Zařízení není dostupné
70 Přístup odmítnut
71 Disk není připraven
74 Nelze přejmenovat s jinou jednotkou
75 Chyba v přístupu k souboru nebo k cestě
76 Cesta nenalezena
91 Proměnná typu Object nebo blok With není nastavena
92 Smyčka For není inicializovaná
93 Chybný řetězec vzorku
94 Chybné použití položky Null
97 Nelze vyvolat proceduru Friend na objekt, jež není případem definující třídy
298 Systémovou knihovnu DLL nelze zavést
320 Názvu znakových zařízení nelze použít v názvech souborů
321 Chybný formát souboru
322 Nelze vytvořit nezbytný dočasný souboru
325 Chybný formát v souboru prostředků
327 Hodnota s názvem nenalezena
328 Neplatný parametr, nelze zapsat pole
335 Nelze použít systémový registr
336 Součást ActiveX není správně registrována
337 Součást ActiveX nelze najít
338 Součást ActiveX nepracovala správně
360 Objekt je již načten
361 Nelze načíst nebo uvolnit objekt
363 Zadaný ovládací prvek ActiveX nebyl nalezen
364 Objekt nebyl načten
365 V tomto kontextu nelze uvolnit
368 Požadovaný soubor je zastaralý. Tento program vyžaduje novější verzi
371 Zadaný objekt nemůže být použit jako vlastník formuláře pro Show
380 Chybná hodnota,vlastnosti
381 Chybný index pole vlastností
382 Vlastnost Set nemůže být uplatněna při běhu programu
383 Vlastnost Set nemůže být použita pouze pro čtení
385 Je potřeba index pole vlastností
387 Vlastnost Set není povolena
393 Vlastnost Get uplatněna při běhu programu
394 Vlastnost Get nemůže být použita pouze pro čtení
400 Formulář je již zobrazen, nelze zobrazit modálně
402 Kód musí nejprve zavřít nejvyšší modální formulář
419 Právo použít objekt odepřeno
422 Vlastnost nenalezena
423 Vlastnost nebo metoda nenalezena
424 Vyžaduje se objekt
425 Chybné použití objektu
429 Součást ActiveX nemůže vytvořit objekt nebo odkaz na tento objekt
430 Třída neumožňuje automatizaci
432 Název souboru nebo třídy nebyl během operace automatizace nalezen
438 Objekt s touto vlastností nebo metodou nepracuje
440 Chyba automatizace
442 Bylo ztraceno spojení do typové nebo objektové knihovny pro vzdálené procesy
443 Objekt automatizace nemá výchozí hodnotu
445 Objekt tuto akci neumožňuje
446 Objekt nepracuje s pojmenovanými parametry
447 Objekt nepracuje s místním nastavením
448 Pojmenovaný parametr nenalezen
449 Argument není volitelný nebo chybné přiřazení vlastnosti
450 Chybný počet parametrů nebo chybné přiřazení vlastnosti
451 Objekt není kolekce
452 Chybná hodnota
453 Zadaná funkce DLL nenalezena
454 Kódový prostředek nenalezen
455 Chyba zamykání kódového prostředku
457 Klíč je již přidružen k prvku této kolekce
458 Proměnná používá typ, který není v jazyce Visual Basic platný
459 Tato součást nepodporuje události
460 Chybný formát stránky
461 Zadaný formát neodpovídá formátu dat
480 Nelze vytvořit obraz AutoRedraw
481 Chybný obrázek
482 Chyba tiskárny
483 Ovladač tiskárny neumí pracovat se zadanou vlastností
484 Nelze získat informace o tiskárně ze systému. Zkontrolujte , zda je tiskárna správně nainstalovaná
485 Chybný typ obrázku
486 Na tento typ tiskárny nelze obrázek formuláře vytisknout
520 Nelze vyprázdnit schránku
521 Nelze otevřít schránku
735 Nelze uložit soubor do TEMP
744 Hledaný text nenalezen
746 Nahrazovaný text je příliš dlouhý
31001 Nedostatek paměti
31004 Žádný objekt
31018 Třída nenastavena
31027 Nelze aktivovat objekt
31032 Nelze vytvořit vložený objekt
31036 Chyba při ukládání do souboru
31037 Chyba při čtení ze souboru



© 2005 Jindřich Mach & Jan Ticháček