FreeBASIC vs VB6 – Referenční příručka

FreeBASIC 1.10+ Visual Basic 6.0

1 Kompilace & spuštění

Aspekt FreeBASIC VB6
Typ Kompilátor → nativní .exe (bez runtime) IDE + interpreter / P-code + VBRuntime6.dll
Kompilátor fbc source.bas VB6 IDE nebo VBC.exe
Cílové platformy Windows, Linux, DOS (32/64-bit) Pouze Windows 32-bit
Entry point Spouštění od prvního řádku modulu nebo explicitní Function Main() Formulář Form_Load nebo Sub Main v modulu
Dialekty -lang fb (výchozí), -lang qb, -lang fblite Jeden dialekt
Ve výchozím dialektu -lang fb jsou všechny proměnné deklarovány explicitně a není podporována starší syntax GOTO / GOSUB.

2 Typy proměnných

Typ FreeBASIC VB6
8-bit celé číslo Byte / UByte Byte
16-bit celé číslo Short / UShort Integer
32-bit celé číslo Integer / UInteger Long
64-bit celé číslo LongInt / ULongInt ❌ neexistuje (VB6 Max = Long)
32-bit plovoucí Single Single
64-bit plovoucí Double Double
Logický Boolean (True/False) Boolean (True=-1, False=0)
Znak ZString * N nebo WString * NString * N (fixed) / String
Variant ❌ neexistuje Variant (dynamický typ)
Datový typ datum ❌ (použijte Double + funkce) Date
Ukazatel Ptr / Any Ptr ❌ (pouze objektové reference)
Velikost ukazatele 4 bajty (32-bit) / 8 bajtů (64-bit) 4 bajty (vždy 32-bit)
Pozor: VB6 Integer = 16 bitů, FB Integer = 32 bitů! Při přepisu kódu vždy zkontrolujte rozsahy.

3 Deklarace proměnných

FreeBASIC
' Explicitní deklarace (povinná v -lang fb)
Dim x As Integer
Dim y As Double = 3.14
Dim s As String = "ahoj"

' Více najednou
Dim a As Integer, b As Integer

' Konstanty
Const PI As Double = 3.14159265

' Statická (zachová hodnotu mezi voláními)
Static pocitadlo As Integer

' Globální
Dim Shared globalniVar As Integer
Visual Basic 6
' Option Explicit doporučeno
Option Explicit
Dim x As Long
Dim y As Double
y = 3.14
Dim s As String
s = "ahoj"

' Více najednou (každá musí mít typ!)
Dim a As Long, b As Long

' Konstanty
Const PI As Double = 3.14159265

' Statická
Static pocitadlo As Long

' Globální (v .bas modulu)
Public globalniVar As Long
FB Dim Shared = VB6 Public (v modulu). V rámci procedury platí obojí jako lokální proměnná.

4 Řetězce

Funkce FreeBASIC VB6
Délka Len(s) Len(s)
Vpravo Right(s, n) Right(s, n)
Vlevo Left(s, n) Left(s, n)
Střed Mid(s, pos, n) Mid(s, pos, n)
Hledání InStr([start,] s, hledany) InStr([start,] s, hledany)
Velká/malá UCase(s) / LCase(s)UCase(s) / LCase(s)
Ořez Trim(s) / LTrim / RTrimStejné
Číslo → řetězecStr(n) nebo CStr(n)CStr(n) nebo Str(n)
Řetězec → čísloVal(s) nebo CInt(s)Val(s) nebo CInt(s)
Zřetězení & nebo + & (nebo + pro string+string)
Opakování znakuString(n, znak) String(n, znak)
Formátování ❌ použijte Sprintf / vlastní Format(n, "##0.00")
Unicode (wide) WString nativně String = Unicode interně
Pevná délka Dim s As String * 10 Dim s As String * 10
FreeBASIC – práce s řetězci
Dim s As String = "Ahoj, světe!"
Print Len(s)               ' 13
Print Mid(s, 1, 4)          ' Ahoj
Print InStr(s, "světe")     ' 7
Print UCase(s)              ' AHOJ, SVĚTE!

