Visual Basic - porady i ciekawostki
Na tej stronie znajdziesz różne, użyteczne podpowiedzi do problemów pojawiających się często podczas pisania własnych programików.


Zobacz również listę moich programów napisanych w VB.

Dodawanie i usuwanie rekordów z bazy danych
"Otwieramy" bazę danych:

Deklaracja zmiennych - zwróćmy uwagę na ich typ
Dim SciezkaProgramu As String
Dim SciezkaBazy As String
Dim Baza As Database
Dim Rekord As Recordset

Określamy ścieżkę dostępu do bazy danych. W tym celu wykorzystuję zmienną App.Path, zwracającą ścieżkę, z jakiej jest uruchamiany nasz program, dzięki czemu ścieżka dostępu do bazy będzie aktualna bez względu na lokalizację naszego programu.
SciezkaProgramu = App.Path
SciezkaBazy = SciezkaProgramu & "\mojabaza.mdb"

Wywołujemy polecenie dodania nowego rekordu.
Rekord.AddNew
I wypełniamy go odpowiednimi danymi. Ilość pól (Fields) zależy od struktury danej bazy - tu założyłem, że baza ma 3 pola).
Rekord.Fields(0).Value = "Coś tam"
Rekord.Fields(1).Value = 1200
Rekord.Fields(2).Value = 14.50x

Jeszcze na końcu zapisanie wartości i zamknięcie rekordu.
Rekord.Update
Rekord.Close

Podobnie, jak dodawanie rekordów, w łatwy sposób można rekordy usunąć. Wybierając je wcześniej odpowiednim poleceniem SQL, a następnie używając polecenia, jak poniżej:

Polecenie usunięcia aktywnego (znalezionego SQL-em) rekordu.
Rekord.Delete

Spójrz na poniższy przykład:

BazaDanych.Recordset.MoveFirst
strSQL = "SELECT * FROM Numery WHERE NrTel LIKE '123456'
BazaDanych.RecordSource = strSQL
BazaDanych.Recordset.Delete


Więcej o SQL przeczytasz na stronie o SQL'u.

Praca z bazą danych bez kontrolki 'Data'
Jeśli chcemy w naszym programie wykorzystać bazę danych, możemy użyć kontrolki Data (jak w poniższym przykładzie) lub też możemy to zrobić w następujący sposób (czyli bez jej użycia):

Poniżej przedstawiam kod programu w VB wraz z komentarzem:

Deklaracja zmiennych - zwróćmy uwagę na ich typ
Dim SciezkaProgramu As String
Dim SciezkaBazy As String
Dim Baza As Database
Dim Rekord As Recordset

Określamy ścieżkę dostępu do bazy danych. W tym celu wykorzystuję zmienną App.Path, zwracającą ścieżkę, z jakiej jest uruchamiany nasz program, dzięki czemu ścieżka dostępu do bazy będzie aktualna bez względu na lokalizację naszego programu.
SciezkaProgramu = App.Path
SciezkaBazy = SciezkaProgramu & "\mojabaza.mdb"

Teraz najważniejsze - dostęp do naszej bazy danych. Najpierw "otwieramy" bazę a następnie tabelę.
On Error GoTo BrakBazyDanych
Set Baza = OpenDatabase(SciezkaBazy)
Set Rekord = Baza.OpenRecordset("Tabela_1")
GoTo DopisywanieDoListy

A to na wypadek błędu w dostępie do bazy danych...
BrakBazyDanych:
Monit = MsgBox("Wystąpił błąd dostępu do bazy danych. Do poprawnego działania program potrzebuje pliku " & SciezkaBazy & ". Upewnij się, że dany plik ma poprawną lokalizację i uruchom program ponownie.", vbCritical, "Błąd dostępu do bazy danych")
End

W tym przykładzie dopisujemy odczytane z bazy dane do elementu List.
DopisywanieDoListy:
Do Until Rekord.EOF
 List1.AddItem Rekord.Fields(0).Value
 Rekord.MoveNext
Loop

I to wszystko! Teraz wystarczy poćwiczyć polecenia Rekord.AddNew, Rekord.Delete, Rekord.Edit oraz Rekord.Update...


Opisywany przykład wykorzystałem w programie FS_Org

Przeszukiwanie bazy danych
Jeśli chcemy w naszym programie przeszukiwać bazę danych za pomocą wpisywanego słowa kluczowego, można to zrobić bardzo wygodnie w sposób opisany poniżej:

- wstawiamy kontrolkę Data i wypełniamy jej właściwości DataBaseName (ścieżka do bazy danych MDB) oraz RecordSource, czyli tabelę, z której ma korzystać kontrolka;

- zakładamy, że szukane słowo ma wyświetlać się w polu tekstowym, więc ustawiamy jego właściwość DataSource, wskazując kontrolkę Data, z której ma czerpać dane oraz DataField, które zdefiniuje pole tabeli z bazy danych;

- aby pole tekstowe wypełniało się automatycznie przy wpisywaniu tekstu do pola szukania, musimy użyć na polu szukania metody Change, jak poniżej: Text1_Change()
On Error Resume Next
strSQL = "SELECT * FROM AAA WHERE BBB LIKE '*" & Text1.Text & "*'"
Data1.RecordSource = strSQL
Data1.Refresh
End Sub

