Otázky a odpovědi

V této rubrice najdete odpovědi na své otázky, které můžete zasílat na adresu vbtipy@seznam.cz. Pokud nebudeme znát odpověď na nějakou otázku, objeví se v části Otázky bez odpovědi a budete-li znát odpověď vy, můžete nám ji pomocí výše uvedené adresy zaslat, rádi ji zveřejníme.

Otázky a odpovědi

Otázky bez odpovědi

Otázky a odpovědi

  Jak mám vytvořit formulář, který bude pořád nahoře (jako Panel zástupců MS Office).

Objekt Form ve Visual Basicu nemá žádnou vlastnost, pomocí které by to šlo udělat. Jediná možnost, jak si v tomto případě pomoci, je použít funkci API SetWindowPos.

SetWindowPos frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE


  Vytvořil jsem si na cd soubor autorun.inf a pomocí prvku Picture, nebo Button bych chtěl otevřít HTML stránku, která by byla na cd spolu se spouštěcím souborem. Např: f:\autorun.exe se souborem f:\index.htm. Tohle bych uměl, ale háček je v tom, že v jiném počítači, kde je jednotka cd označená jako d:\, tak se HTML stránky neotevřou, protože je navigace na f:\index.htm. Jaký kód zde má být použit?

Musíte samozřejmě zjistit, jaké písmeno je přiřazeno CD mechanice. Nejjednodušší způsob jak toho dosáhnout ve Visual Basicu, je použít objekt FileSystemObject. Nejdříve projdete jeho kolekci Drives, zjistíte typy jednotlivých mechanik a pokud existuje mechanika CD, můžete s ní pracovat pomocí objektu Drive, tzn. zjistit třeba jí přiřazené písmeno z vlastnosti DriveLetter. Abyste mohl pracovat s těmito objekty, musíte v projektu vytvořit odkaz (References) na Microsoft Scripting Runtime Library.

Dim fso As New FileSystemObject, drv As Drive
Dim isCDROM As Boolean

isCDROM = False
For Each drv In fso.Drives
  If drv.DriveType = CDRom Then
    isCDROM = True
    Exit For
  End If
Next drv

If isCDROM Then
  Debug.Print drv.DriveLetter & ":\index.html"
Else
  MsgBox "V pocitaci neni CD mechanika."
End If


  Jakým způsobem je možné zapisovat a číst data na/z seriový nebo paralelní port?

Na komunikaci s porty můžete použít např. knihovnu win95io.dll. Má pouze dvě funkce, jednu k zápisu na port, druhou ke čtení. Použití je velmi jednoduché, stačí zadat adresu portu a zavolat funkci (pro zápis je samozřejmě zapotřebí také předat data). Knihovnu najdete na adrese www.softcircuits.com/sw_tools.htm, nějaké informace jak s ní pracovat např. na www.aaroncake.net/electronics/vblpt.htm.


  Jak jde udělat ve VB 5.0, aby byl umožněn pohyb myši pouze v programu? Zkoušel jsem funkci API ClipCursor, ale nešlo mi to.

Funkce API ClipCursor umožňuje zamknout myš v zadané oblasti, jejíž souřadnice musí být v pixelech. Nejjednodušší je zjistit souřadnice formulář pomocí funkce API GetWindowsRect a ty potom zadat funkci ClipCursor.

Dim ret As Long, r As RECT
ret = GetWindowRect(Form1.hwnd, r)
ret = ClipCursor(r)

Uvolnění kurzoru myši ze zadaného regionu provedete potom takto:

Dim r As RECT, ret As Long, dhWnd As Long
dhWnd = GetDesktopWindow()
ret = GetWindowRect(dhWnd, r)
ret = ClipCursor(r)


  Potřebuji nastavit datumy (LastAccess, Create, Change) zvoleného souboru na zvolené datum. A ještě by mě zajímalo, jaký převodový vztah existuje ve Windows pro zápis datumu souboru ve formátu FILETIME (dva Longy) a běžným zápisem datumu/času. Vím že, existuje funkce FileDateTime, která zjištuje datum souboru, ale pokud použiju API, dostanu FILETIME.

