Popup menyer 

Om ni har Windows 95 installerat på er dator så har ni kanske märkt att om man trycker på höger musknapp så får man upp en meny. Detta kan man givetvis också göra med Visual Basic. Koden ska ligga under objektets MouseDown händelse. Detta därför att vi ska kunna avgöra om det är vänster eller höger musknapp som trycks ned. 
 
Skapa en meny med Caption = Popup1 och Name = mnuPopup1. Skapa sedan en undermeny med Caption = &Förklaring (lägg märke till "&" tecknet) och Name = mnuFörklaring. Tryck i meny hanteraren på mnuPopup1 och avmarkera kryssrutan visible, visible ska alltså vara False. Stäng nu meny hanteraren. 
 
Dubbelklicka på formuläret, gå in i händelsen MouseDown och skriv: 

 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ 
X As Single, Y As Single) 
If Button = 2 Then PopupMenu mnuPopup1 
End Sub 

Button är variabeln som håller reda på vilken musknapp du trycker på. 1 = Vänster, 2 = Höger. Kommandot PopupMenu är givetvis kommandot som frammkallar menyn. Fulla syntaxet hittar du nedan och i VB´s hjälpfil. 

[object].PopupMenu [menynamn], flaggor, x, y, boldcommand 
  

Förklaringar hittar du i Visual Basics hjälpfil. 



 

Windows katalogen 

Med den här lilla koden som jag skrivit kan du ta reda på i vilken katalog som Windows ligger i. Starta ett nytt projekt med en knapp och skriv i den: 

Obs! Denna kod är bara testad i Win95 med Visual Basic 5. 

Private Sub Command1_Click() 

'sWin kommer att innehålla Windows katalogen. 
Dim sWin As String 

'En For Loop som kollar igenom de 15 första miljövariablerna. 
For i = 1 To 15 
    sWin = Environ(i) 

    'Letar efter variabeln winbootdir. 
    If UCase(Left(sWin, 11)) = UCase("winbootdir=") Then 
    MsgBox "Windows katalogen är " & Mid(sWin, 12, Len(sWin) - 11) 
    Exit For 
    End If 
Next i 

End Sub 

Starta nu programmet. 



 

Hoppa med Enter 

För att få fram funktionen att hoppa mellan olika objekt med Enter är inte så svårt. Antag att vi har två text rutor med namnen "Text1" och "Text2". Vi ska hoppa från "Text1" till "Text2". 
 
Sub Text1_KeyPress(KeyAscii As Integer) 
If KeyAscii = 13 then  
    KeyAscii = 0 'Ser till så att system pipet försvinner. 
    Text2.SetFocus  
End if 
End Sub 

Key Ascii 13 är givetvis ANSI talet för Enter. 



 

Starta program från VB 
 

Att starta program från VB är ganska enkelt. Skriv bara följande rad. I det här exemplet ligger koden i en knapp (Command1). 
 
Private Sub Command1_Click() 
Dim x As Long 
x = Shell("notepad.exe", 3) 
End Sub 
  

X deklareras I det här fallet som Long. Detta behövs dock inte i VB5 som "fixar" det själv. Trean står för att starta programmet maximerat med focus. Vilka tal som finns och vad de gör kan du läsa i Visual Basic´s hjälp-fil, sök på "Shell". 



 

Sökväg till ditt program 
 

Genom att ta reda på sökvägen till ditt program så kan du enkelt komma åt filer och dylikt. Skriv bara: 
 

Private Sub Command1_Click() 
MsgBox App.Path & "\" & App.EXEName & ".EXE" 
End Sub 
  

Notera att fil ändelsen inte följer med om vi inte lägger till den manuellt. 



 

Språk version på Windows 95 
 

Att veta vilket språk som Windows använder sig av kan ibland vara mycket användbart. För att det här exemplet ska fungera behöver du ett formulär med en knapp som heter "Command1" och en modul. I modulen deklarerar vi API funktioner som vi kommer att använda oss av eller kan använda oss av. Skriv följande i modulen. 
 

Public Declare Function GetLocaleInfo Lib "kernel32" _ 
Alias "GetLocaleInfoA" (ByVal Locale As Long, _ 
ByVal LCType As Long, ByVal lpLCData As String, _ 
ByValcchData As Long) As Long 

Public Declare Function GetLastError Lib "kernel32" () As Long 
Public Const LOCALE_SYSTEM_DEFAULT As Long = &H800 
Public Const LOCALE_USER_DEFAULT As Long = &H400 

Public Const LOCALE_SENGCOUNTRY As Long = &H1002 
Public Const LOCALE_SABBREVCTRYNAME As Long = &H7 

Public Const ERROR_INSUFFICIENT_BUFFER = 122 
Public Const ERROR_INVALID_FLAGS = 1004& 
Public Const ERROR_INVALID_PARAMETER = 87 
  

Sedan behöver vi koden som anropar API och tar reda på vilket språk som används. Den koden skrivs i knappen som följande: 
 

