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 mohu ve Visual Basicu zjistit písmeno jednotky CD-ROM a zapsat ho např. do labelu?

Písmeno zjistíte tak, že projdete všechny objekty Drive v kolekci Drives objektu FileSystemObject. Které mají typ (DriveType) 4, jsou CD.

Dim fso As Object, drv As Object
Set fso = CreateObject("Scripting.FileSystemObject")
For Each drv In fso.Drives
  If drv.DriveType = 4 Then
    Label1.Caption = Label1.Caption & drv.DriveLetter
  End If
Next drv


  Ve Visual Basicu 6.0 mám tento kód:

rtbText.RightMargin = 120 * 1024 'toto hlásí overflow...
rtbText.RightMargin = 122880 '...ale toto ne

Zajímalo by mě, proč tomu tak je. Vždyť přece 120*1024 = 122880, tak proč to při použití násobení hlásí chybu přetečení a při použití kostanty nikoliv?

Chyba není v RichTextBoxu, ale v implicitní konverzi datových typů (zkuste dát třeba při přerušeném programu v okně Immediate vytisknout ten samý výraz: ? 120 * 1024, nastane stejná chyba). Číslo 120 i 1024 je automaticky bráno jako Integer (předpokládám že to jsou pouze konstanty, ne proměnné, u těch by měl být typ samozřejmě explicitně určen). Tzn. jejich výsledek je také brán jako Integer, jenže Integer má max. 32767, z toho plyne ta chyba. Zkuste dát např. CLng(120) * 1024. V tomto případě už bude vše v pořádku, protože první číslo je Long, druhé Integer, výsledek je "větší", tzn. Long.


  Jak změním ikonu v oblasti system tray? Po spuštění formuláře se načte ikona ico1 a já ji při pěhu programu potřebuji změnit. Také by mi pomohlo, kdyby byla ikona v system tray stejná jako ikona formuláře a mě stačilo jen změnit ikonu formuláře. Jde to?

Změnit ikonu není problém, stačí vykonat stejnou proceduru jako při jejím umístění do system tray, pouze při volání API funkce Shell_NotifyIcon zadáte konstantu NIM_MODIFY místo NIM_ADD. Předtím je samozřejmě potřeba změnit ikonu u formuláře, pokud ji berete z vlastnosti Icon. Můžete si změnu umístit do procedury a volat ji vždy při změně ikony formuláře.


  Jak mohu zjistit poslední den v měsíci? Neboli potřebuji vědět, kolik dní má měsíc v daném roce.

Nejdříve přidejte k zadanému datu jeden měsíc.

DateAdd("M",1, datDate)

Potom z tohoto data vytvořte nové a to tak, že použijete rok a měsíc, den dejte 1.

datNew = DateSerial(DatePart("Y", datDate), DatePart("M", datDate), 1).

Od tohoto data odečtěte 1, tj jeden. den a máte datum, které je posledním dnem daného měsíce.

MsgBox DatePart("D", datNew -1).


  Potřebuji programu nastavit vlastnost, aby se neukazoval v seznamu běžících programů, tj. po stisku Ctrl+Alt+Delete.

Program můžete schovat pomocí API funkce RegisterServiceProcess.

Private Declare Function RegisterServiceProcess Lib "kernel32" _
(ByVal dwProcessID As Long, ByVal dwType As Long) As Long

Dim i1 As Long
i1 = GetCurrentProcessId()
'schová
RegisterServiceProcess i1, 1
'ukáže
RegisterServiceProcess i1, 0


  Jak můžu zjistit číslo prvního zobrazeného řádku v prvku RichTextBox? U FlexGridu je k tomu vlastnost TopRow, u RichTextBoxu ale nic podobného není.

Číslo prvního viditelného řádku zjistíte pomocí funkce SendMessage (první řádek je 0, druhý 1 atd.)

MsgBox "První řádek: " & SendMessage(rtf1.hwnd, EM_GETFIRSTVISIBLELINE, 0, 0)


Otázky bez odpovědi

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


  Potřebuji použít funkci Inkey, ale Visual Basic ji nemá. Neznáte způsob, jak ji nahradit?


  Nevíte jak zjistit, které klávesy byly stisknuty, když je můj program na pozadí? Nějak to jít musí, využívají toho např. programy CS-VOICE a BlackBox.


  Jak je možné změnit IP adresu a masku podsítě pomocí Visual Basicu 5.0 nebo 6.0 na Windows 2000? A je možné vrátit nastavení zpět na získání IP z DHCP serveru?


  Zkoušel jsem přidat bitmapu do menu pomocí API funkce SetMenuItemBitmaps. V normálním menu to funguje. Jakmile však stejný postup použiji v PopupMenu, obrázek se nezobrazí.


  Rád by som získal informácie o API funkciách pre prácu s resources, spôsob ich volania vo VB a informácie potrebné pre správny chod funkcie: loadresource, findresorce, freeresource, updateresource. Chcel by som urobiť malý lokalizátor, a na to sú potrebné tieto funkcie, v angličtine (MSDN) som čosi porozumel, ale neviem ako loadnuté resource zobraziť v Image, txt objekte, a ako ich updatovať do súboru.


  V MSDN je zmienka o použití interfacu k objektom Windows Exploreru na vloženie objektov (Listview, treeview, combo, taskbar atď ) do vlastných aplikácií, ale priložené vzory sú pre C++. Chcem Vás požiadať o nejaké moduly alebo príklady pre použitie týchto objektov, za čo Vám budem veľmi vďačný ! Zaujíma ma hlavne zobrazenie Listview, treeview, combo z exploreru a objekty z taskbaru (tabsysview, systraj objekt, objekt hodín a ponuky Štart pre vytvorenie nového typu taskbaru). Veľmi Vás prosím o pomoc.