Zdrojové kódy

Vykreslení grafu Program
Tisk dat z databáze Program
Subclasing control Program
Popis chyby Windows Program
Visual Basic a rok 2000 Tip
API funkce SHFormatDrive Kód
API funkce GetSystemMetrics Kód
Zaheslovaná databáze Access, žádný problém Kód
Skrytá položka výčtu Kód
Prázdná stránka v prohlížeči Kód
MultiSelect ListBox Kód
Výběr textu v TextBoxu Kód
Jak přeskočit na konec textu v TextBoxu Kód
ENTER se chová stejně jako TAB Kód
Rozklad barvy na RGB složky Kód

Vykreslení grafu

Program, který ukazuje, jak za pomocí PictureBoxu nakreslit graf, v tomto případě z dat v databázi.
6032 bytů Kopírovat

Zpět na obsah


Tisk dat z databáze

Nemáte-li rádi aplikaci Crystal report, zkuste tisknout z databáze sami pomocí objektu Printer. Zde je malý příklad.
7321 bytů Kopírovat

Zpět na obsah


Subclasing control

Protože zde nenaleznete program, ale ActiveX prvek, hodil by se tento příspěvek spíše do části ActiveX. Obsahuje však i svůj zdrojový kód a 8 příkladů, proto jsme jej zařadili sem. A co umí? Prvek umí detekovat zprávy, které nejsou přímo podporovány Visual Basicem.
46383 bytů Kopírovat

Zpět na obsah


Popis chyby Windows

Pokud nastane nějaká chyba, většinou chcete dát uživateli vědět jaká. Jak zobrazit popis chyb, které vyvolává operační systém, najdete v tomto programu.
1652 bytů Kopírovat

Zpět na obsah


Visual Basic a rok 2000

Pokud používáte čtyřmístný formát pro vyjádření roku, nemusíte si s přechodem na rok 2000 dělat žádné starosti. Pokud však používáte pouze dvoumístný formát, budou pro vás další informace určitě důležité.

Visual Basic do verze 3.0 včetně

V těchto verzích, je jakýkoliv dvoumístný rok považován za rok 20. století. Tedy jakýkoliv dvoumístný rok bude převeden na rok začínající 19. Např. 95, bude 1995, 21 bude 1921 atd.

Visual Basic 4.0

Protože od této verze nejsou funkce pro datum implementovány v runtime knihovnách, ale v knihovně OLE Automation, záleží při převodu data na verzi knihoven OLE Automation. Jediná funkce, která je nadále v runtime knihovnách je DateSerial. Pro ní platí stejné pravidlo jako pro 16-bitové aplikace.

V 16-bitových aplikacích (16-bitová verze OLE) jsou veškeré dvoumístné roky převedeny na století aktuálního systémového data. Tzn. máte-li systémové datum 2001, bude rok 23 převeden na 2023, je-li systémové datum 1998, bude rok 23 převeden na 1923.

Ve 32-bitových aplikacích je situace stejná, je-li nainstalován pouze VB 4.0 (knihovna OLE Automation - OleAut32.DLL - verze 2.1). Pokud máte verzi 2.2 a vyšší (např. v produktech Internet Explorer 3.0 a vyšší, Windows NT 3.51 SP5, Windows NT 4.0, Windows 95 OSR 2, Office 97, Visual Basic 5.0, a další), je dvoumístný rok 30 až 99 převeden na 1930 až 1999, rok 00 až 29 je převeden na 2000 až 2029.

Visual Basic 5.0 a vyšší

U této a vyšší verze Visual Basicu jsou všechny dvoumístné roky (včetně použití funkce DateSerial) 30 až 99 převedeny na 1930 až 1999, roky 00 až 29 jsou převedeny na 2000 až 2029.

Zpět na obsah


API funkce SHFormatDrive

Na midulém CD jsme uvedli tip, jak pomocí funkce SHFormatDrive naformátovat disketu. Zde naleznete celý popis této funkce.

Declare Function SHFormatDrive Lib "shell32"(ByVal hwndOwner As Long, _
   ByVal iDrive As Long, ByVal iCapacity As Long, ByVal iFormatType As Long) As Long

hwndOwner - handle okna, ke kterému se vztahuje dialog
iDrive - mechanika k formátování (A = 0, B = 1, atd.)
iCapacity - výsledná kapacita média

	'Konstanty pro Windows 95
	Public Const SHFD_CAPACITY_DEFAULT = 0  'defaultní kapacita
	Public Const SHFD_CAPACITY_360 = 3      '360 kB
	Public Const SHFD_CAPACITY_720 = 5      '720 kB

