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.).
|