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 zjistit, kter² prvek mß prßv∞ focus? Vφm ₧e existuje funkce SetFocus, kterß jej nastavφ, ale jß pot°ebuji v∞d∞t, kter² prvek jej mß.

Ka₧d² formulß° mß vlastnost ActiveControl, kterß ukazuje na aktußlnφ prvek, tj. ten, kter² mß focus. Tzn. p°es tuto vlastnost m∙₧ete s prvkem jednoduÜe pracovat. Nap°.:

MsgBox Form1.ActiveControl.Name
Form1.ActiveControl.Caption="tlacitko 1"


  V AccessovskΘ databßzi mßm dv∞ tabulky. Jedna (Autor) sou₧φ jako Φφselnφk autor∙ a druhß (Knihovna) slou₧φ k evidenci knih. Vytvo°φm-li si ve VB formulß° na uklßdßnφ dat do tabulky KNIHOVNA, jak docφlφm toho, aby se data o autorech pomocφ ComboBoxu naΦφtala z tabulky AUTOR? A dßle jak docφlit toho, zadßm-li nap°. do polo₧ky Jazyk ·daj "Φesk²", aby se v ComboBoxu objevili jenom ti auto°i, co majφ v Φφselnφku autor∙ uvedeno v polo₧ce Jazyk ·daj "Φesk²"?

Je d∙le₧itΘ, jestli chcete pro p°φstup k databßzi pou₧φt Data prvek a na n∞j vßzanΘ prvky. Pokud ano, pou₧ijte DBCombo. Mß vlastnosti RowSource a ListField, pomocφ nich₧ se navß₧ete na jin² Data prvek, kter² bude obsahovat informace z tabulky Autori. Tyto informace se potom zobrazφ v seznamu ComboBoxu. Na zm∞nu jazyka se potom m∙₧e m∞nit zdroj Data prvku, na to staΦφ jednoduch² SQL dotaz.

Pokud nechcete pou₧φt vßzanΘ prvky a Data prvek, tak staΦφ vytvo°it Recordset s informacemi o autorech a jeho obsah "natßhnout" do seznamu ComboBoxu.


  Kdy₧ chci spustit makro v jazyce VBA, dostanu tuto hlßÜku:

The macros in this project are disabled. Please refer to the online help or documentation of the host application to determine how to enable macros.

Nejsme bohu₧el ₧ßdnφ p°ebornφci ve VBA, ale podle tazatele nßmi navr₧en² postup funguje, tak₧e asi takto:

ProblΘm je zp∙soben zßkazem provßd∞nφ maker. Je t°eba zapnout antivirovou ochranu (ve Wordu to je menu Nßstroje -> Mo₧nosti, zßlo₧ka ObecnΘ, polo₧ka Antivirovß ochrana maker) a spustit aplikaci znovu (Word). Kdy₧ po dotazu dßte povolit makra, m∞lo by to fungovat.


  Pou₧φvßm VB 5.0 enterprise edition. Ten umo₧≥uje vytvß°enφ vlastnφch OCX objekt∙. Potφ₧ je v tom, ₧e kdy₧ vytvo°φm projekt ocx, p°idßm do n∞ho formulß° a modul (pro sdφlenφ polφ prom∞nn²ch), tyto pole se nem∞nφ, tzn. ₧e kdy₧ si na testovacφ formulß° polo₧φm n∞kolik t∞chto objekt∙, v jednom z nich n∞co zm∞nφm, okam₧it∞ se to promφtne i do ostatnφch - nepracujφ nezßvisle na sob∞, jako by sdφlely prom∞nnΘ.

TakovΘ chovßnφ je v po°ßdku. Pokud n∞co v modulu nadefinujete jako Public, je to sdφlenΘ pro vÜechny instance prvku. To je prßv∞ ten rozdφl mezi t°φdou a modulem, t°φda je pouze vzor, podle kterΘho se vytvß°φ instance, kde₧to modul je vlastn∞ u₧ "instance".


  Kdy₧ bude aktivnφ aplikace (₧e nebude na pozadφ), kterß bude mφt v titulku nap°. "Internet Explorer", aby se provedla urΦitß funkce a obrßcen∞, kdy₧ nebude aplikace s tφmto titulkem aktivnφ (bude na pozadφ), aby byla vyvolßna zase jinß funkce.