iFormatType - typ formátování

	'Konstanty pro Windows 95
	Public Const SHFD_FORMAT_QUICK = 0      'rychlý formát
	Public Const SHFD_FORMAT_FULL = 1       'plný formát
	Public Const SHFD_FORMAT_SYSONLY = 2    'zkopírovat pouze systémové soubory
	'Konstanty pro Windows NT
	Public Const SHFD_FORMAT_FULL = 0       'plný formát
	Public Const SHFD_FORMAT_QUICK = 1      'rychlý formát 

Zpět na obsah


API funkce GetSystemMetrics

Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long 

Funkce GetSystemMetrics vrací informace o mnoha různých věcech ve Windows. Mnoho z nich je velikost objektů, např. obrazovky, ikon, atd. Dále také poskytuje informace o systému. Jakou informaci funkce vrátí, je závislé na parametru nIndex. Jeho hodnoty mohou být následující.

SM_ARRANGE = 56
  Pouze Win95/98 - vrací metodu použitou k zobrazení minimalizovaných oken: Hodnota je
  kombinací dvou následujících. Jedna pro počáteční pozici a druhá je vzdálenost, v jaké
  je přidána další.
  ARW_BOTTOMLEFT = 0
    začíná v levém spodním rohu obrazovky
  ARW_BOTTOMRIGHT = 1
    začíná v pravém spodním rohu obrazovky
  ARW_TOPLEFT = 2
    začíná v levém horním rohu obrazovky
  ARW_TOPRIGHT = 3
    začíná v pravém horním rohu obrazovky
  ARW_LEFT = 0
    přidá ikonu vlevo od existující
  ARW_UP = 0
    přidá ikonu nad existující
  ARW_RIGHT = 4
    přidá ikonu vpravo od existující
  ARW_DOWN = 4
    přidá ikonu pod existující
  ARW_HIDE = 8
    neumístí ikonu
SM_CLEANBOOT = 67
  Pouze Win95/98 - vrací, jak byl počítač nastartován. 0 normálně, 1 nouzový start,
  2 nouzový start s prací v síti
SM_CMOUSEBUTTONS = 43
  Počet tlačítek myši, 0 v případě, že myš není nainstalovaná
SM_CXBORDER = 5
  WinNT - šířka pozadí okna
  Win95/98 - šířka pozadí "single" okna
SM_CXCURSOR = 13
  WinNT - šířka kurzoru
  Win95/98 - šířka standardní kurozorové bitmapy
SM_CXDLGFRAME = 7
  Pouze WinNT - šířka rámu dialogu
SM_CXDOUBLECLK = 36
  Šířka obdélníku, ve kterém musí být dvakrát kliknuto pro rozpoznání double-click
SM_CXDRAG = 68
  Minimální šířka, o kterou se musí kurzor pohnout pro začátek operace drag-and-drop
SM_CXEDGE = 45
  Pouze Win95/98 - šířka 3D pozadí okna
SM_CXFRAME = 32
  Pouze WinNT - šířka pozadí okna, které může měnit velikost
SM_CXFULLSCREEN = 16
  Šířka plochy v okně, které je roztáhnuto na celou obrazovku
SM_CXHSCROLL = 21
  Pouze Win95/98 - šířka bitmapy ukazatele na horizontálním ScrollBaru
SM_CXHTHUMB = 10
  Šířka "posuvníku" horizontálního ScrollBaru
SM_CXICON = 11
  Standardní (default) šířka ikony
SM_CXICONSPACING = 38
  WinNT - šířka buňky pro umístění ikony
  Win95/98 - šířka buňky pro umístění ikony v pohledu Velké ikony (Large View)
SM_CXMAXIMIZED = 61
  Pouze Win95/98 - standardní šířka maximalizovaného okna
SM_CXMAXTRACK = 59
  Pouze Win95/98 - standardní maximální šířka, na kterou je možné zvětšit okno
SM_CXMENUCHECK = 71
  Pouze Win95/98 - šířka standardní bitmapy pro zobrazení check-mark menu
SM_CXMENUSIZE = 54
  Pouze Win95/98 - šířka tlačítka v menu (menu bar button)
SM_CXMIN = 28
  Minimální šířka okna
SM_CXMINIMIZED = 57
  Pouze Win95/98 - šířka normálního minimalizovaného okna
SM_CXMINSPACING = 47
  Pouze Win95/98 - šířka buňky pro zobrazování minimalizovaných oken
SM_CXMINTRACK = 34
  Pouze Win95/98 - standardní minimální šířka, kam je uživateli dovoleno zmenšit okno
SM_CXSCREEN = 0
  Šířka obrazovky