' Sprintf-styl (fb 1.x)
Dim buf As String = Str(42) & " kočků"

' ZString = C-string (null-terminated)
Dim cstr As ZString * 256
cstr = "C-styl"
VB6 – práce s řetězci
Dim s As String
s = "Ahoj, světe!"
Debug.Print Len(s)          ' 13
Debug.Print Mid(s, 1, 4)     ' Ahoj
Debug.Print InStr(s, "světe") ' 7
Debug.Print UCase(s)         ' AHOJ, SVĚTE!

' Formátování
Dim buf As String
buf = Format(3.14, "0.000") ' "3.140"

' VB6 nemá ZString – přímý C interop přes API

5 Podmínky If / Select

FreeBASIC
If x > 10 Then
    Print "velké"
ElseIf x > 5 Then
    Print "střední"
Else
    Print "malé"
End If

' Jednořádkové (bez End If)
If x = 0 Then Print "nula"

' Select Case
Select Case x
  Case 1
    Print "jedna"
  Case 2, 3
    Print "dva nebo tři"
  Case 4 To 10
    Print "4 až 10"
  Case Is > 10
    Print "více než 10"
  Case Else
    Print "jinak"
End Select
Visual Basic 6
If x > 10 Then
    Debug.Print "velké"
ElseIf x > 5 Then
    Debug.Print "střední"
Else
    Debug.Print "malé"
End If

' Jednořádkové
If x = 0 Then Debug.Print "nula"

' Select Case – identická syntaxe
Select Case x
  Case 1
    Debug.Print "jedna"
  Case 2, 3
    Debug.Print "dva nebo tři"
  Case 4 To 10
    Debug.Print "4 až 10"
  Case Is > 10
    Debug.Print "více než 10"
  Case Else
    Debug.Print "jinak"
End Select
Syntaxe Select Case je prakticky identická v obou jazycích.

6 Smyčky

FreeBASIC
' For...Next
For i As Integer = 1 To 10 Step 2
    Print i
Next

' While...Wend
While x > 0
    x -= 1
Wend

' Do...Loop (4 varianty)
Do While x > 0
    x -= 1
Loop

Do
    x -= 1
Loop Until x = 0

' Exit / Continue
For i As Integer = 1 To 100
    If i = 5 Then Continue For  ' FB only!
    If i = 10 Then Exit For
Next
Visual Basic 6
' For...Next
Dim i As Long
For i = 1 To 10 Step 2
    Debug.Print i
Next i

' While...Wend
While x > 0
    x = x - 1
Wend

' Do...Loop
Do While x > 0
    x = x - 1
Loop

Do
    x = x - 1
Loop Until x = 0

' Exit For / Exit Do (žádné Continue!)
For i = 1 To 100
    ' VB6 nemá Continue – nutno použít GoTo
    If i = 10 Then Exit For
Next i
FB přidává Continue For / Continue Do – VB6 to nemá. V FB lze deklarovat řídící proměnnou přímo v For (For i As Integer = ...).

7 Procedury & funkce

FreeBASIC
' Sub (žádná návratová hodnota)
Sub Pozdrav(jmeno As String)
    Print "Ahoj, " & jmeno
End Sub

' Function
Function Secti(a As Integer, b As Integer) As Integer
    Return a + b   ' nebo: Function = a + b
End Function

' ByRef vs ByVal
Sub Zvys(ByRef n As Integer)
    n += 1
End Sub

' Výchozí parametry
Sub Log(msg As String, uroven As Integer = 1)
    Print uroven; ": "; msg
End Sub

' Přetěžování (overload)
Function Secti(a As Double, b As Double) As Double
    Return a + b
End Function
Visual Basic 6
' Sub
Sub Pozdrav(jmeno As String)
    MsgBox "Ahoj, " & jmeno
End Sub

' Function
Function Secti(a As Long, b As Long) As Long
    Secti = a + b   ' přiřazení = Return
End Function

' ByRef je výchozí v VB6!
Sub Zvys(ByRef n As Long)
    n = n + 1
End Sub

