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.



Jak lze u ovládacích prvků DataGrid a DbGrid přidávat a odebírat sloupce?
 

U prvku DataGrid je to jednodušší, stačí zavolat metodu Add kolekce Columns.

dbg1.Columns.Add 1
dbg1.Columns.Add 2

U prvku DBGrid přidáte sloupec podobným způsobem, jen je ještě třeba nastavit jeho viditelnost.

DBGrid1.Columns.Add 2
DBGrid1.Columns(2).Visible = True


Zajímalo by mě, jestli lze ve VB nějak nastavit verze mého programu, která se uživateli objeví ve vlastnostech na kartě verze?
 
V menu Project->Properties, záložka Make, položky Major, Minor a Revision. V programu tyto informace můžete získta přes vlastnosti objektu App, App.Major, App.Minor a App.Revision.


Lze nějak v RichTextBoxu nastavit horní a dolní index pro ty znaky, které si uživatel vybere?
 

Horní a dolní index lze vytvořit pomocí vlastnosti SelCharOffset. Ta určuje vzdálenost písma od základní čáry (v twipech). Kladná hodnota písmo posouvá nahoru, záporná dolů. Tzn. že chcete-li horní index, nastavte např. hodnotu 200, pro dolní index např. -200 (také je dobré zmenšit velikost písma). Zkuste např. tento kód:

With rtf1
  .SelFontSize = 20
  .SelText = "2*E"
  .SelFontSize = 8
  .SelCharOffset = 200
  .SelText = 10
End With


Napsal jsem si textový editor ve VB 6 a až poté zjistil, že nemohu do tohoto editoru načíst větší soubor než cca 64KB. Je možné, aby můj editor načítal i větší soubory, např. 1MB?
 
Maximální velikost textu v jednořádkovém TextBoxu je 2048B, pro více řádkový TextBox je to 32KB. Pokud chcete pracovat s delším textem, použijte RichTextBox.


Ve své aplikaci spouštím pomocí ADO a objektu Connection dotaz na databázi. Tento dotaz však trvá hodně dlouho a než skončí, celá aplikace je tzv. "zmrzlá", tj. nereaguje na nic. Je nějak možné spustit dotaz a nečekat na jeho ukončení?
 

Možné to samozřejmě je a dokonce velmi jednoduše. Stačí nastavit parametr Options metody Execute na hodnotu adAsyncExecute. V tomto případě program nečeká na ukončení dotazu a hned pokračuje dále. Chcete-li vědět jak dotaz dopadnul, nadefinujte proměnnou typu Connection s klíčovým slovem WithEvents. Takto můžete odchytit událost ExecuteComplete, která je vyvolána po ukočení SQL příkazu. Velmi zjednodušeně asi takto:

Private WithEvents cn As ADODB.Connection

Private Sub cn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, _
ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
  MsgBox "Dotaz skoncil"
End Sub

Private Sub Form_Load()
  cn.Execute "UPDATE osoby SET plat=5000", , adAsyncExecute
End Sub


Vytvářím komponentu typu ActiveX EXE. Ve vlastnostech projektu jsem objevil několik vlastností, které mi nic neříkají. Zaujali mě však dvě, a to "Thread per object" a "Thread Pool". Můžete mi poradit, co to znamená a jak je použít?
 
Tato problematika je bohužel poněkud složitá na to, aby se na ni dalo krátce odpovědět. Zjednodušeně řečeno jde o to, že pokud nastavíte prvně uvedenou vlastnost, bude pro každou instanci komponenty vytvořen nový STA apartment a nové vlákno (což není zrovna výhodné z hlediska šetření systémovými prostředy). Druhá možnost nastavuje maximální počet STA apartmentů, tzn. nastavíte-li třeba 5, šestá instance již nevytvoří nový STA apartment, ale vznikne již v existujícím. Tak je zajištěno šetření systémovými prostředky, ale zase je pro několik instancí vytvořeno pouze jedno vlákno, tudíž komponenty v jednom apartmentu nemají možnost běžet paralelně. Pokud by vás tato problematika zajímala více, velmi doporučuji knihu Programujeme v COM a COM+ od Dalibora Kačmáře.


Otázky bez odpovědi

Jakým způsobem mohu uložit do resource souboru MP3 soubor a jak ho odtud získat?


Potřeboval bych pomocí funkce API vyvolat dialog "Najít". Slyšel jsem, že je to přesně funkce Findtext. Její deklaraci jsem si našel v programu API Text Viewer včetně typu FINDREPLACE.


Neexistuje nějaký OCX, nebo DLL knihovna, která by umožňovala odesílání krátkých textových zpráv rovnou z PC přes modem?


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.


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