M∙₧ete pou₧φt Timer, kter² bude v n∞jakΘm ΦasovΘm intervalu kontrolovat, kterß aplikace je aktivnφ pomocφ API GetForegroundWindow (vracφ handle aktivnφ aplikace). Pomocφ GetWindowText potom zjistφte titulek tΘto aplikace. No a potom u₧ provßdφte ty svoje funkce.


  M∙₧ete prosφm poradit, jak programov∞ zjistφm cestu ke slo₧ce oblφbenΘ polo₧ky?

N∞jak takto:

ret = SHGetSpecialFolderLocation(0, &H6, idl)
If ret = 0 Then
  cesta = Space(255)
  SHGetPathFromIDList idl.mkid.cb, cesta
  MsgBox cesta 'toto je cesta ke slo₧ce oblφbenΘ polo₧ky
End If

Deklarace funkcφ a typ∙:

Private Type SHITEMID
  cb As Long
  abID As Byte
End Type

Private Type ITEMIDLIST
  mkid As SHITEMID
End Type

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long


  Cht∞l jsem si ud∞lat program, kter² bude mφt vφce ne₧ jedno okno. Ty vedlejÜφ by se m∞ly p°ilepovat k oknu hlavnφmu (tak jako t°eba PlayList u WinAMPu), ale nev∞d∞l jsem si s tφm rady. Neustßle se mi stßvalo (kdy₧ se mi koneΦn∞ povedlo n∞co napsat), ₧e kdy₧ se okno p°ilepilo, a jß jej odtahoval, tak po°ßd nep°φjemn∞ problikßvalo. Mohli by jste mi napsat n∞jak² jednoduch² p°φklad na p°ilepovßnφ?

Trochu slo₧it∞jÜφ p°φklad, proto jsme vytvo°ili projekt ve VB, kter² si m∙₧ete zkopφrovat. Funguje to tak, ₧e pokud je ve Windows nastaveno zobrazovanφ obsahu okna b∞hem p°etahovßnφ, p°etahuji se ob∞ narßz, pokud to nenφ nastaveno, je vid∞t pouze obrys toho jednoho a a₧ po p°eta₧enφ se ob∞ objevφ zase u sebe.


  Pot°eboval bych v PictureBoxu (pop°φpad∞ ve Frame) vypsat text na urΦitΘ sou°adnice, ale ne p°es Label. Vφm ₧e C++ Builder mß takovou funkci: Image->Canvas->TextOutA(x,y,text). Jde to n∞jak ud∞lat i ve VB?

PictureBox mß metodu Print. Nenabφzφ ji sice v seznamu ani nenφ vid∞t v Object browseru, ale je tam. No a pomocφ vlastnostφ CurrentX a CurrentY nastavφte, kam se mß text vypsat:

Pic1.CurrentX = 500
Pic1.CurrentY = 150
Pic1.Print "Text na x 500 a y 150"


  Ve formulß°i mßm rßmec a v n∞m n∞kolik textov²ch polφ, do kter²ch se zadßvajφ ·daje. Pot°ebuji omezit pohyblivost myÜi pouze na tento rßmec, dokud u₧ivatel nestlaΦφ tlaΦφtko "Ulo₧".

V²°ez, ve kterΘm se mß myÜ pohybovat, lze nastavit pomocφ API funkce ClipCursor.

Private Type RECT
  left As Long
  top As Long
  right As Long
  bottom As Long
End Type
Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long

Dim r As RECT
r.left = 100
r.right = 200
r.bottom = 200
r.top = 100
ClipCursor r

Pokud to chcete nastavit zp∞t na celou obrazovku, staΦφ nastavit zp∞t na puvodnφ hodnoty. NejlΘpe to lze takto (GetDesktopWindow a GetWindowRect jsou takΘ API funkce, jejich deklaraci naleznete v API Vieweru):

Dim r As RECT, retval As Long, deskhWnd As Long

deskhWnd = GetDesktopWindow()
GetWindowRect deskhWnd, r
ClipCursor r


  Zajφmalo by mn∞, jak se dß ud∞lat prost°edφ sprßvce soubor∙, znßmΘ nap°. ze Servant Salamanderu. Standardnφ komponenty se na to nehodφ, nebo aspo≥ myslφm, ₧e ne. Jde mi o to, aby se dalo p°esouvat kurzorov²mi klßvesami po souborech, a nevφm, jak by se dalo p°esouvat o adresß° v²Üe pomocφ "dvou teΦek".