SM_CXSIZE = 30
  WinNT - šířka bitmapy titulku okna (TitleBar)
  Win95/98 - šířka tlačítka v titulku okna
SM_CXSIZEFRAME = 32
  Pouze Win95/98 - šířka "Thick" rámu okna
SM_CXSMICON = 49
  Pouze Win95/98 - doporučená šířka pro malé ikony
SM_CXSMSIZE = 52
  Pouze Win95/98 - šířka malého tlačítka v titulku okna
SM_CXVSCROLL = 2
  Pouze Win95/98 - šířka vertikálního ScrollBaru
SM_CYBORDER = 6
  WinNT - výška pozadí okna
  Win95/98 - výška pozadí "single" okna
SM_CYCAPTION = 4
  Výška plochy titulkového pruhu
SM_CYCURSOR = 14
  WinNT - výška kurzoru
  Win95/98 - výška standardní kurzorové bitmapy
SM_CYDLGFRAME = 8
  Pouze WinNT - výška rámu dialogu
SM_CYDOUBLECLK = 37
  Výška obdélníku, do kterého je nutno kliknout myší pro rozpoznání double-click
SM_CYDRAG = 69
  Minimální výška o kterou se musí posunou kurzor pro začátek operace drag-and-drop
SM_CYEDGE = 46
  Pouze Win95/98 - výška 3D pozadí okna
SM_CYFRAME = 33
  Pouze WinNT - výška pozadí okna, které může měnit velikost
SM_CYFULLSCREEN = 17
  Výška plochy okna, které je přes celou obrazovku (full-screen)
SM_CYHSCROLL = 3
  Pouze Win95/98 - výška horizontálního ScrollBaru
SM_CYICON = 12
  Standardní výška ikony
SM_CYICONSPACING = 39
  WinNT - výška buňky pro umístění ikony
  Win95/98 - výška buňky pro umístění ikony v pohledu Velké ikony (Large icon view)
SM_CYMAXIMIZED = 62
  Pouze Win95/98 - standardní výška maximalizovaného okna
SM_CYMAXTRACK = 60
  Pouze Win95/98 - standardní maximální výška, kam může uživatel roztáhnout okno
SM_CYMENU = 15
  Výška panelu menu
SM_CYMENUCHECK = 72
  Pouze Win95/98 - výška standardní bitmapy pro zobrazení check-mark menu
SM_CYMENUSIZE = 55
  Pouze Win95/98 - výška tlačítka v menu (menu bar button)
SM_CYMIN = 29
  Minimální výška okna
SM_CYMINIMIZED = 58
  Pouze Win95/98 - výška normálního minimalizovaného okna
SM_CYMINSPACING = 48
  Pouze Win95/98 - výška buňky pro umístění minimalizovaného okna
SM_CYMINTRACK = 35
  Pouze Win95/98 - standardní minimální výška, na kterou může uživatel zmenšit okno
SM_CYSCREEN = 1
  Výška obrazovky
SM_CYSIZE = 31
  WinNT - výška bitmapy titulkového pruhu
  Win95/98 - výška tlačítka v titulkovém pruhu
SM_CYSIZEFRAME = 33
  Pouze Win95/98 - výška rámu "thick" okna
SM_CYSMCAPTION = 51
  Pouze Win95/98 - výška plochy malého titulku
SM_CYSMICON = 50
  Pouze Win95/98 - doporučená výška pro malé ikony
SM_CYSMSIZE = 53
  Pouze Win95/98 - výška malého tlačítka v titulkovém pruhu
SM_CYVSCROLL = 20
  Pouze Win95/98 - výška bitmapy ukazatele na vertikálním ScrollBaru
SM_DEBUG = 22
  Vrací nenulovou hodnotu, pokud je nainstalována ladící verze USER.EXE, 0 pokud ne
SM_MENUDROPALIGNMENT = 40
  Vrací nenulovou hodnotu, pokud se popup menu zobrazuje vpravo, 0 v případě
  zobrazování vlevo
SM_MIDEASTENABLED = 74
  Vrací nenulovou hodnotu, jestli je system nastaven na použití Hebrejštiny
  a Arabštiny, 0 pokud ne
SM_MOUSEPRESENT = 19
  Vrací nenulovou hodnotu, jestliže je myš nainstalována a rozpoznána, 0 pokud ne
SM_NETWORK = 63
  Pokud je nainstalována síť, nastaví bit &H1 návratové hodnoty.
SM_PENWINDOWS = 41
  Vrací nenulovou hodnotu, jestliže je nainstalováno rozšíření MS Windows
  for Pen computing, jinak 0