' Optional parametry
Sub Log(msg As String, Optional uroven As Long = 1)
    Debug.Print uroven; ": "; msg
End Sub

' ❌ VB6 nepodporuje přetěžování!
VlastnostFreeBASICVB6
Výchozí předáníByValByRef ⚠️
Return hodnotaReturn nebo Function = ...Pouze FunctionName = ...
Přetěžování✅ Overload❌
Výchozí parametry= hodnota v signatuřeOptional ... = hodnota
Variadic... (C-styl varargs)ParamArray

8 Pole (Arrays)

FreeBASIC
' Statické pole (od 0)
Dim arr(9) As Integer  ' 10 prvků: 0..9

' Explicitní rozsah
Dim b(1 To 5) As Double

' Dynamické pole
Dim dyn() As Integer
ReDim dyn(9)
ReDim Preserve dyn(19)  ' zachová data

' Vícerozměrné
Dim mat(3, 3) As Integer

' Bounds
Print LBound(arr); UBound(arr)  ' 0  9
Visual Basic 6
' Statické pole (Option Base 0 default)
Dim arr(9) As Long  ' 10 prvků: 0..9

' Explicitní rozsah
Dim b(1 To 5) As Double

' Dynamické pole
Dim dyn() As Long
ReDim dyn(9)
ReDim Preserve dyn(19)

' Vícerozměrné
Dim mat(3, 3) As Long

' Bounds
Debug.Print LBound(arr); UBound(arr)

' VB6 má navíc: Array(), IsArray(), Erase
Výchozí dolní mez je 0 v obou jazycích (pokud není nastaveno Option Base 1). FB podporuje záporné indexy: Dim a(-5 To 5).

9 Uživatelské typy (Type / UDT)

FreeBASIC
' Základní Type
Type Bod
    x As Double
    y As Double
End Type

Dim p As Bod
p.x = 1.5

' Type s metodami (OOP)
Type Kruh
    polomer As Double
    Declare Function Obvod() As Double
End Type

Function Kruh.Obvod() As Double
    Return 2 * 3.14159 * polomer
End Function

' Union (sdílená paměť)
Union Hodnota
    i As Integer
    f As Single
End Union
Visual Basic 6
' Type (v modulu .bas)
Type Bod
    x As Double
    y As Double
End Type

Dim p As Bod
p.x = 1.5

' VB6 Type nemá metody
' Pro metody nutno použít Class Module

' Class Module: Kruh.cls
Public polomer As Double
Public Function Obvod() As Double
    Obvod = 2 * 3.14159 * polomer
End Function

' ❌ VB6 nemá Union

10 Soubory I/O

FreeBASIC – zápis/čtení
' Textový zápis
Dim f As Integer = FreeFile()
Open "data.txt" For Output As #f
Print #f, "Řádek 1"
Close #f

' Textové čtení
f = FreeFile()
Open "data.txt" For Input As #f
Dim radek As String
While Not EOF(f)
    Line Input #f, radek
    Print radek
Wend
Close #f

' Binární
Open "bin.dat" For Binary As #f
Put #f, , x   ' zápis
Get #f, , x   ' čtení
Close #f
VB6 – zápis/čtení
' Textový zápis
Dim f As Integer
f = FreeFile
Open "data.txt" For Output As #f
Print #f, "Řádek 1"
Close #f

' Textové čtení
f = FreeFile
Open "data.txt" For Input As #f
Dim radek As String
Do While Not EOF(f)
    Line Input #f, radek
    Debug.Print radek
Loop
Close #f

' Binární – stejná syntaxe
Open "bin.dat" For Binary As #f
Put #f, , x
Get #f, , x
Close #f
Syntaxe souborového I/O je velmi podobná. Hlavní rozdíl: v FB je FreeFile() funkce se závorkami, ve VB6 je FreeFile bez závorek.

11 Ukazatele & správa paměti

FreeBASIC
' Ukazatele (VB6 to nemá!)
Dim p As Integer Ptr
Dim x As Integer = 42
p = @x              ' adresa proměnné
Print *p            ' dereference = 42
*p = 100            ' zápis přes ukazatel