gdzie AAA to nazwa tabeli a BBB to klucz poszukiwań bazy danych.

Teraz po wpisywaniu kolejnych znaków do pola szukania, w polu tekstowym połączonym w opisany powyżej sposób z bazą danych pojawią się wpisy, odpowiadające szukanemu ciągowi znaków.


Opisywany przykład wykorzystałem w programie FS_Org.
Więcej o SQL przeczytasz na stronie o SQL'u.

Drukowanie
Aby VB zaczął drukować, sekwencja rozkazów drukowania Printer.Print musi być zakończona poleceniem Printer.EndDoc. Dopiero to polecenie kończy przekazywanie informacji do drukarki. Gdy nie umieścisz tego polecenia w kodzie, drukowanie rozpocznie się po zamknięciu programu.

Deklaracja zmiennych
Deklaracja na początku formy typu Private (lub Dim) powoduje zawsze wyzerowanie tych zmiennych w momencie ładowania formy (nie wyświetlenia po Hide). Jeżeli po Unload i ponownie Load (lub Show) zmienne nie są wyzerowane tzn. że nie nastąpiło rozładowanie formy. Przyczyną są zapewnie utworzone na niej obiekty, które nie zostały usunięte przez Set Obj = Nothing i są do nich dalej odwołania na innych formach lub modułach. W takim przypadku zamiast Unload wykonane zostaje Hide. Unload zostanie wykonane niejawnie po usunięciu ostatniego aktywnego obiektu.

Deklaracja zmiennych dla kilku form
Często zdarza się tak, że w naszych programach korzystamy z kilku form. Wtedy przy deklarowaniu zmiennych np. w Form1, nie możemy z nich korzystać w Form2. Co z tym zrobić???

Dodajemy do projektu moduł a w nim procedurę main. I tam deklarujemy wszystkie zmienne:

Public Zmienna1 as String
Public Zmienna2 as Long


Uwaga! Nie zapomnij zaznaczyć we właściwościach projektu, że obiektem startowym nie jest Form1 ale Module.

ENTER w TextBox-ie
Czasami chcielibyśmy, by w naszych programach po np. wpisaniu jakiegoś tekstu do TextBox'a po naciśnięciu klawisza ENTER kursor przechodził do kolejnego pola tekstowego. Aby tak się stało, dopisujemy kod do zdarzenia obiektu TextBox:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
 Case vbKeyReturn
 Text2.SetFocus
End Select
End Sub


Sprawdzanie zalogowanych użytkowników
Aby sprawdzić, jaki użytkownik jest zalogowany do systemu, wpisujemy kod (do modułu):

Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

i potem (do formy):

Dim s as string
s = String$(200, 0)
GetUserName(s, stlen)
msgbox(Left$(s, stlen - 1))

Odczytanie nazwy komputera w MS Networks
Aby odczytać nazwę komputera z poziomu VB, użyj instrukcji:

nazwa_komputera=Environ("ComputerName")

Uruchamianie dokumentów przez domyślny program
Aby "odpalić" DOWOLNY dokument w domyślnym programie pod Windozą, napisz programik wykorzystujący API. W tym celu tworzysz MODUL, do którego wpisujesz deklarację funkcji:

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Public Const SW_NORMAL = 1

a w samej formie wpisujesz kod:

Plik = [tu wstaw sciezke dostepu do wybranego dokumentu/pliku ktory ma byc otwarty domyslnym programem]

X = ShellExecute(hwnd, "Open", Plik, &O0, &O0, SW_NORMAL)

Wysyłanie e-mail-a przez domyślny program pocztowy
W celu wysłania maila (tzn. otwarcia okna z pustym mailem przez domyślny program pocztowy), wykorzystamy powyższy przykład (czyli umieścimy deklarację funkcji API w module - patrz powyżej).

Następnie:

X = ShellExecute(hwnd, "Open", "mailto:_
tomasz@urbanski.net.pl", &O0, &O0, W_NORMAL)


Jeżeli chcielibyśmy, aby pusta wiadomość otworzyła się z wpisanym domyślnym tematem, musimy wykonać polecenie (pogrubionym zaznaczyłem dodatkowy tekst):

X = ShellExecute(hwnd, "Open", "mailto:_
tomasz@urbanski.net.pl?Subject=Pozdrowienia",_
&O0, &O0, W_NORMAL)


Jeśli wciąż nam mało, możemy zasugerować użytkownikowi początek korespondencji, poprzez wykonanie polecenia (pogrubionym zaznaczyłem dodatkowy tekst):

X = ShellExecute(hwnd, "Open", "mailto:_
tomasz@urbanski.net.pl?Subject=Pozdrowienia_
&body=Byłem na stronie. Jest super.", &O0, &O0, W_NORMAL)


Polecam książki
Oto książki, z których dowiesz się więcej na temat opisywanych powyżej zagadnień.


To są tylko moje propozycje. Możesz samodzielnie poszukać książki:
 

 

Data ostatniej aktualizacji TEJ strony: 2002.01.01