Private Sub Command1_Click() 
Dim Buffer As String, CountryName As String, RetVal As Long 
Buffer = String$(255, Chr$(0)) 
RetVal = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, _ 
LOCALE_SABBREVCTRYNAME, Buffer, 255&) 
CountryName = Left$(Buffer, RetVal) 
MsgBox CountryName 
End Sub 
  

Prova nu och du kommer att få ett meddelande med texten "SWE" om du använder en svensk version eller t.ex. "NOR" eller "ENG" om du använder någon annan version. Det går att tricksa till det lite med koden också. Om du byter ut "LOCALE_SYSTEM_DEFAULT" mot "LOCALE_USER_DEFAULT" så får du den enskilde användarens språk. Man kan också byta ut "LOCALE_SABBREVCTRYNAME" mot "LOCALE_SENGCOUNTRY" så får du t.ex. svaret "Sweden" eller "Norway" istället för "SWE" respektive "NOR". Källa: Visual Basic FORUM. 



 

Alltid överst.. 
 

Det är inte så ofta som man måste ha ett fönster i sitt program "alltid överst". Men när man behöver det så är den här koden ovärderlig. Hela koden under ska kopieras in i en modul. 
 

Option Explicit 
Declare Function SetWindowPos Lib "user32" _ 
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ 
    ByVal x As Long, ByVal Y As Long, ByVal cx As Long, _ 
    ByVal cy As Long, ByVal wFlags As Long) As Long 

Public Const SWP_NOMOVE = &H2 
Public Const SWP_NOSIZE = &H1 
Public Const SWP_SHOWWINDOW = &H40 
Public Const SWP_NOACTIVATE = &H10 
Public Const HWND_TOPMOST = -1 
Public Const HWND_NOTOPMOST = -2 
  

Public Sub FormOnTop(Handle As Integer, OnTop As Boolean) 
    Dim wFlags As Long, PosFlag As Long 
    wFlags = SWP_NOMOVE Or SWP_NOSIZE Or _ 
        SWP_SHOWWINDOW Or SWP_NOACTIVATE 
    Select Case OnTop 
        Case True 
            PosFlag = HWND_TOPMOST 
        Case False 
            PosFlag = HWND_NOTOPMOST 
    End Select 
    SetWindowPos Handle, PosFlag, 0, 0, 0, 0, wFlags 
End Sub 
  

Sedan måste du givetvis ha en kod som ställer ditt fönster som "alltid överst" och det gör du med: 
 

FormOnTop Form1.hwnd, True 
  
Och för  att ta bort "Alltid överst" så skriver du givetvis: 

  
FormOnTop Form1.hwnd, False 



 

Ändra system menyn 
 

På nästan varje fönster finns det en ikon uppe till vänster. När man trycker på den så får man fram en system meny. I Visual Basic kan man på ett ganska enkelt sätt plocka bort saker ur den. Kopiera in nedanstående kod i en modul. 
 
Declare Function GetSystemMenu Lib "user32" _ 
    (ByVal hwnd As Long, ByVal bRevert As Long) As Long 
Declare Function RemoveMenu Lib "user32" _ 
    (ByVal hMenu As Long, ByVal nPosition As Long, _ 
    ByVal wFlags As Long) As Long 
Public Const MF_BYPOSITION = &H400& 

Public Sub TakeCloseOff(Handle As Long) 
    Dim SysMenHandle As Long, RetVal As Long 
    SysMenHandle = GetSystemMenu(Handle, 0) 
    RetVal = RemoveMenu(SysMenHandle, 6, MF_BYPOSITION) 
    'Ta bort "Avsluta" (index = 6). 
    RetVal = RemoveMenu(SysMenHandle, 5, MF_BYPOSITION) 
    'Ta bort separatorn som nu ligger längst ned (index = 5). 
End Sub 
  

Skriv sedan in nedanstående kod i en knapp med namnet "Command1". Om knappen heter något annat så måste du också ändra namnet i koden. 
 

Private Sub Command1_Click() 
TakeCloseOff Command1.Parent.hwnd 
End Sub 
  

Som ni märkte så tog koden bort "Avsluta" och separatorn i menyn. Varje objekt i menyn har ett index. Objektet längst upp har index 0 och "Avsluta" har index 6.



 

Lista Typsnitt 
 

Lista alla installerade typsnitt i Windows eller din skrivare. Skapa en knapp med namnet "Command1" och en list ruta med namnet "List1". För att lista Windows typsnitt skriver du följande kod i knappen:
 

Sub Command1_Click()
Dim x As Integer
For x = 0 To Screen.FontCount - 1
    List1.AddItem Screen.Fonts(x)
Next x
End Sub
 

Om du vill lista skrivarens typsnitt så byter du ut "Screen" mot "Printer" på båda platserna.



 

Lista Skrivare 
 

Du kan även lista vilka skrivare som finns installerade på din dator genom att skriva koden som kommer. Börja med att skapa en knapp med namnet "Command1" och en list ruta med namnet "List1". Skriv sedan koden i knappen.


Sub Command1_Click()
List1.Clear
Dim prt As Printer
For Each prt In Printers
    List1.AddItem prt.DeviceName
Next prt
End Sub