' Dynamická alokace
Dim buf As Integer Ptr
buf = Allocate(10 * SizeOf(Integer))
' ... použití ...
DeAllocate(buf)

' Any Ptr = void*
Dim vp As Any Ptr = Allocate(64)

' New / Delete (OOP)
Dim obj As MojeTrida Ptr
obj = New MojeTrida
Delete obj
Visual Basic 6
' VB6 přímé ukazatele NEPODPORUJE
' Pouze objektové reference

Dim obj As New MojeTrida
' obj je reference, nikoli ukazatel

' Přes Win API (nebezpečné)
Dim addr As Long
addr = VarPtr(x)    ' adresa (čtení)
addr = ObjPtr(obj)  ' adresa objektu
addr = StrPtr(s)    ' adresa řetězce

' Přímá paměť jen přes API:
' RtlMoveMemory, CopyMemory apod.

' Garbage collector automatický
' (reference counting)

12 Objekty & třídy

FreeBASIC – Type s OOP
Type Zvire
    jmeno As String
    Declare Constructor(n As String)
    Declare Destructor()
    Declare Virtual Sub Zvuk()
End Type

Constructor Zvire(n As String)
    jmeno = n
End Constructor

Destructor Zvire()
    Print jmeno & " odchází"
End Destructor

Virtual Sub Zvire.Zvuk()
    Print "..."
End Sub

' Dědičnost
Type Pes Extends Zvire
    Declare Virtual Sub Zvuk()
End Type

Sub Pes.Zvuk()
    Print "Haf!"
End Sub
VB6 – Class Module
' Soubor: Zvire.cls
Public jmeno As String

Private Sub Class_Initialize()
    ' konstruktor
End Sub

Private Sub Class_Terminate()
    Debug.Print jmeno & " odchází"
End Sub

Public Sub Zvuk()
    Debug.Print "..."
End Sub

' ❌ VB6 nepodporuje dědičnost!
' Pouze Interface (Implements)

' Soubor: Pes.cls
Implements IZvire  ' interface
Public Sub IZvire_Zvuk()
    Debug.Print "Haf!"
End Sub
OOP vlastnostFreeBASICVB6
Dědičnost ✅ Extends ❌ jen Implements
Konstruktor ✅ Constructor ⚠️ Class_Initialize (bez parametrů)
Destruktor ✅ Destructor ⚠️ Class_Terminate
Virtuální metody✅ Virtual / Abstract❌
Přetěžování oper.✅ Operator ❌
Properties ✅ Property Get/Set/Let✅ Property Get/Set/Let

13 Preprocesory, moduly & include

FreeBASIC
' Preprocesor (#define, #ifdef, #include)
#define MAX_BUFF 1024
#define VERZE "1.0"

#ifdef __FB_WIN32__
    Print "Windows"
#else
    Print "Linux"
#endif

' Include
#include "modul.bi"       ' hlavičkový soubor
#include once "lib.bi"   ' include guard

' Namespace
Namespace MathLib
    Function Ctverec(x As Double) As Double
        Return x * x
    End Function
End Namespace

Print MathLib.Ctverec(5)
Visual Basic 6
' VB6 nemá preprocesor #define / #ifdef
' Pouze #Const a #If pro podmíněný kód

#Const DEBUG_MODE = 1

#If DEBUG_MODE = 1 Then
    Debug.Print "Debug build"
#End If

' Moduly = .bas soubory
' Class modules = .cls soubory
' Žádný #include – vše přidáno do projektu

' ❌ Žádné Namespace
' Moduly slouží jako namespace-like grouping

14 Konzole & základní grafika

FreeBASIC – konzole & grafika
' Výstup / vstup
Print "Text"
Print Using "###.##"; 3.14159
Input "Zadej číslo: ", n
Color 14, 1     ' žlutá na modré
Locate 5, 10   ' řádek, sloupec
Cls

