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)
GetSaveFileNameTato 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")
CharUpperFunkce 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")
DeleteFileBez ř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
|