SM_SLOWMACHINE = 73
  Vrací nenulovou hodnotu, pokud má PC pomalý procesor, 0 pokud ne
SM_SWAPBUTTON = 23
  Vrací nenulovou hodnotu, pokud jsou přehozena tlačítka myši (levé za pravé a naopak)

Zpět na obsah


Zaheslovaná databáze Access, žádný problém

Zaheslovali jste si databázi Access a neznáte heslo? Použijte tuto VELICE JEDNODUCHOU funkci. Na ofsetu &H42 (neboli 66) stačí přečíst 13 znaků a použít funkci XOR s jednotným klíčem a hle, heslo je na světě. Databáze může být klidně i zašifrovaná, postup se vůbec nemění.

Public Function DejMDBHeslo(ByVal soubor As String) As String
  Dim i As Long, s As Integer, strKlic As String
  Dim strHeslo As String, strCti As String * 13

  If Len(Dir(soubor)) = 0 Then
    MsgBox "Soubor neexistuje"
  Else
    strKlic = "†űě7]DśúĆ^(ć"

    s = FreeFile
    Open soubor For Binary As #s
      Get #s, 67, strCti
    Close s

    For i = 0 To 12
      strHeslo = strHeslo & _
        Chr(Asc(Mid(strCti, i + 1, 1)) Xor Asc(Mid(strKlic, i + 1, 1)))
    Next i

    DejMDBHeslo = strHeslo
  End If
End Function

Kdo tomu nevěříte, zkopírujte si tento prográmek, spusťte jej a potom zkuste databázi otevřít z heslem, které vám nabídl.

Zpět na obsah


Skrytá položka výčtu

Chcete-li mít některou položku ve výčtovém typu skrytou, uzavřete ji do hranatých závorek a před název dejte podtržítko. Celé to může vypadat třeba takto:

Public Enum mujVycet
  prvni=1
  druhy=2
  [_skryty]=3
  posledni=4
End Enum

V tomto případě je skrytá položka [_skryty].

Zpět na obsah


Prázdná stránka v prohlížeči

Jestliže používáte prvek WebBrowser, a chcete zobrazit prázdnou stránku, zkuste tento kód:

Public Sub PrazdnaWWW(browser AS WebBrowser)
  browser.Navigate "about:blank"
End Sub

Je to výhodné už z toho důvodu, že WebBrowser vypadá s prázdnou stránkou mnohem lépe než bez jakékoliv stránky (přidá ScrollBar a udělá ze sebe 3D okno).

Zpět na obsah


MultiSelect ListBox

Máte-li povolen MultiSelect (u ListBoxu) a chcete zjistit, které položky jsou vybrané, není jiné cesty než této:

Dim i As Long

For i = 0 To List1.ListCount - 1
  If List1.Selected(i) Then
    Debug.Print "Položka " & List1.List(i) & " je vybrána."
  End If
Next i

Pokud zná někdo lepší způsob, neváhejte a napište.

Zpět na obsah


Výběr textu v TextBoxu

Přesune-li se uživatel Vašeho programu na nějaké textové pole (po našem TextBox), často chce původní text automaticky označit. Jak to udělat? Vyberte si, co se vám líbí více:

Private Sub Text1_GotFocus()
  SendKeys "{home}+{end}"
End Sub

Private Sub Text1_GotFocus()
  Text1.SelStart = 0
  Text1.SelLength = Len(Text1.Text)
End Sub

Zpět na obsah


Jak přeskočit na konec textu v TextBoxu

Text1.SelStart = Len(Text1.Text)

To je opravdu všechno.

Zpět na obsah


ENTER se chová stejně jako TAB

Na stisk klávesy TAB se focus (fokus, ohnisko ...) přesune na další prvek. Chcete-li tohoto dosáhnout i po stisku klávesy ENTER, použijte tento kód:

Private Sub Form_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    SendKeys "{TAB}"
  End If
End Sub

Zpět na obsah


Rozklad barvy na RGB složky

Množství červené, zelené a modré barvy v barvě určené jedním číslem získáme takto:

cervena = barva Mod 256
zelena = (barva \ 256) Mod 256
modra = barva \ 256 \ 256

Pokud dostanete číslo v poněkud jiném formátu (systémové barvy, třeba &H7000000B), vykreslete v této barvě bod na obrazovku a zjistěte jeho barvu takto:

PSet (1,1),&H7000000B	'vykresleni bodu
barva=Point(1,1)	'zjisteni barvy

S takto zjištěnou barvou už můžete zopakovat výše uvedený postup rozkladu na jednotlivé složky RGB.

Zpět na obsah