V tomto případě proměnná typu FILETIME představuje počet 100 nanosekundových intervalů, které uběhly od 1. ledna 1601. Pokud chcete toto číslo převést na "normální" datum nebo čas, musíte jej nejdřív převést na lokální datum (časová zóna) pomocí funkce API FileTimeToLocalFileTime a potom na srozumitelné datum pomocí API FileTimeToSystemTime. Tak zjistite rozumné datum.

Dim hFile As Long, ret As Long
Dim ctime As FILETIME, atime As FILETIME, mtime As FILETIME
Dim stime As SYSTEMTIME

hFile = CreateFile("C:\soubor.txt", GENERIC_READ, FILE_SHARE_READ, ByVal CLng(0), OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
If hFile = -1 Then
  Debug.Print "Nelze otevrit soubor"
Else
  ret = GetFileTime(hFile, ctime, atime, mtime)
  ret = FileTimeToLocalFileTime(ctime, ctime)
  ret = FileTimeToSystemTime(ctime, stime)

  Debug.Print "Datum: " & stime.wDay & "." & stime.wMonth & "." & stime.wYear

  ret = CloseHandle(hFile)
End If

Pokud chcete datum a čas nastavit, je postup opačný, tzn. nejdříve nastavit proměnnou typu SYSTEMTIME. Tu převést na datum a čas srozumitelný pro systém (proměnna typu FILETIME) pomocí API SystemTimeToFileTime. Nakonec tuto proměnou převedete pomocí API LocalFileTimeToFileTime na správnou časovou zónu a funkcí API SetFileTime nastavíte datum a čas souboru.


  Pred asi 2-3 mesiacmi som vám poslal odpoveď na otázku v "Otázky a odpovědi" na Chip CD. Keď som na následujúcich CD stále našiel túto otázku, rátal som z určitým oneskorením ako dôvod, prečo tam otázka ešte stále je. Na moju odpoveď ste mi odpísali a preto som si myslel, že pomohla. Posielam vám teda moju odpoveď a príklad znovu ...

Pokud posíláte jakýkoliv dotaz nebo odpověď na dotaz, musíte vždy počítat s určitým spožděním. Časopis Chip a tedy i CD příloha je měsíčník a CD se vždy připravuje s určitým předstihem. Odpověď na dotaz např. v čísle 5/2001 se proto neobjeví v čísle následujícím, jak byste předpokládali, ale spíše až v čísle 7/2001, někdy až v 8/2001.


Otázky bez odpovědi

  Našel jsem v API vieweru funkci SetWindowsHook, ale jaksi ji neumím použít. Můžete mi prosím napsat jednoduchý návod s příkladem?


  Jak lze přijímat/posílat data na některý z portů ve Windows 2000?


  Nevíte kde se dá sehnat (pokud existuje) prvek, který se chová jako textové pole ve Wordu?


  Používám VB6 a chtěl bych z mého programu otevřít soubor PhotoPaintu. Kód vypadá následovně:

Dim xApp as PHOTOPAINT.CPntAutomate
xApp.FileOpen ("nazov suboru")

Bohužel to takto nefunguje. Co ještě musím zadat, aby se soubor otevřel?


  Jak zjistit, kolik bajtů bylo staženo přes Internet v předem dané době? Jde mi o připojení přes lokální síť, ne přes modem.


  Potřebuji ve Visual Basicu pípnout, tj. vydat zvuk o určité frekvenci a délce. Myslel jsem na funkci API Beep, ta však umožňuje pípnout pouze ve Windows NT, ve Windows 9x přehraje systémový zvuk.


  Jak se dá přepínat klávesnice? Např. z anglické do české a nazpět.


  Jak se dá ve Visual basicu ovládat USB port?


  Ve Windows 98 jsem vytvořil program s ovládacím prvkem Timer. Program fungoval bez problémů, ale když jsem jej spustil na Windows 2000, prvek časoval asi 5x rychleji. Nevíte so s tím?


  Potřebuji ve svém programu použít průhledný textbox nebo textbox, ve kterém by byl na pozadí mnou vybraný obrázek. Na Internetu jsem našel tři různé návody, ale ani jeden neposkytuje takové funkce jako původní textbox (ScrollBar, DataField atd.).