M∙₧ete pou₧φt prvek ListView. Sloupc∙ m∙₧e mφt dostatek na sprßvce soubor∙, pohybovat se po jeho polo₧kßch je pomocφ myÜφ a klßvesami bez problΘm∙. Pokud jde o dv∞ teΦky, v₧dy m∙₧ete klidn∞ jako prvnφ polo₧ku seznamu zobrazit dv∞ teΦky a p°i kliknutφ na n∞ vyΦistit seznam a naΦφst soubory z nad°azenΘ slo₧ky.


  Poradili byste mi, zda lze ve VB5 vytvß°et soubory typu Help?

P°φmo ve VB to mo₧nΘ nenφ. Ale s VB se dodßvajφ dva nßstroje, pomocφ kter²ch to mo₧nΘ je.

Zßle₧φ na tom, jak² help chcete vytvo°it. Pokud klasick² HLP, musφte si vytvo°it text pomocφ n∞jakΘho editoru, kter² umφ formßt RTF, nap°. Word. DalÜφ v∞ci jako rejst°φky apod. se potom vytvß°φ pomocφ Help Workshopu. Pomocφ n∞j takΘ zkompilujete v²sledn² HLP soubor, kter² se dß potom jednoduÜe pou₧φt ve VB.

Pokud chcete HTML help, vytvo°φte normßlnφ HTML soubory, kterΘ pomocφ HTML Help Workshopu zkompilujete do v²slednΘho CHM souboru. Jeho pou₧itφ je vÜak ve VB zatφm pon∞kud slo₧it∞jÜφ, nenφ pro n∞j ₧ßdnß podpora, vÜe se musφ d∞lat pomocφ API. A navφc tento formßt nepodporujφ Windows 95.


  Pot°ebuji p°esm∞rovat udßlosti hlavnφho formulß°e na svou proceduru, Φeho₧ jsem takΘ dosßhl API funkcφ SetWindowLong. ProblΘm ale vznikl v tom, ₧e n∞kdy nastane situace, kdy se form po stiÜt∞nφ tlaΦφtka close (vpravo naho°e...) schovß, ale aplikace se neukonΦφ. P°idal jsem tedy do Form_Unload p°φkaz End a VB krachne (Program provedl neplatnou operaci....). Pokud ale z Form_Load a Form_Unload odstranφm p°esm∞rovßnφ udßlostφ okna, vÜe prob∞hne v po°ßdku.

Tady bohu₧el nenφ moc co radit. UkonΦovat takhle program, v p°φpad∞ p°esm∞rovßnφ udßlostφ, nenφ ve VB nijak vy°eÜeno. Ono v∙bec nejsou ve VB takovΘ akce doporuΦovßny, ale na druhou stranu je to n∞kdy pot°eba. Jß bych se p°imlouval to End zruÜit (to vßm stejn∞ nic jinΘho nezb²vß) a zkontrolovat si po°ßdn∞ zdrojov² k≤d, proto₧e to, ₧e se aplikace nezastavφ, je problΘm n∞kde v k≤du, neuvoln∞n² objekt, formulß° apod.


  Mßm problΘm, kter² se t²kß Internetu. Kdy₧ znßm IP adresu druhΘho poΦφtaΦe, kter² je prßv∞ p°ipojen, jak m∙₧u na nφ odeslat n∞jakß data (libovolnß)? Zßrove≥ jak mohu odchytit data, kterß p°iÜla (dejme tomu ze stejnΘho programu) z toho druhΘho poΦφtaΦe? Cht∞l bych to vyu₧φt k tomu, aby bylo mo₧no jednφm programem (kter² je na dvou poΦφtaΦφch) p°ijφmat text nebo libovolnß data pomocφ Internetu.

M∙₧ete pou₧φt prvky Microsoft Winsock Control nebo Microsoft Internet Transfer Control. Pou₧itφ je u obou velice jednoduchΘ a je vysv∞tleno v MSDN.


Otßzky bez odpov∞di

  Pot°ebuji vytvo°it aplikaci, kterß by um∞la °φct jin²m program∙m, aby se nezobrazovali v TaskBaru. Tzn. stejn∞ jako kdy₧ u svΘ aplikace nastavφm ShowInTaskBar na False.


  Nevφte jak ud∞lat, aby p°i ukonΦenφ Windows m∙j program dal hlßÜenφ, ₧e je v CD-Rom jednotce vlo₧eno CD?.


  Jak se dß ud∞lat kontrolnφ souΦet (CRC32) souboru?


  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.