' Grafický režim (fbgfx)
ScreenRes 800, 600, 32
Line (0, 0)-(400, 300), RGB(255, 0, 0)
Circle (400, 300), 100, RGB(0, 255, 0)
PSet (100, 100), RGB(255, 255, 0)
Sleep   ' čekej na klávesu
VB6 – formuláře & grafika
' VB6 je GUI-first – žádná konzola
' Výstup do formuláře nebo Debug okna
Debug.Print "Text"  ' Immediate window
MsgBox "Zpráva"

' Grafika na Form/PictureBox (Form1)
Form1.Line (0, 0)-(1000, 1000), RGB(255, 0, 0)
Form1.Circle (2000, 2000), 500, RGB(0, 255, 0)
Form1.PSet (100, 100), RGB(255, 255, 0)

' Souřadnicový systém v Twips (1440/inch)
' FB: pixely přímé

15 Chyby & ošetření výjimek

FreeBASIC
' FB: On Error (kompatibilita)
On Error Goto ChybaLabel

' ... kód ...
Exit Sub

ChybaLabel:
    Print "Chyba: " & Err
Resume Next

' Moderní FB: žádné try/catch
' Doporučeno: testovat návratové hodnoty

' Kontrola souboru
If FileExists("soubor.txt") = 0 Then
    Print "Soubor neexistuje"
End If
Visual Basic 6
' VB6 ošetření chyb
On Error GoTo ChybaHandler
On Error Resume Next     ' ignoruj chyby
On Error GoTo 0          ' reset

' Obslužná rutina
Exit Sub
ChybaHandler:
    Select Case Err.Number
        Case 53  ' File not found
            MsgBox "Soubor nenalezen"
        Case Else
            MsgBox Err.Description
    End Select
Resume Next

' Vlastní chyba
Err.Raise 1001, "MojeApp", "Popis"

16 Rychlá přechodová tabulka

Výstup na obrazovku

Print "text"Debug.Print / MsgBox
Print Using "##.#"; nFormat(n, "##.#")

Vstup od uživatele

Input "text", varInputBox("text")
InKey()GetAsyncKeyState (API)

Matematika

Sqr(x)Sqr(x)
Int(x) / Fix(x)Int(x) / Fix(x)
Abs(x) / Sgn(x)Abs(x) / Sgn(x)
Sin/Cos/Tan/AtnSin/Cos/Tan/Atn
Exp(x) / Log(x)Exp(x) / Log(x)

Konverze typů

CInt(x) / CLng(x)CInt(x) / CLng(x)
CDbl(x) / CSng(x)CDbl(x) / CSng(x)
CStr(x) / Str(x)CStr(x) / Str(x)
CByte(x) / CUInt(x)CByte(x) ❌ CUInt

Datum a čas

Now() → DoubleNow → Date
--(žádný DateSerial)DateSerial(y,m,d)
Timer() → DoubleTimer → Single

Systémové

Shell(cmd)Shell(cmd)
Environ("PATH")Environ("PATH")
ChDir / MkDir / KillChDir / MkDir / Kill
SizeOf(typ)Len(typ)

Operátory (rozdíly)

x += 1 / x -= 1x = x + 1 ⚠️
x Shl 2 / x Shr 2❌ (API nebo *4)
x Xor y / x And yx Xor y / x And y
Not x (bitwise)Not x (bitwise)

Dialekt QB compat

fbc -lang qb—
GoSub / ReturnGoSub / Return
DEFINT / DEFDBL❌
pokrývá QB 4.5—

Hlavní omezení při migraci VB6 → FreeBASIC

OblastFB řešeníVB6 funkce
GUI formuláře WinFBX / WinFBE / fbgfx / C-API Integrovaný form designer
COM/ActiveX Pouze přes deklarace DLL / IDispatch Nativní podpora
ADO/DB přístup SQLite3 přes DLL nebo ODBC ADO, DAO, RDO nativně
Variant typ Není (použij Any Ptr nebo Union) Variant dynamický typ
With blok ❌ nemá (přiřadit do lokální var) With obj ... End With
Integer velikost32 bitů – přepsat VB6 Integer na Short! 16 bitů
Výchozí ByRef ByVal (bezpečnější) ByRef – nutno zkontrolovat