Cevapla
 
Konu Seçenekleri
Eski 29-11-06, 13:33 Çevrimdışı   #1
Profesör
Sanatkârlar grubu
 
Hewall - ait Avatar
Genel Mesajlar: 4.098
Teşekkür etti: 1.016
Teşekkür edildi: 1.056
RepForum Gücü: 42
Forum Puanı:11433
Hewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmış
vÜsual Basİc Hakkinda Bİr Çok Konu

Kullandığımız sistemlerin neredeyse bütün ayarları hep sistem kaydı yani registry de tutluyor. Peki biz bu nimetten faydalanamazmıyız ?

Artık programlarımızda ki bütün ayarları registry de tutmanı geldi...

Registry Erişim Sınıfının Kodları
__________________________________________________ ______________

Menüde "Project/Add Class Module" ile yeni bir sınıf oluşturun ve aşağıdaki kodlar içine kopyalayın


'----------------------------------------------------------------------------------------------
'Açıklama : Registry Erişim Sınıfı
'Sınıf Adı : C_Reg.cls
'Versiyon : 2.0
'Tarih : 05.02.2004
'----------------------------------------------------------------------------------------------
Option Explicit

Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7
Const ERROR_SUCCESS = 0&

Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Const LANG_NEUTRAL = &H0

Public Enum Reg_HKEY
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA = &H80000004
HKEY_CURRENT_CONFIG = &H80000005
HKEY_DYN_DATA = &H80000006
End Enum

'Reg Api---------------------------------------------------------------------------------------
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
'----------------------------------------------------------------------------------------------
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
'----------------------------------------------------------------------------------------------

Dim AktifKok As Reg_HKEY
Dim AktifYol As String
Dim RegAnahtar As Long
Dim HataNo As Long

'----------------------------------------------------------------------------------------------
'Sınıf Prop
Public Property Get RegKok() As Reg_HKEY
RegKok = AktifKok
End Property

Public Property Let RegKok(ByVal Deger As Reg_HKEY)
If RegAnahtar <> 0 Then YoluKullanimdanKaldir
AktifKok = Deger
End Property

Public Property Get RegYol() As String
RegYol = AktifYol
End Property

Public Property Let RegYol(ByVal Deger As String)
If RegAnahtar <> 0 Then YoluKullanimdanKaldir
AktifYol = Deger
End Property

Public Property Get HataOlustu() As Boolean
HataOlustu = (HataNo <> 0)
End Property

Public Property Get HataNumarasi() As Long
HataNumarasi = HataNo
HataNo = 0
End Property

Public Property Get HataSistemMesaji() As String
Dim Donen As String

Donen = Space(200)

FormatMessage FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, HataNo, LANG_NEUTRAL, Donen, 200, ByVal 0&

HataSistemMesaji = Left(Donen, InStr(Donen, Chr(0)) - 1)
End Property
'----------------------------------------------------------------------------------------------
'Reg Okuma Fonksiyonları
Public Function SayiOku(DegerAdi As String) As Long
Dim Donen As Long, DegerTipi As Long

If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegQueryValueEx(RegAnahtar, DegerAdi, 0&, DegerTipi, Donen, 4)

If HataNo = ERROR_SUCCESS Then
If DegerTipi = REG_DWORD Then
SayiOku = Donen
End If
End If

End Function

Public Function MetinOku(DegerAdi As String, Optional Varsayilan As String = "") As String
Dim Donen As String, DegerTipi As Long
Dim MetinBoyut As Long

If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then
MetinOku = Varsayilan
Exit Function
End If
End If

HataNo = RegQueryValueEx(RegAnahtar, DegerAdi, 0&, DegerTipi, ByVal 0&, MetinBoyut)
If HataNo = ERROR_SUCCESS Then
If DegerTipi = REG_SZ Or DegerTipi = REG_EXPAND_SZ Or DegerTipi = REG_MULTI_SZ Then
Donen = String(MetinBoyut, Chr(0))

HataNo = RegQueryValueEx(RegAnahtar, DegerAdi, 0&, 0&, ByVal Donen, MetinBoyut)
If HataNo = ERROR_SUCCESS Then
MetinOku = Left(Donen, MetinBoyut - 1)
Else
MetinOku = Varsayilan
End If
End If
Else
MetinOku = Varsayilan
End If

End Function

Public Function ByteDiziOku(DegerAdi As String) As Byte()
Dim Donen() As Byte, DegerTipi As Long
Dim DiziBoyut As Long

If RegAnahtar = 0 Then
If YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegQueryValueEx(RegAnahtar, DegerAdi, 0&, DegerTipi, ByVal 0, DiziBoyut)
If HataNo = ERROR_SUCCESS Then
If DegerTipi = REG_BINARY Then
ReDim Donen(0 To DiziBoyut - 1) As Byte

HataNo = RegQueryValueEx(RegAnahtar, DegerAdi, 0&, DegerTipi, Donen(0), DiziBoyut)
If HataNo = ERROR_SUCCESS Then
ByteDiziOku = Donen
End If
End If
End If

End Function

'----------------------------------------------------------------------------------------------
'Reg Kaydetme Fonksiyonları
Public Function SayiKaydet(DegerAdi As String, Sayi As Long) As Boolean
If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegSetValueEx(RegAnahtar, DegerAdi, 0, REG_DWORD, Sayi, 4)

SayiKaydet = (HataNo = ERROR_SUCCESS)
End Function

Public Function MetinKaydet(DegerAdi As String, Metin As String) As Boolean
If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegSetValueEx(RegAnahtar, DegerAdi, 0, REG_SZ, ByVal Metin, Len(Metin))

MetinKaydet = (HataNo = ERROR_SUCCESS)
End Function

Public Function ByteDiziKaydet(DegerAdi As String, dizi() As Byte) As Boolean
If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegSetValueEx(RegAnahtar, DegerAdi, 0, REG_BINARY, dizi(LBound(dizi)), UBound(dizi) - LBound(dizi) + 1)

ByteDiziKaydet = (HataNo = ERROR_SUCCESS)
End Function

'----------------------------------------------------------------------------------------------
'Diğer Fonksiyonlar
Public Function AltAnahtarlarListesi() As String()
Dim Donen() As String
Dim Anahtarisim As String * 255
Dim SiraNo As Long

If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

Do

HataNo = RegEnumKey(RegAnahtar, SiraNo, Anahtarisim, 255)

If HataNo = ERROR_SUCCESS Then
ReDim Preserve Donen(0 To SiraNo) As String

Donen(SiraNo) = Left(Anahtarisim, InStr(Anahtarisim, Chr(0)) - 1)
Else
If SiraNo = 0 Then 'Hiç Alt Anahtar Yoksa
Exit Function
Else
HataNo = ERROR_SUCCESS
AltAnahtarlarListesi = Donen
Exit Function
End If
End If
SiraNo = SiraNo + 1
Loop

End Function

Public Function AltDegerAd(SiraNo As Long, Tip As Long) As String
Dim DegerAd As String, Deger As String
Dim DegerAdBoyut As Long, DegerBoyut As Long, HataNo As Long

If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

DegerAdBoyut = 255
DegerBoyut = 255
DegerAd = Space(DegerAdBoyut)
Deger = Space(DegerBoyut)

HataNo = RegEnumValue(RegAnahtar, SiraNo, DegerAd, DegerAdBoyut, ByVal 0&, Tip, ByVal Deger, DegerBoyut)

If HataNo = ERROR_SUCCESS Then

AltDegerAd = Left$(DegerAd, DegerAdBoyut) '& Left$(Deger, DegerBoyut)

End If
End Function


Public Function DegerSil(Deger As String) As Boolean
If RegAnahtar = 0 Then
If Not YoluKullanimaHazirla Then Exit Function
End If

HataNo = RegDeleteValue(RegAnahtar, Deger)

DegerSil = (HataNo = ERROR_SUCCESS)
End Function

'----------------------------------------------------------------------------------------------
'AktifKok ve AktifYol u Kullanmayan Fonksiyonlar
Public Function AnahtarSil(Kok As Reg_HKEY, Yol As String, AltAnahtarAdi As String) As Boolean
Dim rA As Long

If RegOpenKey(Kok, Yol, rA) = ERROR_SUCCESS Then
If RegDeleteKey(rA, AltAnahtarAdi) = ERROR_SUCCESS Then
AnahtarSil = True
End If

RegCloseKey rA
End If

End Function

Public Function AnahtarOlustur(Kok As Reg_HKEY, Yol As String) As Boolean
Dim rA As Long
If RegCreateKey(Kok, Yol, rA) = ERROR_SUCCESS Then
RegCloseKey rA
AnahtarOlustur = True
End If
End Function

'----------------------------------------------------------------------------------------------
'Yerel Fonksiyonlar
Private Function YoluKullanimaHazirla() As Boolean

If RegAnahtar <> 0 Then
YoluKullanimdanKaldir
End If

HataNo = RegOpenKey(AktifKok, AktifYol, RegAnahtar)

YoluKullanimaHazirla = IIf(HataNo = ERROR_SUCCESS, True, False)
End Function

Private Sub YoluKullanimdanKaldir()
RegCloseKey RegAnahtar
RegAnahtar = 0
End Sub

Private Sub Class_Terminate()
If RegAnahtar <> 0 Then RegCloseKey RegAnahtar
End Sub



Nasıl Kullanılır
__________________________________________________ ___________

Yeni Bir proje oluşturun daha önceden oluşturduğumuz sınıfı projeye ekleyin forma bir command button ekleyin ve aşağıdaki kodu yazın yada kopyalayın



Private Sub Command1_Click()

Dim r As New C_Reg 'Yeni bir registry erişim sınıfı tanımlar

r.RegKok = HKEY_LOCAL_MACHINE 'Kullanılacak kök
r.RegYol = "Software\BenimAnahtarim" 'Kullanılacak Yol

r.AnahtarOlustur HKEY_LOCAL_MACHINE, "Software\BenimAnahtarim" 'Eğer bu anahtar önceden varsa bunun kullanılmasına gerek yok

r.MetinKaydet "Deneme", "Merhaba" 'bir string değerini kaydeder

MsgBox r.MetinOku("Deneme") 'kaydetdiğimiz değeri oku
__________________________________________________ _______________________________________________

SAYI TABANI...

girdiğiniz onluk tabandaki sayıyı istediğin tabana çeviren proğram.



Option Explicit
Dim isaret As String
Dim taban As Byte

'*************************************************
Private Sub Command1_Click()
If isaret <> "rakam_girilmedi" Then
döndür
End If
End Sub

'*************************************************
Public Function cevir(SAYI As Integer) As String
If SAYI = 10 Then cevir = "A"
If SAYI = 11 Then cevir = "B"
If SAYI = 12 Then cevir = "C"
If SAYI = 13 Then cevir = "D"
If SAYI = 14 Then cevir = "E"
If SAYI = 15 Then cevir = "F"

End Function

'*************************************************
Private Sub Form_Load()
taban = 2
End Sub

'*************************************************
Private Sub mnuÇıkış_Click()
End
End Sub

'*************************************************
Private Sub Option1_Click()
taban = 2
End Sub

'*************************************************
Private Sub Option2_Click()
taban = 16
End Sub

'*************************************************
Private Sub Option3_Click()
taban = 10
End Sub

'*************************************************
Private Sub Option4_Click()
taban = 8
End Sub

'*************************************************
Private Sub döndür()
Dim c As Integer
Dim A As Byte
Dim kalan(20) As Integer
Dim sonuc(20) As Integer

If Text1 = "" Then
MsgBox "sayı girmeyi unuttunuz..."
ElseIf Text1 <> "" Then
Text3 = ""
A = 1
sonuc(A) = Text1
Do
A = A + 1
sonuc(A) = sonuc(A - 1) \ taban
kalan(A) = sonuc(A - 1) Mod taban

Loop Until sonuc(A) + 1 < taban

If taban > sonuc(A) Then
A = A + 1
kalan(A) = sonuc(A - 1) Mod taban
End If

For c = A To 2 Step -1
Text3 = Text3 + IIf(kalan(c) > 9, cevir(kalan(c)), Str(kalan(c)))

Next c

End If
End Sub


'*************************************************
Private Sub Text1_Change()

If isaret = "rakam_girilmedi" Then
Text1.Text = ""
End If

End Sub

'*************************************************
Private Sub Text1_KeyPress(KeyAscii As Integer)

If (((KeyAscii < 48) Or (KeyAscii > 57)) And (KeyAscii <> 8) And (KeyAscii <> 13)) Then

MsgBox "rakam girmelisiniz", 16, "UYARI"

If KeyAscii = 13 Then
If isaret <> "rakam_girilmedi" Then
döndür
End If
End If


isaret = "rakam_girilmedi"
Else
isaret = "rakam_girildi"
End If

__________________________________________________ ________________________________________

VİSUAL BASİC.NET İLE WEP KAMERA PROGRAMI YAZMA

Elinizde her hangi bir web camera varsa bunu sisteminize bağlayın...

Visual Basic Projesi açın..
__________________________________________________ __________________

Formun üzerinde picturbox ekleyin... ve name ini camSrc yapın

formun load ve close una aşağıdaki kodu ekleyin..

Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

MapWebcamToWindow(camSrc.Width, camSrc.Height, camSrc.Handle.ToInt32)

End Sub



Private Sub Form1_Closed(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Closed

CloseWebcam()

End Sub


programınıza bir modul ekleyin

genel api,structure ları ekliyeceğiz...
Net te api declare için

Imports System.Runtime.InteropServices 'namspace
Imports Microsoft.VisualBasic.Compatibility

'vb6 control için 'refler den Microsoft.VisualBasic.Compatibility ekle

Temel Değişkenler
__________________________________________________ ________________

#Region "Teme Değişkenler"
Public lwndC As Integer

Public Const WS_CHILD As Integer = &H40000000

Public Const WS_VISIBLE As Integer = &H10000000

Public Const SWP_NOMOVE As Short = &H2S

Public Const SWP_NOZORDER As Short = &H4S

Public Const WM_USER As Short = &H400S


Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_USER + 10

Public Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_USER + 11

Public Const WM_CAP_SET_VIDEOFORMAT As Integer = WM_USER + 45

Public Const WM_CAP_SET_PREVIEW As Integer = WM_USER + 50

Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_USER + 52


'The video format is defined in terms of a bitmap, so we must define our standard bitmap structure
#End Region


Structure Tanımları
__________________________________________________ _________________

Public Structure BITMAPINFOHEADER

Dim biSize As Integer

Dim biWidth As Integer

Dim biHeight As Integer

Dim biPlanes As Short

Dim biBitCount As Short

Dim biCompression As Integer

Dim biSizeImage As Integer

Dim biXPelsPerMeter As Integer

Dim biYPelsPerMeter As Integer

Dim biClrUsed As Integer

Dim biClrImportant As Integer

End Structure

Public Structure BITMAPINFO

Dim bmiHeader As BITMAPINFOHEADER

Dim bmiColors() As Integer

End Structure


Apilerimizi Declare Edelim
__________________________________________________ _______________


CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> Public Function SetWindowPos(ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
End Function

CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> Public Function SendMessage(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Short, ByVal lParam As Integer) As Integer
End Function

CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> Public Function SendMessageAsBitMap(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As BITMAPINFO) As Integer

End Function

'can alıcı apilerimiz

CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> Public Function capCreateCaptureWindowA(ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer

End Function

CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> Public Function capGetDriverDescriptionA(ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean

End Function



Fonksiyonlarımız ,bunlar olmadan nasıl görüntü abilirizki :-)
__________________________________________________ _______________

Function capDriverConnect(ByVal lwnd As Integer, ByVal i As Short) _
As Boolean
capDriverConnect = SendMessage(lwnd, WM_CAP_DRIVER_CONNECT, i, 0)
End Function

Function capDriverDisconnect(ByVal lwnd As Integer) As Boolean
capDriverDisconnect = SendMessage(lwnd, WM_CAP_DRIVER_DISCONNECT, _
0, 0)
End Function
Function capSetVideoFormat(ByVal hCapWnd As Integer, ByRef BmpFormat _
As BITMAPINFO, ByVal CapFormatSize As Integer) As Boolean
capSetVideoFormat = SendMessageAsBitMap(hCapWnd, _
WM_CAP_SET_VIDEOFORMAT, CapFormatSize, BmpFormat)
End Function

Function capPreview(ByVal lwnd As Integer, ByVal f As Boolean) As _
Boolean
capPreview = SendMessage(lwnd, WM_CAP_SET_PREVIEW, f, 0)
End Function

Function capPreviewRate(ByVal lwnd As Integer, ByVal wMS As Short) As _
Boolean
capPreviewRate = SendMessage(lwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0)

End Function



Procedurler
__________________________________________________ _______________

#Region "Prosedures"


Sub MapWebcamToWindow(ByRef lWidth As Integer, ByRef lHeight As Integer, ByRef hWnd As Integer)
Dim lpszName As New VB6.FixedLengthString(100)
Dim bmp As BITMAPINFO
With bmp.bmiHeader
.biSize = Len(bmp.bmiHeader)
.biWidth = 320
.biHeight = 240
.biPlanes = 1
.biBitCount = 24
End With
capGetDriverDescriptionA(0, lpszName.Value, 100, Nothing, 100)
lwndC = capCreateCaptureWindowA(lpszName.Value, _
WS_VISIBLE Or WS_CHILD, 0, 0, lWidth, lHeight, hWnd, 0)
If capDriverConnect(lwndC, 0) Then
capPreviewRate(lwndC, 66)
capPreview(lwndC, True)
capSetVideoFormat(lwndC, bmp, Len(bmp))
SetWindowPos(lwndC, 0, 0, 0, bmp.bmiHeader.biWidth, _
bmp.bmiHeader.biHeight, SWP_NOMOVE Or SWP_NOZORDER)
End If
End Sub

Sub CloseWebcam()
capDriverDisconnect(lwndC)
End Sub

#End Region



Artık çalıştıralım projeyi.
__________________________________________________ ________________________________________________

KODLARLA DATABASE OLUŞTURMAK VE VE VAROLAN BİR DATABASE'E YENİ ALAN EKLEMEK

'Project/Reference menüsünden Microsoft DAO 3.61 Library i _ ekle ve aşağıdaki kodları kullan. Bir tane de Command button ekle ok? )



Private Sub Form_Load()
Dim NewDB As Database
Set NewDB = CreateDatabase("db1.mdb", dbLangGeneral, dbVersion70)
Dim NewTbl As TableDef
Set NewTbl = NewDB.CreateTableDef("Tablo1")
Dim NewField As Field
Set NewField = NewTbl.CreateField("alan1", dbText, 25)
NewField.Attributes = dbRequired ' bu alanı gerekli gör
NewTbl.Fields.Append NewField
NewDB.TableDefs.Append NewTbl

End Sub

Private Sub Command1_Click()
Dim db As Database
Dim tbl As TableDef
Dim alan As Field
Set db = OpenDatabase("db1.mdb", dbOpenTable)
Set tbl = db.TableDefs("Tablo1")
Set alan = tbl.CreateField("alan2", dbText, 25)

alan.Attributes = dbRequired ' bu alanı gerekli gör
tbl.Fields.Append alan

End Sub
__________________________________________________ _____________________________________
PASCAL ÜÇGENİ...

Bu programı kullanarak pascal üçgeninde herhangi bir noktayı bulabilirsiniz
Form'a bir tane label koyun ve gerisini programa bırakın



label1.autosize=true
label1.left=0
label1.top=0
label1.caption="0"
x=10 'eleman sayısı
y=1 'bu her zaman en sondaki sayı olacak
for i=1 to x
label1.caption=label1.caption & (x.y)/i
y=(x.y)/i
next
__________________________________________________ __________________________________________
YARDIM DOSYALARINA COMMON DİALOG İLE BAĞLANTI KURMAK...

Project-->Components-->Microsoft Commont Dialog Control `ü components`i seçin . CommonDialog1`i formunuza ekleyin .
Project-->Project1 Properties (? Hangi proje ismini vermişseniz )-->Help File Name `den hazırlamış olduğunuz *.hlp ( ? Hangi help dosya ismini vermişseniz ) dosyasını giriniz . App nesnemizin HelpFile özelliği tasarım aşamasında set edilmiş olur . Ayrıca setup hazırlarken help dosyalarını da otamatik olarak ekletmiş oluruz .

Forma Components

Sub Command1_Click()
With CommonDialog1
.HelpFile=App.HelpFile
.HelpCommand=11 ?içindekiler sekmesini görüntüler
.ShowHelp
End With
End Sub
?*******Herhangi bir konu sayfasına erişmek istersek
Sub Command2_Click()
With CommonDialog1
.HelpFile=App.HelpFile
.HelpContext=1
.HelpCommand=1 ?HelpContext = 1 numaralı konu sayfasının görünmesi
.ShowHelp
End With
End Sub
__________________________________________________ ___________________________________________
PARABOL DENKLEMİ VE ÖZELLİKLERİNİ BULMA..

girilen ikinci derece denklemin köklerini, fonksiyonun tepe noktasını, tanım ve değer kümesinin bulunması için hazırlanmş basit ama çok kullanışlı bir uygulama




Dim a
Dim b
Dim c
Dim del
Dim x1
Dim x2
Dim range
Dim dela

Private Sub Command1_Click()
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
del = b * b - (4 * a * c)
'************************************************* ********************************************
If del >= 0 Then
x1 = Round((-b + Round(Sqr(del), 3)) / Abs(2 * a), 4)
x2 = Round((-b - Round(Sqr(del), 3)) / Abs(2 * a), 4)
Label4.Caption = "Kökler = " & x1 & " , " & x2
Else
dela = Abs(del)
x1 = Round(-b / Abs(2 * a), 4) & "+" & Round(Round(Sqr(dela), 4) / Abs(2 * a), 4) & "i"
x2 = Round(-b / Abs(2 * a), 4) & "-" & Round(Round(Sqr(dela), 4) / Abs(2 * a), 4) & "i"
Label4.Caption = "Kökler = " & x1 & " , " & x2
End If
'************************************************* ********************************************
Label5.Caption = "f(x) Vertex = (" & Round(-b / (2 * a), 4) & " , " & Round(-del / (4 * a), 4) & ")"
'************************************************* ********************************************
Label6.Caption = "f(x) Simetri ekseni = " & -b / 2 * a
'************************************************* ********************************************
Label7.Caption = "f(x) Tanım kümesi = R"
'************************************************* ********************************************
If a > 0 Then
range = "( + sonsuz , " & Round(-del / (4 * a), 4) & " ]"
Else
range = "[ " & Round(-del / (4 * a), 4) & " , - sonsuz)"
End If
Label8.Caption = "f(x) Değer kümesi = " & range
End Sub

Private Sub Label7_Click()

End Sub
__________________________________________________ _____________________________________________
CRYSTAL REPORT 8 İLE RAPORLAMA...

CRYSTAL REPORT ile istediğiniz kaydın raporlaması artık çok kolay.


'AŞAĞIDAKİ SUB DA
'
'FRM=CRViewer 'IN BULUNDUĞU FORM
'
'PATH=.RPT UZANTILI RAPOR DOSYANIZIN YOLU

'SQL=SORGUNUZ

'CNN1=TANIMLANMIŞ VE DB YE BAĞLANTISI YAPILMIŞ BİR CONNECTION NESNESI
'
'RS= TANIMLI BİR RECORDSET
"""""""""""""""""""""""""""""""""""""""""""""" """
'KULLANIMI
'RAPORLA RAPORFORMUM,"C:\RAPOR\RAPORUM.RPT","SELECT * FROM TABLOM WHERE ADI='MUSTAFA KOÇER'"

'modüle yapıştır

Public CrxApp As New CRAXDRT.Application
Public Report As New CRAXDRT.Report

Public Sub raporla(frm As Form, Path As String, sql As String)

On Local Error Resume Next
Set rs = Cnn1.Execute(sql)
If rs.RecordCount < 1 Then
MsgBox "Hiçbir Kayıt Bulunamadı...", vbCritical, "UYARI"

Exit Sub
End If

frm.Show
Set Report = CrxApp.OpenReport(Path)
Report.DiscardSavedData
frm.CRViewer1.EnableGroupTree = True
frm.CRViewer1.DisplayGroupTree = False


Report.Database.SetDataSource rs10
frm.CRViewer1.ReportSource = Report
frm.CRViewer1.ViewReport
frm.CRViewer1.Zoom (100)
frm.CRViewer1.Visible = True

End Sub
__________________________________________________ _________________________________________
HATA YAKALAMA...

[Kullanıcı ile Dost Hata Mesajları


Program yazarken hata mesajlarını nasıl organize ediyorsunuz? Kullanıcı hata mesajlarından bir şey anlayabiliyor mu? Yada kullanıcı hata mesajı ekranda belirince ne yapacağını biliyor mu?


Burada anlattığım yöntem ile program içinde oluşan hata mesajlarını daha anlaşılır biçime sokabiliriz. Böylece hem kullanıcı hata ile karşılaşınca ne yapacağını bilir, hemde siz hatayı çözerken nereden başlayacığınızı bilirsiniz.


Genel olarak özetleyecek olursak bir VB projesinin, projedeki tüm formların ve formlardaki tüm fonksiyonların bir ismi vardır. Kullanıcı göreceği hata mesajında şöyle bir yapı ile karşılaşır.

vbProjeİsmi.Formunİsmi.Fonksiyonunİsmi

Burada ismi olmayan tek şey kod satırlarıdır. Satırlara isimleri de hatayı ararken biz ekleyeceğiz. Böylece tam bir hata mesajı ekranda belirecek, okunduğunda anlaşılan ve yazılımcıyı yönlendiren bir hata mesajı.



Şimdi yeni proje açıp formun üzerine bir buton koyun. Butonun ismi btnHata olacak. Aşağıdaki kodu formun General Declerations bölümünden itibaren kopyalayın. Kod içindeki yorum satırlarına dikkat edin ve gerekli yerleri isteğinize göre değiştirmeyi unutmayın


Const CLASS_NAME = "frmAdresDefteri" 'formun ismini veriyoruz.

Private Sub btnHata_Click()

On Error GoTo Exit_proc ' Hata durumunda Exit_proc kismina gidecek.


Const METHOD_NAME = CLASS_NAME & ".btnHata_Click" 'Bu fonksiyonun ismini veriyoruz.

'Bu durumda elimizde formun ismi ve ilgili fonksiyonun ismi olmuş oluyor.

'**************************

'Buradan sonra yapmak istediginiz işin kodlari gelecek

ren = 10 / 0

'**************************

Exit_proc:

Call EndProcedure(METHOD_NAME)

End Sub


Şimdi bir module ekleyip aşağıdaki kodu yapıştırın. Bu kod ile hata mesajları daha anlaşılır biçime sokulmaktadır. Eğer istenirse daha da genişletilerek farklı işler yapması sağlanabilir.


Public Sub EndProcedure(sMethod As String, Optional sMessage As String)

Dim sText As String
Dim lErrNo As Long
Dim sErrSource As String
Dim sErrDescription As String
Dim lERL As Long
If Err.Number <> 0 Then

'Hatanin ayrintilarini kaydediyoruz, Boylece eger MTS kullaniyorsaniz Error nesnesi
'kaybolunca bilgisi elimizde kalir
lErrNo = Err.Number
sErrSource = Err.Source
sErrDescription = Err.Description

lERL = Erl
sText = App.Title & "." & sMethod 'Uygulamanin basliginida ekleyelim

'Eger baska bilgi varsa onuda ekliyoruz

If sMessage <> "" Then sText = sText & sMessage

'Okunmasi kolay bir hale getirelim

sText = "Hata yeri : " & sText & vbCrLf & _
"Hata satiri : " & lERL & vbCrLf & _
"Hata icerigi : " & sErrDescription & vbCrLf & _
"Lutfen falan kisi ile kontak kurunuz."

'Ve hatayi kullaniciya gosterelim

Err.Raise lErrNo, sErrSource, vbCrLf & sText
End If

End Sub


Bu işlemlerden sonra projeyi çalıştırıp butona basın. Ekranda şöyle bir mesaj belirecek.



Runtime-Error '11':
Hata Yeri : <Proje ismi>.<form ismi>.btnHata_Click
Hata satiri : 0
Hata Icerigi : Division by zero
Lutfen falan kisi ile kontak kurunuz.

Bu hata kullanıcı tarafından size bildirildikten sonra hatanın hangi formda ve hangi fonksiyonda olduğunu bileceksiniz. Eğer butonun fonksiyonunu aşağıdaki gibi değiştirirsek hatanın olduğu satırıda bilmiş olacağız.



Private Sub btnHata_Click()

On Error GoTo Exit_proc ' Hata durumunda Exit_proc kismina gidecek.


Const METHOD_NAME = CLASS_NAME & ".btnHata_Click" 'Bu fonksiyonun ismini veriyoruz.

'Bu durumda elimizde formun ismi ve ilgili fonksiyonun ismi olmus oluyor.

'**************************

'Buradan sonra yapmak istediginiz isin kodlari gelecek

10:

20: ren = 10 / 0 'hata olabilecek satirlari markaliyoruz

'Onceden markalamaya gerek yok fakat hata durumunda markalayarak hatayi arayabiliriz.

30:

'**************************

Exit_proc:

Call EndProcedure(METHOD_NAME)

End Sub


Hata mesajı şu şekilde ekranda belirecektir.


Runtime-Error '11':
Hata Yeri : <Proje ismi>.<form ismi>.btnHata_Click
Hata satiri : 10
Hata Icerigi : Division by zero
Lutfen falan kisi ile kontak kurunuz.


Bu mesajdan sonra yazılım uzmanlarınızdan hangisi sıfıra bölme işlemi için o kodu oraya yazdıysa tek ayak üstünde bir saat bekleme cezası almalıdır.


EndProcedure fonksiyonu içinde istersek hatayı veritabanında bir tabloya bile kaydedebiliriz. Bu tamamı ile size kalmış. Eğer tam bir hata kontrolü istiyorsanız MS SQL Server üzerinde hazırlayacağınız bir "stored procedure" ve değişimlerde e-posta atma özelliğini kullanarak hatanın size direk ulaşmasını da sağlayabilirsiniz.

__________________________________________________ _____________________________________________

DOSYA ERİŞİM MODLARI..

Kullanılacak Komutlara Giriş
--------------------------------------------------------------------------------


Bu örneğimde dosyaya direkt olarak veri yazma ve okuma komutlarını kullandım. Bunun için ilk önce bu komutların ne işe yaradığını ve nasıl kullanıldığını görelim?

YAZMA MODLARI
--------------------------------------------------------------------------------


1 ? Output Modu
--------------------------------------------------------------------------------

Dosya sıralı erişim modunda sadece yazma işlemi için açılır. Veriler tek yönlü taşınır ve okuma işlemine izin verilmez.
Yazma işlemi birkaç farklı teknikle yapılabilir.Bunlardan birincisi PRINT metodudur. Print metodunda bilgiler yan yana veya alt alta aralarında hiçbir ayıraç kullanılmadan yazılır.
Print #1,bilgi1,bilgi2,bilgi3 à Veriler yan yana yazılır.
Print #1, bilgi1
Print #1, bilgi2
Print #1, bilgi3 à Veriler alt alta yazılır.
Write metodu ise ikinci bir seçenektir. Bu metot ile yazma işlemi yaptığımızda hedef dosyaya gönderdiğimiz bütün bilgiler ?bilgi? şeklinde çift tırnak ile ayrılırlar. Yine print metodunda olduğu gibi tek satırda gönderilen bilgiler hedef dosyaya da tek satırda yazılırlar, alt alta write komutu verilerek yazılan bilgiler ise hedef dosya üzerinde de alt alta bulunurlar.
Fakat print metodundan farklı olarak write ile tek satırda gönderilen bilgiler hem çift tırnakla belirtilir hem de her bilgi arasına virgül işareti yazılarak ayrılırlar.
Output metodu ile yeni bir kayıt yaptığınızda, yeni bilgiler eski kayıtların üzerine yazılacaktır. Bo mod ile işlem yaparken eski verilerinizin kaybolacağını veya zarar göreceğini bilmeniz gerekir.

2 ? Append Modu
--------------------------------------------------------------------------------


Output modunda bulunan bütün özellikleri kullanabilen bir sıralı erişim modudur. Print ve write komutları output modunda olduğu gibi kullanılırlar.
Output modu ile yaptığınız tüm işlemleri Append modu ile yapabilirsiniz. Aralarında tek bir fark vardır o da Append modunda yeni kayıt yapıldığında kendini dosya sonuna eklemesidir. Yani Append modunda işlem yapıldığında eski kayıtlarınız silinmez ve yeni kayıt dosya sonuna kendini otomatik olarak ekler. Böylece hem Output modunda kayıt yapmış hem de verilerinizi kaybetmemiş olursunuz.

3 ? Random Modu
--------------------------------------------------------------------------------


Sıralı erişim dosyalarından oldukça farklı bir yapıya sahiptir. Bir veritabanı yapısına uygundur ve düşük seviyeli bir veritabanı için rahatlıkla kullanılabilir.
Bu moda yapılan her kayıt bir kayıt numarasına sahiptir. Ayrıca her kayıt belli bir uzunluktadır ve belirtilen uzunluğu aşan kayıtlarda artık bölüm hedef dosyaya yazılmaz. Dosya açma işlemi sırasında dosya kayıt bilgisinden hemen sonra kayıtların karakter uzunlukları belirtilerek her kaydın bir kayıt numarası alması sağlanır.
Kullanımı : Open App.Path & ?/volkan.txt? For Random As #1 Len=15 şeklindedir. Satırın sonunda bulunan Len = 15 bilgisi her kaydın ne kadar karaktere sahip olduğunu gösterir. Böylece sistem hedef dosyadaki bütün kayıtları okur ve bunları 15 karakterlik parçalara bölerek birer sıra numarası verir. Bu sıra numarasıyla daha sonra kayıtlar okunabilir.
Gönderdiğimiz veriler belirtilen kayıt uzunluğundan fazla ise değişken tanımlamamıza bağlı olarak ya kayıtların sonundaki fazlalık atılarak kayıt yapılır yada kayıt tam yapıldığı halde bir bölümü daha sonraki kayıt içinde yer alır.
Eğer gönderdiğimiz bilgiler kayıt uzunluğundan kısaysa eksik bölge kadar boşluk karakteri kayıt sonuna eklenerek kayıt uzunluğu olması gereken boyuta getirilir. Bu özellik ile kayıtlarımız belli bir düzende sıralanır ve veritabanı gibi kullanılabilir.
Random modunda PUT metodu kullanılır.

4 ? Binary Modu
--------------------------------------------------------------------------------


Binary dosyalama modu diğer modlara göre çok daha gelişmiş uygulamalar için tasarlanmıştır. Bütün özel dosya biçimleri Binary modu ile kayıt edilebilir ve içinde metin tabanlı dosyalama modlarına göre daha karmaşık bilgiler barındırabilir. Her kayıt metin değeri olarak 1 karakterlik yer kaplar. Random erişim modunda olduğu gibi her kayıt bir kayıt numarasına sahiptir fakat sadece 1 karakterlik kayıtlar yapabildiğimiz için bu kayıt numaraları aslında hedef bilginin dosya içindeki karakter sırasıdır.
Binary erişim modu ile her karaktere ayrı ayrı erişebilir, düzenleyebilr veya silebilirsiniz. Bu özelliğinden dolayı metin tabanlı dosya biçimleri dışındaki bütün özel dosya biçimlerine Binary mod ile erişmek zorunda kalırız. Örneğin bir .EXE veya .BMP dosyası oluşturmak istediğimde kullanacağımız dosya erişim biçimi kesinlikle Binary mod olmalıdır. Aksi taktirde oluşturduğumuz dosya işlemci veya işleyici program tarafından doğru olarak okunamaz, işlenemez.
Kullanımı ut #1, 1, bilgi1 şeklindedir. ?, 1 ,? kayıt numarasıdır. Yani bu bilgi1?in 1. karakter olduğunu belirtir.

OKUMA MODLARI
--------------------------------------------------------------------------------


1 ? Input Modu
--------------------------------------------------------------------------------


Input modunda dosya okumak için iki teknik kullanabiliriz. Bunlardan birincisi Input okuma modudur.
Bu teknikte dosya açıldıktan sonra verilen her input komutu dosyada bir satırın okunması anlamına gelir. Satır numarası verilmediği halde bir input komutundan sonra gelen diğer input komutu sıradaki satırın okunması anlamına gelir. Dosya kapanmadığı sürece her input komutunda bir sonraki satır okunacaktır. Bu durum dosya açıldıktan sonra her satırın sadece bir defa okunabilmesi anlamına gelir. Ayrıca hedef satıra ulaşmak için o satırdan önceki bütün satırları da okumak zorunda kalırız. Dosyayı tümüyle okuyacak ve bir değişkene atayacak olursak input tekniği etkili bir çözüm olabilir, fakat dosya üzerinde özel işlemler yapmak istiyorsak input tekniği bize çeşitli sorunlar çıkartacaktır.
Input modunda kullanacağımız ikinci teknik ise Line Input. Bu teknikte hedef satır numarası verilebilir ve diğer kayıtlarla uğraşılmadan direkt olarak hedef satır okunur. İstendiğinde daha önce okunmuş bir satır tekrar okunabilir, okunmuş olan satırdan da daha önceki bir satıra ulaşılabilir. Metin tabanlı kayıtlar oluşturmuşsak input modu ve line input tekniği işinize yarayacaktır.

2 ? Random Modu
--------------------------------------------------------------------------------


Random modu yine bu moda kaydedilmiş olan verileri okumak için kullanılır. GET tekniği kullanılır.
Kullanımı : Get #1, 1, bilgi1 à şeklindedir.

3 ? Binary Modu
--------------------------------------------------------------------------------


Binary modu yine bu moda kaydedilmiş olan verileri okumak için kullanılır. GET tekniği kullanılır.
Kullanımı : Get #1, 1, bilgi1 à şeklindedir.

KODLARIN KULLANIMINA ÖRNEK
__________________________________________________ __________

Private Sub command1_Click()
Dim bilgi As String
Open App.Path & ?/volkan.txt? For Input As #1
Do While Not EOF(1)
Bilgi = bilgi & Input(1,#1)
Loop
Close #1
MsgBox (bilgi)
End Sub

Private Sub Command1_Click()
Dim bilgi1 As Byte
Dim bilgi2 As Byte
Dim bilgi3 As Byte
Dim bilgi4 As Byte
Open App.Path & ?/volkan.txt? For Binary As #1
Get #1, 1, bilgi1
Get #1, 10, bilgi2
Get #1, 20, bilgi3
Get #1, 30, bilgi4
Close #1
MsgBox (CStr(Chr(bilgi1))&vbCrLf_
&CStr(Chr(bilgi2))&vbCrLf_
&CStr(Chr(bilgi3))&vbCrLf_
&(CStr(Chr(bilgi4)))

End Sub
__________________________________________________ __________________________________________
VB.NET İLE RAST GELE STRİNG ÜRETME..

Bu uygulama birçok yerde işimize yarayabilecek bir ?Rastgele Kod Üretici? dir. Rastgele üretilmiş bir koda birçok yerde ihtiyaç duyabiliriz. Örneğin; web sitenizin üye kayıtlarında üye adaylarının gerçek email adreslerini girmelerini garantilemek isteyebilirsiniz. Bunu sağlamanın en basit yolu, kişinin verdiği email adresine rastgele ürettiğiniz bir kodu göndermektir. Böylece üye adayından, üyelik işlemlerinin tamamlanarak hesabın aktive olabilmesi için, email adresine gönderdiğiniz aktivasyon kodunu ?üyelik aktivasyon? sayfanızda girmesini isteyebilirsiniz. Eğer email adresi doğru değilse aktivasyon kodunu edinemeyeceğinde üyeliği de geçerli olmaz.

Rastgele kod üretebilmek için kullanacağımız en önemli sınıf ?System? isim alanı (namespace) içerisinde bulunan ?Random? sınıfıdır (class). Bu sınıfı kullanarak kod içerisinde görünmesini istediğimiz karakterler dizisinin boyutu kadar rastgele tamsayı üreteceğiz.

Kullanacağımız diğer bir sınıf ise System.Text isim alanı içerisinde bulunan StringBuilder sınıfıdır. Yapacağımız işlem bir metin birleştirme döngüsü içermekte ve metin birleştirme işlemlerinde StringBuilder sınıfı, string tipine oranla daha fazla performans sağlamaktadır.

<B> Uygulamayı bir fonksiyon olarak hazırlayacağız.</B>

Fonksiyon üreteceği ?rastgele kod? un kaç karakter uzunlukta olması istendiğini ?codeLength? parametresiyle alacak. Ürettiği ?codeLength? kadar karakter uzunluğundaki ?Rastgele Kod?u da string veri tipinde, fonksiyonun çağırıldığı yere döndürecek.

Private Function GenerateCode(ByVal codeLength As Integer) As String

End Function

Fonksiyonda ilk olarak ?sb? değişken adıyla, ?rastgele kod?u yapılandıracağımız StringBuilder nesnesini ve ikinci olarak da ?objRandom? adıyla, rastgele sayı üretecek olan Random nesnesini yapılandıracağız.

Dim sb As New System.Text.StringBuilder

Dim objRandom As New System.Random

Sıra ?Rastgele Kod?umuz içinde yer almasını istediğimiz karakterleri bir metin dizisi olarak tanılamaya geldi. Ben bu örnekte ?A-Z?, ?a-z? ve ?0-9? arası karakterleri kullandım. Siz isterseniz uygulamayı zenginleştirmek için farklı karakterler de kullanabilirsiniz.

Dim strChars() As String = {"A", "B", "C", "D", "E", "F", "G", "H",

......................................

"l", "m", "n", "o", "p", "q", "r", "s", "z"}

Şimdi işlemlere başlayabiliriz. Önce rastgele üreteceğimiz sayı aralığını bulalım. Yukarıdaki karakterler ?strChars? adında bir metin dizisinde tutulmaktalar. Diziler 0 indeksle başladıklarından rastgele üretilecek olan minimum rakam 0 olmalıdır. Üretilecek maksimum rakam ise dizinin en son elemanının indeksi olmalıdır. Dizinin en büyük indeksli elemanının indeks bilgisini

Dim maxRand As Integer = strChars.GetUpperBound(0)

koduyla aynı anda hem bu değeri tutacak olan ?maxRand? adında bir değişken tanımlayarak dizinin ?GetUpperBound(0)? metoduyla alırız.

?Rastgele Kod?un üretilmesi, istenilen kod uzunluğu için her bir basamağın rastgele oluşturulmasıyla sağlanır. Bunun için, 0 ile ?Rastgele Kod? için kullanılacak karakter dizisinin en büyük indeksi arasında rastgele bir sayı objRandom.Next(maxRand) metoduyla üretilir ve bu değer ?rndNumber? değişkenine atanır.

Dim rndNumber As Integer = objRandom.Next(maxRand)

Karakter dizisindeki rastgele bir eleman, edinilen ?rndNumber? sayısını indeks olarak kullanarak ?strChars(rndNumber)? ifadesiyle elde edilir ve bu karakter sb.Append metoduyla ?sb? nesnesine eklenir.

sb.Append(strChars(rndNumber))

Eğer 10 karakter uzunluğunda bir ?rastgele kod? istenirse, önce birinci basamak için rastgele bir karakter üretilir, daha sonra ikinci basamak için ve bu böylece 10?a kadar devam eder. Bu üretilen karakterler ?sb? değişkeni içerisinde ard arda eklenir.

For i As Integer = 0 To codeLength - 1

Dim rndNumber As Integer = objRandom.Next(maxRand)

sb.Append(strChars(rndNumber))

Next

En son olarak da StringBuilder nesnesinin içerinde yapılandırılmış olan ve rastgele karakterlerden meydana gelen sonuç, string veri tipine sb.ToString() metoduyla dönüştürülerek fonksiyon sonlandırılır ve değer fonksiyonun çağırıldığı yere döndürülür.

Return sb.ToString()

Aşağıdaki örnek kod ve yukarıdaki ekran görüntüsü, metin birleştirme işlemlerinde gerçekten çok iyi performans gösteren StringBuilder sınıfının, string ile karşılaştırıldığı bir console (konsol) uygulamasıdır.


Private Function GenerateCode(ByVal codeLength As Integer) As String
Dim sb As New System.Text.StringBuilder

Dim objRandom As New System.Random

Dim strChars() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", _
"J", "K", "L", "M", "N", "O", "P", "Q", "R", _
"S", "T", "U", "V", "W", "X", "Y", "Z", _
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", _
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", _
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}

Dim maxRand As Integer = strChars.GetUpperBound(0)

For i As Integer = 0 To codeLength - 1

Dim rndNumber As Integer = objRandom.Next(maxRand)

sb.Append(strChars(rndNumber))

Next


Return sb.ToString()

End Function


----------------------------------------------


Sub Main()

Dim newCode As String

newCode = GenerateCode(10)

Console.WriteLine("Üretilen kod : {0}", newCode)

Console.ReadLine()

End Sub
__________________________________________________ __________________________________________________
VİSUAL BASİC DE KONTROL KOMUTLARI...

Visual Basic'de Kontrol Komutları
Kontrol komutlari programcilar tarafindan sikca kullanilan belirli ifadeleri kontrol etmek veya bazi sartlarin gerçeklesip gerçeklesmedigini kontrol etmek amaciyla kullanilan komutlardir. Biz burada en çok kullanilan komutlarin üzerinde duracagiz.
If Kontrol Yapisi :
Genel olarak bu komut yapisi su sekilde yazilir.
If Kosul Then
Kosul dogru ise yapilmasi istenen islemler.
Endif
Kullandigimiz her If kontrolu için mutlaka bir Endif kullanmaliyiz. Bu kontrol yapisinin sonlandigini belirtir.
Örnek:
If ad="FATIH" Then
Maas=10000000
Endif
Eger kosul gerçeklesmemis ise yapilmasi istenen bazi islemler varsa o zaman su sekilde bir kontrol yapisini kullanabiliriz.
If Kosul Then
Kosul dogru ise yapilmasi istenen islemler.
Else
Kosul yanlis ise yapilmasi istenen islemler.
Endif
Ayni anda bir kaç kosul için karsilastirma yapilmak isternirse;
If Kosul Then
Kosul dogru ise yapilmasi istenen islemler.
Elseif Kosul1 Then
Kosul1 dogru ise yapilmasi istenen islemler.
Elseif Kosul2 Then
Kosul2 dogru ise yapilmasi istenen islemler.
Else
Bütün kosullar yanlis ise yapilmasi istenen islemler.
Endif
yapisi kullanilir. Bu yapida mutlaka Else blogunun bulunmasina gerek yoktur. Burada eger Kosul dogru ise ilk Then?den sonraki satirlar çalistirilarak Elseif ifadesine kadar icra edilirler. Daha sonra Endif ifadesinden sonraki satir icra edilir.Eger Kosul yanlis ise Kosul1 ifadesi kontrol edilir.Dogru ise buradaki then den sonraki satirlar çalistirilir. Yanlis ise Kosul2?ye bakilir. Eger bu kosulda yanlis ise Else ifadesinden sonraki satirlar çalistirilir.
Örnek :
If Isim="Ali" Then
Maas=Maas * 1.2
Elseif Isim="Murat" Then
Maas=Maas * 1.4
Elseif Isim="Kemal" Then
Maas=Maas * 1.1
Endif
Örnek :
If Bolen=0 Then
Msg.Text=" Bolen sayi sifir olamaz."
Else
Sonuc= Sayi / Bolen
Msg.Text = Sonuc
Endif
Ornek :
If name="Ali" AND no="1301920035"
Not=4
ElseIf name="Ahmet" AND no="1301940023" Then
Not=3
ElseIf name="Hakan" AND no="1301930045" Then
Not=2
ElseIf name="Hatice" AND no="1301940005" Then
Not=7
Endif
Select Case:
Bu kontrol yapisinda sadece bir degiskenin durum kontrolü yailir.Kontrolü yapilacak degiskenin genel olarak alabilecegi degerler belirli ise bu yapinin kukllanilmasi If yapisina göre daha avantajlidir. Yazilis biçimi genel olarak asagidaki sekildeki gibidir
Select Case Degisken
Case Deger1
Degisken=Deger1 oldugu durumda yapilmasi istenen islemler
Case Deger2
Degisken=Deger2 oldugu durumda yapilmasi istenen islemler
Case Else
Degisken yukaridaki degerler den hicbirine esit degil ise yapilacak islemler
End Select
Kullandigimiz her Select ifadesi için bir End Select kullanmaliyiz.
Örnek :
Select Case No
Case 1304
Name="Murat Tuna"
Case 1306
Name="Ayse Sinem"
Case 1307
Name="Hakan Kaya"
Case 1312
Name="Abdullah Kahyali"
Case 1324
Name="Hatice Uygun"
End Select
Örnek :
Select Case Ay
Case 1 Max_date=31
Case 2
Dim Artik as Integer
Artik = Yil Mod 4
If Artik=0 Then
Max_date=29
Else
Max_date=28
Endif
Case 3
Max_date=31
Case 12
Max_date=31
Case Else
Mesaj="Error : Bir yilda 12 ay vardir."
End Select

__________________________________________________ _____________________________________
VB DE KES,KOPYALA,YAPIŞTIR..

Kes, Kopyala, Yapıştır
Bir TextBox'ta Kes, Kopyala, Yapıştır, Geri Al işlemlerinin yapılması için iki tane çok kolay yol mevcut. Aşağıdaki örnekler SendKeys methodunu kullanıyor.
İşte birinci örnek:
Sub DoEditThing(whatThing As String, onWhat As Object)
Select Case whatThing
Case "Copy"
onWhat.SetFocus
SendKeys "^C"
Case "Cut"
onWhat.SetFocus
SendKeys "^X"
Case "Paste"
onWhat.SetFocus
SendKeys "^V"
Case "Undo"
onWhat.SetFocus
SendKeys "^Z"
End Select
End Sub
Aşağıdaki kod aynı işi yapan ikinci örnek:
Sub DoEditThing(whatThing As String, onWhat As Object)
Dim Send$
Select Case whatThing
Case "Copy"
Send = "^C"
Case "Cut"
Send = "^X"
Case "Paste"
Send = "^V"
Case "Undo"
Send = "^Z"
End Select
If Len(Send) Then
onWhat.SetFocus
SendKeys Send
End If
End Sub
Şimdi, yukarıdaki iki örnekten birini formunuza ekledikten sonra aşağıdaki kod satırıyla istediğiniz işlemi yapabilirsiniz.
DoEditThing Copy|Cut|Paste|Undo*, On_Which_Object**
* - Bir tanesini seçin; Copy, Cut, Paste veya Undo
** - TextBox'ı seçin; (ör. Text1)
System Dizinini Bulmak
Örneğin INI dosyalarını kullanan bir uygulama yazdığınızda, çoğunlukla \System dizinine ihtiyaç duyarsınız. Genellikle bu dizinin yolu "C:\Windows\System\" şeklindedir.
1. Fakat bazı kullanıcılar windows'u farklı sürücü veya dizine kurabilirler. Ve işte bu sorunu çözmek için kullanacağınız kod aşağıda.
Bu kodu bir Module'nin declarations section kısmına kopyalayın:
Declare Function GetSystemDirectory Lib "Kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Function VBSysDir() As String
Dim Gwdvar As String, Gwdvar_Length As Integer
Gwdvar = Space(255)
Gwdvar_Length = GetSystemDirectory(Gwdvar, 255)
VBSysDir = Left(Gwdvar, Gwdvar_Length)
End Function
Daha sonra aşağıdaki kodu kullanarak \System dizininin yolunu bulabilirsiniz:
MsgBox VBSysDir & " is the System Directory",

__________________________________________________ __________________________________________________ ______________________
10 AFFEDİLMEZ PROGRAMCI HATASI...

1.option explicit ifadesini kullanmamak. (option explicit bas modülü içine ilk satira yazilir ve program içindeki tüm degiskenlerin birer birer tanimlanmasini sart kosar. Programci örnek olarak Dim sozcuk As String ifadesi ile sozcuk degiskenini programa tanitmadan bu degiskeni kullanamaz.)

2.Tüm degiskenler ve fonksiyonlar için gereken veri türlerini deklere etmemek.
Özellikle gerekli olan veri türünü deklere etmezseniz tüm türleri içine alan VARIANT
deklere etmis olursunuz ki VARIANT veri türü 32 byte yer kaplar.

3. Okunmasi zor kodlar yazmak. (okuyacak kisi bir insan degil derleyicidir.)
2 yada 3 ekrandan fazla prosedür yazmak. (Sub ... End Sub)
Kurallara yada adlandirma ilkelerine uymayan degisken, nesne yada prosedür tanimlamak.
VB'nin tekelinde olan degisken yada nesne adlarini kullanmaya çalismak.

4. Normalde kullanicinin girmesi gereken degerleri kod içine sabit degerler halinde yazmak (hard-coding). Bunlar bazi sayilar yada dosya yada dizin adlari olabilir. Örnek: Her kullanici Windows'unu WINDOWS adli dizine kurmak zorunda degildir (Bu bazen WIN bazen WIN98 vs olabilir)
Programinizi yazarken Windows dizininin adini kendi bilgisayarinizdaki gibi düsünmeyin...

5. Kullanicinin ihtiyaçlarina gereken özeni göstermemek.
Programlama sayginligina uygun dil kullanmamak. (Siz yerine Sen hitap sözcügü kullanimi gibi). Kullaniciya ters gelebilecek hata mesajlari vermek.
Form tasarlarken kullanim kolayligini düsünmemek.
Kontrollerin göze hos gelmeyecek yerlesimi
Standart Windows tasarimina uymamak. (Menü tasarimi, kontrol butonlarinin genelde yukarida olmasi, ALT-F4 ile programin kapatilmasi, Ctrl-O dosya açmak, Ctrl-P yazdirmak vs için kullanilmasi) Bu standartlar zaten Windows kullanan kisilere kullanimi kolay programlar üretmenize neden olacaktir. Ve dikkat ederseniz birçok program bu standartlari takip eder, siz de etmelisiniz.

6. Hata yapmasi kolay kodlar yazmak.
Yeterli hata kontrolleri yazmamak
Kullanicinin yapmasi muhtemel hatalari öngörememek ve olusmasi halinde bunlari giderememek

7. Tekrar kulanilabilecek kodlar yazmamak. Yazdiginiz ani kurtaracak gelisigüzel kodlar yazmak yapmamaniz gereken önemli kurallardan biridir, çünkü ileride benzer kod bloklarina ihtiyaciniz olacaktir ve yeri geldiginde o kod blogunun ne ise yaradigini anlayabilmeniz gerekir.
Basit kodlarla yapilabilecek isler için kontroller, kütüphaneler veya ActiveX kontroller kullanmak ta bir hatadir. Bu tarz kod yazma gereksiz büyüklük meydana getirir. Her dll yada ocx kontrolu setup disketinize ekstra yük demektir.
Alisilmis isler için farkli arabirimler tasarlamak.


8. Yetersiz dökümantasyon.
Gerekli açiklamalari kodlar arasina yazmamak

9. Veri türlerinin uygunsuz kullanmak.
Dizileri gerekli büyüklüklerde üretmemek.
Degiskenlerin geçerlilik alanlarini gereginden fazla genis tutmak. Örnek olarak sadece tek bir fonksiyon içinde kullanilan bir degiskeni Public olarak deklere etmek programin çalismasi boyunca bellekte kalacagi için gereksiz yer isgal edecektir.

10. Diger programcilardan çaba göstermeksizin faydalanmak yada gereken yerde yardim istememek.
Baskalarinin ürettiklerini kendinizinmis gibi göstermek

"Kardeşim sen düşünceden ibaretsin. Geriye kalan et ve kemiksin. Gül düşünür gülistan olursun. Diken düşünür dikenlik olursun."
  Alıntı ile Cevapla
Eski 29-11-06, 13:34 Çevrimdışı   #2
Profesör
Sanatkârlar grubu
 
Hewall - ait Avatar
Genel Mesajlar: 4.098
Teşekkür etti: 1.016
Teşekkür edildi: 1.056
RepForum Gücü: 42
Forum Puanı:11433
Hewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmışHewall Rep olayını aşmış
1. Ders: 'Print, Color, Locate, Print Using, Lprint, REM'
Qbasic programımızı açtık. Ve artık kodları yazmaya başlayabiliriz. Bundan önce Qbasic dizinindeki bazı programları ne anlama geldiğiniz anlatalım:


Bunlardan QBASIC.EXE ya da QB.EXE adıyla bilinen dosya program dosyamızdır. Buna tıklayarak compiler programımızı çalıştırırız. BC.EXE programı OBJE dosyanın yaratımı için ve LINK.EXE ise bunun EXE formatına dönüştürülmesi için gerekli programlar. Qbasic 4.5 ve 7.1'de program menülerinden bu işi yapabilirsiniz. Yalnız Qbasic 1.1 kullanıyorsanız mutlaka bu dosyaları COMMAND.COM komut satırında ilgili bas dosyayı yazarak EXE dosyasına çevirmelidir.

2. Ders: 'Değişkenler ve Kullanımları'
Her programlama dili değişkenlere sahiptir. Bunlar sayısal ya da alfasayısal değerler olabilir. Bu değerlerle ilgili işlemler yapmak için ilk önce bunları tanıyalım.. Tabloyu inceleyin..


Değişken Türü Boyut Aralık
INTEGER (%) 2 bayt -32,768 ile 32,767
LONG INTEGER (&) 4 bayt -2147483648 ile 2147483647
SINGLE (!) 4 bayt 7 haneli..
DOUBLE (#) 8 bayt 15 haneli..
STRING ($) 1-32767 bayt Karakterler (Max. 32767)

Değişken A-Z ile başlamak şartı ile (ve Türkçe karakterler kabul edilmiyor) Harf ve sayılardan oluşabilir. Her değişken en az bir değer belirtir. Bahsettiğimiz rakamlarla oluşanlar INTEGER, LONG INTEGER, SINGLE ve DOUBLE'dir. Eğer harf, kelime ve cümlelerden oluşan alfasayısal değerler kullanacaksak STRING türü değişkenler kullanırız. Bunlar tırnak işareti arasına alınarak yazılır.


~ Kodlar ~
Degisken1% = 123
Degisken2# = 14411
Degisken3$ = "Murat"

Bunlar ile işlem yapmaya geçmeden önce bunların Print ile kullanımından konuşalım. Aşağıda bununla ilgili bir örnek var..


~ Kodlar ~
Cevap% = 4 + 2
PRINT "4 + 2 ="; Cevap%

~ Görünüşü ~
4 + 2 = 6



Yukarıdaki örnekte Cevap% değişkeninin 4 ile 2'nin toplamından ortaya çıkan sonuç olacağını söyledik. Bunu yazdırdık. PHP ile bir benzetme yapmayın çünkü burada Print "4 + 2 = Cevap%" şeklinde tırnak içinde yazamayız. Bilgisayar her tırnak işaretli değişkeni STRING görmektedir. Aşağıda bir string değerinin PRINT'te kullanımı var.


~ Kodlar ~
TamAd$ = "Murat Elic."
PRINT TamAd$

~ Görünüşü ~
Murat Elic.



Bize programın getirdiği bir kolaylıkta değişken sonundaki %, #, ! gibi belirteçlerden birini kullanmamamızı sağlayabiliriz. Normalde işaretsiz olan değişkenler INTEGER(Sayısal) değerlerdir. Siz bu durumu DEFINT (İşaretsizler Integer), DEFSNG (İşaretsizler Single), DEFSTR (İşaretsizler String) gibi kodları programın başında kullanarak değiştirebilirsiniz. Aşağıdaki INTEGER örneğinde %'nin kullanılmadığına dikkat edin. (Kimisinde % var, kimisinde yok diye sakın şaşırmayın. DEFDBL, DEFLNG, DEFSTR, DEFSNG kullanmadıysanız hiçbirşey farketmez..)


~ Kodlar ~
Not1 = 60
Not2 = 40
OrtNot = (Not1 + Not2) / 2
PRINT OrtNot

~ Görünüşü ~
50



Gelelim şimdi işlem yapmaya. İlk önce sayısal değerler ile ilgili işlemler nasıl yapılır bundan bahsedelim. Sanki matematik işlemi yaparmış gibi düşünebilirsiniz. Parantez öncelikli, sonra çarpım ve bölüm ve en son toplama çıkarma işlemleri. Buna göre aşağıdaki örneği inceleyin.


~ Kodlar ~
d1 = 10: d2 = 20: d3 = 30: d4 = 40
dtop = (d1 * d3) + d2 * d3 / d1 * (d4 - d1)
PRINT dtop

~ Görünüşü ~
3



String (Alfasayısal) değerlerde birbirleriyle toplanabilmektedir. Nasıl olur? demeyin oluyor işte.. Aşağıda bununla ilgili bir örnek var.


~ Kodlar ~
Ad$ = "Murat"
Soyad$ = "Eliçalışkan"
TamAd$ = Ad$ + Space$(1) + Soyad$
PRINT TamAd$

~ Görünüşü ~
Murat Eliçalışkan

3. Ders: 'Değişken İşlemlerinde Kullandığımız Fonksiyonlar'
Şimdi Bu işlemler sırasında yararlanabileceğiniz bazı Fonksiyonları tanıyalım. Fonksiyonlar programın içinde varolan ve işinizi kolaylaştıran işlemlerin yapılmasıdır. Bir fonksiyon içinde diğer fonksiyonları kullanabilirsiniz. Başlangıç noktası en içte olandır.. Aşağıda bazı önemli fonksiyonları inceledim.


VAL() Fonksiyonu
Bu fonksiyon bize bir String (Alfasayısal) değeri, sayısal değere dönüştürmeyi sağlar. Aşağıdaki örneği inceleyin..


~ Kodlar ~
Deger$ = "41a41bc6a1"
Donusum% = Val(Deger$)
PRINT Donusum%

~ Görünüşü ~
41



STR$() Fonksiyonu
Bu fonksiyon ise tam tersi sayısal bir değeri alfasayısal (STRING) değere dönüştürür. Örneği inceleyin. Sonuç sayısal bir değer çıkmış gibi görünüyor değil mi? Aslında bu bir alfasayısal değerdir.


~ Kodlar ~
Deger% = 14412
Print Donusum$ = Str$(Deger%)
PRINT Donusum$

~ Görünüşü ~
14412



INT() Fonksiyonu
Sayısal bir değerin sadece tam sayı kısmını almak istiyorsanız bunu kullanın.


~ Kodlar ~
Deger = 14.311
PRINT INT(Deger)

~ Görünüşü ~
14



SQR() Fonksiyonu
Bir sayısal değerin karekökünü verir.


~ Kodlar ~
PRINT SQR(9)

~ Görünüşü ~
3



ABS() Fonksiyonu
Bir sayısal değerin mutlak değerini gösterir.


~ Kodlar ~
PRINT ABS(-14)

~ Görünüşü ~
14



LEFT$() Fonksiyonu
Bir String değerinin soldan istediğimiz karakterlerini almamızı sağlar. Fonksiyonda ilgili değişkenden sonra virgül (,) koyarak yazdığımız sayı kaçıncı karaktere kadar alınacağıdır.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT LEFT$(Deger$, 5)

~ Görünüşü ~
Murat



RIGHT$() Fonksiyonu
Bir String değerinin bu kez sağdan istediğimiz karakterlerini almamızı sağlar.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT RIGHT$(Deger$, 12)

~ Görünüşü ~
yemek yiyor.



MID$() Fonksiyonu
Sağdan ve Soldan almayı öğrendik. Bu fonksiyon bize bu iki fonksiyonun görevini yapacağı gibi RIGHT$() ve LEFT$()'dan daha geniş bir fonksiyondur. Öncekilerdeki gibi ilgili değişkenden sonra virgül konarak bir değil iki sayı girilir. Bunlardan ilki kaçıncı karakterde başlayacağı, ikincisi ise kaç karakter sağa gidileceğidir. Örnek size yardımcı olacaktır.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT RIGHT$(Deger$, 6, 5)

~ Görünüşü ~
yemek


Öğrenmemiz gereken en önemli kodlar biri PRINT. Bu ekrana yazı yazdırma işlemi için kullanılır. PRINT'ten sonra tırnak işaretleri arasına değer yazılır.


~ Kodlar ~
PRINT "Merhaba"

~ Görünüşü ~
Merhaba



Araya koyacağınız Noktalı virgül ( iki kelime ya da cümleyi bağlamak için kullanılır. Boşluklar için, boşluk belirtebileceğiniz gibi SPACE$(i), SPC(i) ya da TAB(i) komutlarını da kullanabilirsiniz. Ne kadar boşluk verecekseniz parantez içine o sayıyı yazıyorsunuz.


~ Kodlar ~
PRINT "Merhaba"; SPACE$(1); "Arkadaşlar"

~ Görünüşü ~
Merhaba Arkadaşlar



Yazıların rengini COLOR komutu ile belirleriz. Bu renkler ekranın max. renk sayısına göre 0-16, 0-255, 0-1 arasında değişebilir..


~ Kodlar ~
COLOR 14
PRINT "Renk 14'te Bir Yazı.."

~ Görünüşü ~
Renk 14'te Bir Yazı..



Not: Dilerseniz kodlar arasında satır atlamak yerine aralarına iki nokta üstüste ( koyarak yan yana yazabilirsiniz. Fakat bu durum bazı durumlarda geçersizdir.


~ Kodlar ~
COLOR 14: PRINT "Renk 14'te Bir Yazı.."

~ Görünüşü ~
Renk 14'te Bir Yazı..



Yazıların yerleştirileceği yer de belirlenebilir. Bunun için LOCATE komutunu kullanmaktayız. Ekranın boyutuna göre satır ve sütun olarak verilen değerlerin olduğu alana yazının yerleştirilmesidir.


~ Kodlar ~
LOCATE 3, 1: PRINT "Başlanan Yer Satır 3 ve Sütun 1.."

~ Görünüşü ~


Başlanan Yer Satır 3 ve Sütun 1..



TAB Boşluklarını PRINT'te kullanmanız için virgül (,) sizlere yardımcı olacaktır. İki kelime ya da cümle arasında kullanacağınız virgül sonraki sekmeden başla anlamı taşır.


~ Kodlar ~
PRINT "ADI:", "MURAT"
PRINT "YAŞ:", "19"

~ Görünüşü ~
ADI: MURAT
YAŞ: 19



PRINT USING ise bu kodu sınırlamak ya da tablolarda kullanmak için yararlanılan bir komuttur.. Aşağıdaki örneği incelerseniz değerimiz 153.25233 olmasına karşın gösterilen ondalık kesmin iki sayısıdır. PRINT USING'te kullanılan karakterlerden önemli olanlar # (Sayısal Değer), ! (Sadece Baş Harfi - Alfa Sayısal), / / (Uzunluğu arttırılabilir, Alfasayısal boşluk..) (Bknz. Qbasic 7.1 Yardım Dosyası)


~ Kodlar ~
PRINT USING "###.##"; 153.25233

~ Görünüşü ~
153.25



LPRINT komutu yazıcıdan yazıyı çıkarmanız için gerekli bir komut. Aşağıdaki şekilde programı çalıştırırsanız yazıcınız açık ise yazı kağıda aktarılmaya başlanacaktır.


~ Kodlar ~
LPRINT "Bu yazi yazicidan cikacak.."



LPRINT'te en çok karşılaştığım soru farklı yazı tipleri kullanamaz mıyım? Tabi ki kullanabilirsiniz. Bunun için yazıcınızın MS-Dos uyumlu olması gerekmektedir. Yoksa standart olan yazı ile çıkarılacaktır. Kendi FONT (yazı tipleri) dosyalarınızı yaratarak da farklı yazı tipleri kullanabilirsiniz. (Yazıcı için)


~ Kodlar ~
PRINT "Merhaba" 'buraya açıklama yazabiliriz..



~ Kodlar ~
REM Veya buraya da açıklamalar yazabiliriz..



Gelişmiş dos programlarını Turbo Pascal kullanarak yapabilirsiniz. Bu C/C++ dilini kullandırmaktadır. Yoksa Qbasic günümüzde sadece oyun yapımında ya da Basic'e başlangıçta temel bilgilerin alınmasında kullanılmaktadır.


Varsayalım program yaratıyorsunuz ve kaynak kodunuza açıklama eklemeniz gerekiyor. Bu durumda REM komutunu ya da Üst ayracı (') kullanabilirsiniz. Bu ekranda görüntülenmeyecektir.


Ders 1. Burada bitti. Bu derste PRINT, COLOR, LOCATE, PRINT USING, LPRINT ve REM'i inceledik.

3. Ders: 'Değişken İşlemlerinde Kullandığımız Fonksiyonlar'
Şimdi Bu işlemler sırasında yararlanabileceğiniz bazı Fonksiyonları tanıyalım. Fonksiyonlar programın içinde varolan ve işinizi kolaylaştıran işlemlerin yapılmasıdır. Bir fonksiyon içinde diğer fonksiyonları kullanabilirsiniz. Başlangıç noktası en içte olandır.. Aşağıda bazı önemli fonksiyonları inceledim.


VAL() Fonksiyonu
Bu fonksiyon bize bir String (Alfasayısal) değeri, sayısal değere dönüştürmeyi sağlar. Aşağıdaki örneği inceleyin..


~ Kodlar ~
Deger$ = "41a41bc6a1"
Donusum% = Val(Deger$)
PRINT Donusum%

~ Görünüşü ~
41



STR$() Fonksiyonu
Bu fonksiyon ise tam tersi sayısal bir değeri alfasayısal (STRING) değere dönüştürür. Örneği inceleyin. Sonuç sayısal bir değer çıkmış gibi görünüyor değil mi? Aslında bu bir alfasayısal değerdir.


~ Kodlar ~
Deger% = 14412
Print Donusum$ = Str$(Deger%)
PRINT Donusum$

~ Görünüşü ~
14412



INT() Fonksiyonu
Sayısal bir değerin sadece tam sayı kısmını almak istiyorsanız bunu kullanın.


~ Kodlar ~
Deger = 14.311
PRINT INT(Deger)

~ Görünüşü ~
14



SQR() Fonksiyonu
Bir sayısal değerin karekökünü verir.


~ Kodlar ~
PRINT SQR(9)

~ Görünüşü ~
3



ABS() Fonksiyonu
Bir sayısal değerin mutlak değerini gösterir.


~ Kodlar ~
PRINT ABS(-14)

~ Görünüşü ~
14



LEFT$() Fonksiyonu
Bir String değerinin soldan istediğimiz karakterlerini almamızı sağlar. Fonksiyonda ilgili değişkenden sonra virgül (,) koyarak yazdığımız sayı kaçıncı karaktere kadar alınacağıdır.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT LEFT$(Deger$, 5)

~ Görünüşü ~
Murat



RIGHT$() Fonksiyonu
Bir String değerinin bu kez sağdan istediğimiz karakterlerini almamızı sağlar.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT RIGHT$(Deger$, 12)

~ Görünüşü ~
yemek yiyor.



MID$() Fonksiyonu
Sağdan ve Soldan almayı öğrendik. Bu fonksiyon bize bu iki fonksiyonun görevini yapacağı gibi RIGHT$() ve LEFT$()'dan daha geniş bir fonksiyondur. Öncekilerdeki gibi ilgili değişkenden sonra virgül konarak bir değil iki sayı girilir. Bunlardan ilki kaçıncı karakterde başlayacağı, ikincisi ise kaç karakter sağa gidileceğidir. Örnek size yardımcı olacaktır.


~ Kodlar ~
Deger$ = "Murat yemek yiyor."
PRINT RIGHT$(Deger$, 6, 5)

~ Görünüşü ~
yemek


4. Ders: 'Formların Kullanımı'
Kullanıcıdan bilgi almak, bilgileri karşılaştırmak ve sonuçlara göre yapacağı işlevleri belirlemek bu derste öğreneceklerimiz.


INPUT
Kullanıcıdan bilgi almak için INPUT komutunu kullanırız. Burada kullanıcının girdiği bilgi, değişkenimize aktarılmaktadır. Örneği inceleyin..


~ Kodlar ~
INPUT "Yaşınız Kaç? "; Yas%

~ Görünüşü ~
Yaşınız Kaç? ?



Kalemimiz(İmleç) yazının hemen sonunda bulunmakta. Bunları diğer değişkenlerle hizalamak için (,) kullanabiliriz (Aynı Print'te olduğu gibi).
Dikkat edilirse INPUT'dan sonra isteğin belirtildiği tırnak işaretlerinden sonra bir değişken geliyor. Burada sayısal değerler için INTEGER, alfasayısal değerler için STRING ($) kullanılmalıdır. Eğer sayısal bir değer isteniyor fakat alfasayısal değer giriliyorsa aşağıdaki hatayı verir ve sizden tekrar değer girmenizi ister.


~ Görünüşü ~
REDO FROM START ?



INPUT için isteneni bu komutun içinde belirtmeyebilir ve INPUT "", Degisken şeklinde kullanabilir ve isteneni kendiniz belirtebilirsiniz. Aynı zamanda LOCATE, COLOR gibi kodlarda INPUT'dan önce kullanılarak INPUT mesajını şekillendirebilirsiniz. Örneğin:


~ Kodlar ~
COLOR 10: LOCATE 2, 3
INPUT "Bir Sayı Girin:"; Deger

~ Görünüşü ~

Bir Sayı Girin: ?



INPUT$() Fonksiyonu
Bu komut, değişken için kullanıcıdan istediğiniz karakter sayısınca bilgi almanızı sağlar. Parantez içine kaç karakter istendiği yazılır.


~ Kodlar ~
A$ = INPUT$(1)



Bu kullanıcıyı bekletmek için kullanılan bir yol olarak da bilinir. Böylece bilgi ekranı kapanmayacak ve kullanıcının herhangi bir tuşa basması istenecektir. Örnek bir Kullanım kullanıcıdan E veya H harflerinden birisine basmanız durumunda yapacaklarının belirtilmesidir. Bunun için IF..THEN ile DO..LOOP ve FOR.. döngülerini anlatmamız gerekiyor. Aşağıdan itibaren bu konuları bulabilirsiniz.


Etiketler
Normalde okullarda ve üniversitelerde, qbasic kitaplarında her satır bir sayı ile isimlendirilir. Ve aşağıdaki şekilde uzar gider..


~ Kodlar ~
10 SCREEN 13
20 RANDOMIZE TIMER
30 END



Bu şekilde yapılması işin bilimsel yanı da olsa, sizlere kolaylık olması açısından bu yolu değil etiketleri adlandırdığınız ve bunun dışında sayılardan oluşmayan daha kolay bir etiket yönetimi öğretmek istiyoruz.


~ Kodlar ~
SCREEN 13
RANDOMIZE TIMER
Baslat:
END



GOTO Etiket
Anlamı gitmek olan bu komut programı belirtilmiş bir etikete yönlendirmek için kullanılır. Aşağıda GOTO Bitir dediğimizden itibaren bilgisayar etikete gider ve aşağıdaki satırları okumaz.


~ Kodlar ~
Baslat:
GOTO Bitir
Print "Merhaba!"
Bitir:
END

~ Görünüşü ~




IF ... THEN (... ELSE)
Değişkenlerin durumları istediğimiz gibi ise, sayısal değer bakımından büyük, küçük ya da eşitse veya tam tersi ise gerçekleşmesi gerekenleri belirttiğimiz EĞER ... İSE anlamına gelen komuttur. Burada kullanılan operatörler aşağıda tablolanmıştır.


Operatör Boyut Aralık
= Eşitse
> Büyükse
< Küçükse
<= Küçükse ya da eşitse
=> Büyükse ya da eşitse
<> Eşit değilse
AND .. ve ..
OR .. veya ..
XOR .. biri doğru biri yanlışsa ..



Önermenin gerçekleşmesi için birden fazla şart olmalıysa VE anlamına gelen AND, ikisinden biri olmalıysa VEYA anlamına gelen OR kullanılır. ELSE ise önerme yanlış ise gerçekleşecek olaydır. Ayrıca bir de XOR var, bu önermelerden ikiside doğru veya ikiside yanlışsa önermenin geçersiz olduğunu, bir yanlış bir doğru ise geçerli olduğunu anlatır. Aşağıda bir örnek var. Örnekteki temel şart A'nın 14 ve B'nin 10 olmasıdır (Bunu verdiğimiz değerlerle sağladık). İkisinden biri bu kurala uymazsa Baslat etiketine yönlendiriliyor..


~ Kodlar ~
Baslat:
A = 14: B = 10
IF A = 14 AND B = 10 THEN GOTO Bitir ELSE GOTO Baslat
Bitir:
END



Aşağıdaki örnek ise bir 'VEYA' örneği. Burada B değerini değiştirdik ve kriterlerden birini bozduk. Buna rağmen önerme geçerli olacaktır. Çünkü bizden ikisinden birinin istenilen olmasını istiyor. Ve A değeri bunu sağlıyor..


~ Kodlar ~
Baslat:
A = 14: B = 14
IF A = 14 OR B = 10 THEN GOTO Bitir ELSE GOTO Baslat
Bitir:
END



Aşağıda daha kompleks bir örnek var. THEN belli bir noktada bitiyor. Bilgisayara THEN'in sonunu END IF ile anlatıyoruz. Aşağıdaki programda asıl mantık C'nin istenenden fazla ya da az olması durumunda bu sayıdan 1 eksilterek ya da arttırarak eşitleme ve eşitledikten sonra programı bitirmek. Dikkat ederseniz bu IF içinde IF kullanımına bir örnek oluyor aynı zamanda. Yalnız bunların yerleştirilmesine çok dikkat etmelisiniz. Bu aynı Ana yollar ile Tali yollar arasındaki fark gibi olmalı.


~ Kodlar ~
A = 10: B = 14: C = 15
Baslat:
IF (A = 14 OR B = 10) AND C = 5 THEN
GOTO Bitir
ELSE
IF C < 5 THEN C = C + 1 ELSE C = C - 1
GOTO Baslat
END IF
Bitir:
END



INPUT$() fonksiyonunda Evet ve Hayır'ı kullanmaktan bahsetmiştik, şimdi uygulama zamanı: Örnekte E harfine basmadığınız sürece programda kalıyorsunuz.


~ Kodlar ~
Baslat:
Print "Programı Kapatacak mısınız? (E/H)"
Cevap$ = INPUT$(1)
IF Cevap$ = "E" or Cevap$ = "e" THEN GOTO Bitir ELSE Goto Baslat
Bitir:
END



Dilerim konuyu iyi anlatabilmişimdir. Çünkü bu IF .. THEN çok yerde kullanılır (özellikle oyun yapımında).. Daha sonra tekrar IF .. THEN komutuna döneceğiz.


FOR .. NEXT
Belirtilen aralıklarda bir değeri değiştirerek kodların tekrarını sağlar. Bir işlevi, defalarca uygulamanın en güzel yolu. Bilgisayar FOR görünce, FOR'dan sonraki değişkenin değerini 1 TO 3 için konuşursak 1, 2, 3 şeklinde değiştirir ve uygulamaya devam eder.


~ Kodlar ~
FOR i = 1 to 5
PRINT i
NEXT i

~ Görünüşü ~
1
2
3
4
5



FOR degisken 0 to 100 STEP 2 şeklinde kullanırsak, bilgisayar 2'şer atlayarak değişkeni değiştirecektir. Bu durumda 'degisken' değeri 0,2,4,6...98,100 şeklinde gidecektir. Bu komut özellikle ARRAY(dizi) değişkenlerinde büyük kolaylık sağlar.


DO .. LOOP
DO .. LOOP, For'dan daha farklıdır. DO ile LOOP arasında aksi belirtilmediği sürece sürekli gider. Aşağıdaki örnek çalıştırılırsa eğer sayıların bir artarak ekranda aktığı görülür ve bu herhangi bir tuş ile durdurulmaz. Ama Qbasic'in CTRL + PAUSE tuşunu kullanarak kodlar bölümüne geri dönebilirsiniz.


~ Kodlar ~
DO
a = a + 1
PRINT a
LOOP

~ Görünüşü ~
1
2
3
4
5
... (Sonsuza Kadar Gider)



Yukardaki örnek sadece işlevini anlatmak içindi. Tabi DO..LOOP arasına birçok kod gelebilir ve bunlar IF .. THEN ile belirtilmiş olabilir. Aşağıdaki örnekte 3. döngüden sonra a, 3 değerini alacak ve EXIT DO ile DO'dan çıkıp LOOP'un altına geçecektir.


~ Kodlar ~
DO
a = a + 1
IF a = 5 THEN EXIT DO
PRINT a
LOOP

~ Görünüşü ~
1
2
3
4
5



Bu işlemi DO UNTIL ya da LOOP UNTIL kullanarak yapabiliriz. Bu 'olana kadar' anlamı taşımaktadır. Aşağıdaki örnek yukardakinin UNTIL kullanılmış şeklidir. A, 5 değerini alınca yine DO-LOOP'dan çıkılır.


~ Kodlar ~
DO UNTIL a = 5
a = a + 1
PRINT a
LOOP

~ Görünüşü ~
1
2
3
4
5



Başlangıçta daha çok kullanılan kodlara yer veriyorum, WHILE'de bir döngüdür. Tek farkı bu kez Doğru, Yanlış'ın kullanıldığı bir döngü olması. Ders 4. Burada bitti, hoşçakalın!!!


5. Ders: 'Grafik Kullanımı'
Şimdiye kadar biraz karışık şeyler öğrendik, hepsi de programlamanın özüydü. Şimdi biraz süsüyle ilgilenelim, daha sonra tekrar o konulara döneceğiz..


SCREEN
Ekran çözünürlüğünü ayarlamak için kullanılır. En çok bilinenler:


'SCREEN 0': Standart, grafik kullanılamaz. 80x25 vea 40x25 yazı aralığındadır.
'SCREEN 7': 320x200 grafik ve 16 renkli ekran..
'SCREEN 8': 640x480 grafik ve 16 renkli ekran..
'SCREEN 9': 640x480 grafik ve 2 renkli ekran..
'SCREEN 10': 640x480 grafik ve 4 renkli ekran..
'SCREEN 11': 640x480 grafik ve 2 renkli ekran..
'SCREEN 12': 640x480 grafik ve 16 renkli ekran..
'SCREEN 1-2-13': 320x200 grafik ve 256 renkli ekran..
'SCREEN 3'ten 6'ya': Bu bazı özel durumlarda çalışır, genelde kullanılmaz..


Ayrıca WIDTH komutu da ekran çözünürlüğü ayarlamayla ilgilidir. Satır ve Sütun Sayısı mutlaka belirtilir. Aşağıdakini yazın, Qbasic'i 800x600'e yakın kullanmak için ideal...


~ Kodlar ~
WIDTH 80, 50



CLS
Clear Screen'den türetilen bu kod, gerçekte de ekranı temizlemek görevindedir.


COLOR
Renkler, ekran tipine göre değişir. Oyunlarda daha çok SCREEN 13 kullanılır. Bunun nedeni daha fazla renk içermesidir. Aşağıda standart palete göre 16 renk belirtilmiştir.


'COLOR 0': Arkaplanın rengi
'COLOR 1': Mavi
'COLOR 2': Yeşil
'COLOR 3': Deniz Mavisi
'COLOR 4': Kırmızı
'COLOR 5': Pembe
'COLOR 6': Turuncu
'COLOR 7': Gri
'COLOR 8': Koyu Gri
'COLOR 9': Açık Mavi
'COLOR 10': Açık Yeşil
'COLOR 11': Açık Deniz Mavisi
'COLOR 12': Açık Kırmızı
'COLOR 13': Açık Pembe
'COLOR 14': Açık Sarı
'COLOR 15': Beyaz


Ekran tipine göre değişir diyoruz, gerçekten öyle. Hatta bazı ekranlarda yanıp sönen, arka planlı filan birçok şekilde kullanabilirsiniz. Bu özet niteliğinde bir ders olduğu için bu konulara sonra deyinmek doğru olacaktır.


LINE
Doğru, Kare ve dikdörtgenler çizimi için kullanılan koddur. Ekran biliyorsunuz, pixellerden oluşmuştur. 800x600, 1024x768, 640x480.. bunlar belli bir alanı ifade eder. Qbasic ekranında da bu alanları kullanıyorsunuz.


Screen 13'te ekran 320x200. Buna göre aşağıdaki kod ile başlangıç noktası 0,0 ve bitiş noktası 10,10 olan bir çizgi çiziyoruz. Ve bu kuzeybatı, güneydoğu yönündeki çizginin renginin 15(Beyaz) olmasını istiyoruz. Öyleyse şunu yazarız:


~ Kodlar ~
LINE (0, 0)-(10, 10), 15



Eğer bunun yine aynı noktalar arasında bir kare olmasını istersek renkten sonra virgül (,) koyarak B, içi dolu bir kare olmasını istiyorsak BF yazıyoruz. (14 ve 11, renkler)


~ Kodlar ~
LINE (0, 0)-(10, 10), 14, B

~ Kodlar ~
LINE (0, 0)-(10, 10), 11, BF



CIRCLE
Daire çiziminde ise CIRCLE kullanılır. Bu kodun kullanımı merkez noktanın ve yarıçap uzunluğunun belirtilmesi iledir. Tabi rengi unutmayın, onu da en sona ekliyoruz.


~ Kodlar ~
CIRCLE (100, 100), 10, 5

CIRCLE ile elips, yarım daire vs. gibi bir çok eğri çizebiliriz. Bunları ayrıntılı olarak sonra görecez. Yalnız Circle ile çok kullanılan PAINT komutuna deyinmeden olmaz. Bu dairenin içini doldurur. (Çemberi çizdiğiniz yer ve renk aynı olmalı).. Böylece içi dolu bir daire elde ederiz.


~ Kodlar ~
CIRCLE (100, 100), 10, 5
PAINT (100, 100), 5

PSET
Belirtilen noktayı istediğiniz bir renk ile boyar.


~ Kodlar ~
PSET (44, 11), 12





6. Ders: 'Dosyaları Kullanmak'
Bu derste programın bir dosyaya yazılar yazmasını, dosyadan bilgi almasını ve dosya yönetimi ile ilgili bazı komutları inceleyeceğiz.


OPEN
Dosya açmak için kullanılır. Kullanımının iki şekli vardır. En kolayı OPEN DosyaAdi FOR [BINARY/INPUT/OUTPUT/APPEND] AS DosyaNum şeklinde olandır. Burada BINARY dosyayı ikili açıp bilgileri almak ve vermek, OUTPUT dosyanın içine en baştan yazmak, INPUT dosyadan bilgi almak ve APPEND dosyanın içindeki bilgiye bilgi eklemek için kullanılır. Dosya Numarası ise # ile ifade edilir ve buraya herhangi bir sayı gelir (Önerilen #1 şeklinde kullanımı). Örneğin:


~ Kodlar ~
OPEN "Skorlar.txt" FOR INPUT AS #1
CLOSE



OPEN ile dosyayı açar, çeşitli kodlar kullanarak bilgiler alır veya yazar ve sonra CLOSE ile kapatırız. İşlerin sırası bu şekildedir.


OPEN komutu içinde PRINT #1 DosyaNum, INPUT #1 DosyaNum, GET #1 DosyaNum ve PUT #1 DosyaNum şeklinde kodlar kullanılır. Bunlar dosyayı açtıktan sonra yapacaklarımız içindir. Şimdi bunları tanıyalım.


PRINT #1
OUTPUT: Belirtilen dosya varolsa bile, ve içinde bilgiler olsa bile bu mod ile o dosya tamamen silinir ve verilen bilgiler yerleştirilir. Yani dosyayı baştan yaratmak gibidir.


~ Kodlar ~
OPEN "Okubeni.txt" FOR OUTPUT AS #1
PRINT #1, "Bu yaratılan dosyaya yazılacak!"
CLOSE



APPEND: Bu modun kullanılması ile verilen bilgiler dosyaya yine yazılacak ve içine eklenecektir. Bu komut ile birlikte dosyanın en sonuna verilen bilgi yerleştirilir.


~ Kodlar ~
OPEN "Okubeni.txt" FOR APPEND AS #1
PRINT #1, "Dosyaya eklenen bilgiler.."
CLOSE



INPUT #1
INPUT: Mod olarak INPUT'u seçerseniz bilgisayar dosyadan bilgi almak istediğinizi anlayacaktır. Ve sadece dosyayı okuma amaçlı olarak dosya açılır içinden değişken olarak belirttiğiniz değerleri alır ve çıkar. Örneğin


~ Kodlar ~
OPEN "Veriler.txt" FOR INPUT AS #1
INPUT #1, Aciklama$
INPUT #1, KullaniciAdi$
CLOSE



Bu örnekte iki String bilgi OkuBeni.txt dosyasından alınmaktadır. Bunlardan ilk alınan bilgi Aciklama$ değişkenine, ikinci alınan bilgi KullaniciAdi$ değişkeninde depolanacaktır. Eğer ilgili dosya bu verileri vermekte yetersiz kalırsa size bir hata iletisi gelecektir.


~ Kodlar ~
OPEN "Veriler.txt" FOR INPUT AS #1
FOR i = 1 TO 5
IF EOF(1) THEN GOTO Bitir
INPUT #1, Puan(i)
NEXT i
Bitir:
CLOSE



Yukarıdaki örnekte kullandığımız EOF(1) End Of File'nin kısaltmasıdır. Bu dosyadan alınabilecek bilgiler bittiğinde 'Bitti' etiketine gideceğini açıklar. Böylece gelen hata iletisi engellenmiş olur. Ayrıca LOF(1) de vardır. Bu ise o dosyanın içinin boş olduğu durumları bize bildirir.


GET #1 ve PUT #1
BINARY modunda dosyayı açtıysanız yalnızca GET #1 ve PUT #1 kullanılabilir. Burada yukardakilerden daha farklı bir sistem kullanılmaktadır. Bilgiler ikili bir şekilde, değiştirilemez olarak depolanmaktadır (Stringler hariç). Burada değişken olarak TYPE komutunun bilinmesi gerekiyor. Çünkü eklenen bilgiler çoğul ise bu durum gerekli. Bu nedenle Binary olarak dosya kaydedilmesini daha sonra TYPE, DIM, CONST, DIM SHARED, COMMON, COMMON SHARED gibi komutları ele aldığımızda açıklamayı uygun bulduk.


Dosya Yönetimi
Bilgisayarınızda bulunan dosyaları arşiv, salt okunur, sistem özelliklerinden, boyutlarına, türlerine, konumlarına göre dilediğiniz gibi kullanabilirsiniz. Bunun için MSDOS'un iç ve dış komutları size yardımcı olacaktır. Bunun dışında programın içinde olan bazı kodlar bize kolaylık sağlamaktadır. Bunlardan bazıları:


KILL
KILL DosyaAdi şeklinde kullandığımız bu komut belirtilen dosyanın silinmesini sağlamaktadır (Dosya tamamen silinir).


FILES
FILES bize dizinde bulunan dosyaları listeler. Yanına gelebilecek bazı terimlerden aşağıdakilere göz atalım şimdi..


FILES "*.bas" (sadece BAS uzantılı dosyaları gösterir)
FILES "C:*.*" (C sürücüsünün içini gösterir)
FILES "TEST?.BAS" (TEST ile başlayan 5 karakterli BAS dosyalarını gösterir)
FILES "SHARED/" (bir alt dizin olan SHARED ve içini gösterir)


CHDIR ve CHDRIVE
CHDIR, Programın kullandığı dizinini değiştirir. Örneğin: CHDIR "C:\Qbasic"
CHDRIVE, Programın kullandığı sürücüyü değiştirir. Örneğin: CHDRIVE "D:"


MKDIR ve RMDIR
MKDIR, Klasör yaratmak için kullanılır. Örneğin: MKDIR "Program"
RMDIR, Klasörü silmek için kullanılır. Örneğin: RMDIR "Dizin"


Ders 6'da burada bitti. Konularımız giderek daha kolay gelecektir. Şimdiye kadar Qbasic'te en çok kullanılan kodları gördük. Şimdi detaylara iniş başlıyor..



7. Ders: ALT PROGRAMLAR (SUB ve GOSUB)
Bu Derste GOSUB ve SUB'un kullanımını öğreneceğiz. Bunlar Program içindeki alt fonksiyonlar olup programınızda kullanacağınız işlevleri birçok yere uygulama özgürlüğü sağlayacaktır.


SUB [Fonksiyon Adı] (Değişkenler)
Program içinde bir satıra SUB (Fonksiyon Adı) yazıp ENTER'a bastığımız an sanki tüm veriler silinmiş gibi olur. Size yeni bir sayfa açılır. Bu bizim ALT Program penceremizdir. Bundan böyle Fonksiyon adı bizim için yeni bir koddur.


Bu anlatımı bir örnekle pekiştirelim. Şimdi yapacağımız program Ona verdiğimiz 2 sayının toplamını ekrana yazdırsın. Bu durumda iki değişken kullanacağız. Bu iki değişken toplayacağımız sayılar olacak.


~ Kodlar ~
SUB Toplama (Sayi1, Sayi2)
Print Sayi1 + Sayi2
END SUB



Yukardaki kodları yazarız. Ve Ana ekrana (Main Module) dönebiliriz. Buraya TOPLAMA 4, 3 yazarsak ve programı başlatırsak ekranda 7 sayısını göreceksiniz. İşte Sub'un temel mantığı bu. SUB ayrı bir program olarak görülse de Basic'teki tüm kodları kullanabildiğiniz bir yer...


Şimdi daha karışık bir örnekle bunu pekiştirelim.


~ Kodlar ~
Untitled.bas içinde BILGIAL programı
SUB BILGIAL (KullaniciAdi$)
CLS
COLOR 15: PRINT "Sayın "; KullaniciAdi$; ", Programa Hoşgeldiniz.."
COLOR 15: PRINT "Lütfen aşağıdaki sorulara yanıt verin..."
INPUT "Yaşınız:", Yas
INPUT "Kan Grubu:", KanG$
END SUB



Yukarıda KullaniciAdi$ ile SUB'u çağırdığımızda bazı bilgiler istiyor. Buraya kadar herşey tamam. Main Module(Ana Ekran)'a şunları yazalım:


~ Kodlar ~
Untitled.bas
BILGIAL "Murat"
PRINT Yas
PRINT KanG$



Bu şekilde programı çalıştırırsanız girdiğiniz bilgilerin hiçbirinin görünmediğini göreceksiniz. Bu durumun nedeni SUB'lar arasındaki değişkenlerin sabitlenmemiş olması. Yani Yas değişkeni SUB içinde farklı, Main Module'de farklı anlamlara geliyor. Bu durumu ortadan kaldırmak için DIM SHARED kullanırız. Programın başına DIM SHARED Yas, KanG$ yazarsak bilgilerin görüntülendiğini göreceksiniz.. Öyleyse şimdi DIM komutu ve bazı ARRAY(Dizi)'ler hakkında bilgi alalım..


DIM
Bu komut bir değişkeni tanımlamak için kullanılır. O değişkenin türü, dize sayısı gibi bilgiler bu komutla bildirilir. Örneğin KanGrubu adlı değişkenin bir STRING değer olduğunu aşağıdaki kodla bilgisayara bildirebiliriz. Böylece bu değişken için geçerli olmak üzere (DEFSTR kullanmadıysak) $ işareti kullanmadan bir String değere sahip olacağız. Örneği inceleyin...


~ Kodlar ~
DIM KanGrubu AS STRING, Onay AS BOOLEAN



Önceki derslerden hatırlatsanız STRING, INTEGER, DOUBLE, SINGLE, LONG olmak üzere 5 çeşitti (Ayrıca Doğru/Yanlış işlemi için geçerli BOOLEAN). Bunun başına AS terimini getirmeyi unutmayın ve virgül (,) kullanarak DIM'i devam ettirebilirsiniz. Aşağıda farklı bir örnek var.


~ Kodlar ~
DIM Degisken$ As STRING * 15



Bu örnekteki STRING * 15 o değişkenin max. 15 karakterden oluşan bir String(yazı) değeri olduğunu belirttik. Eğer Bu değişken için INPUT komutu ile veri alırsak ve kullanıcı tarafından verilen değerler 15 karakterden fazla olursa sadece ilk 15 karakter depolanacaktır bu değişken içinde. (Hafıza sorunlarında XMS kullanamıyorsanız bu sistem çok işinize yarayacaktır. Çünkü STRING'ler toplam 32768 karakter kapasitelidir..)


Bu DIM kullanımı olarak göreceğimiz şimdilik son örnek..


~ Kodlar ~
DIM Ad$(20), Soyad$(20), Yas(20)



Yukarıdaki örnekte değişkenlerin yanına bir sayı geldiğini farketmişsinizdir. Bu sayı o değişkenden kaç tane olduğunu bilgisayara bildirmektedir. Mesela Ad$ değişkeninden toplam 20 tane vardır. Aşağıdaki gibi değer girişleri yapılabilir.


~ Kodlar ~
DIM Ad$(10), Soyad$(10), Yas(10)

FOR i = 1 to 10
INPUT Str$(i) + ". kullanıcının adı:", Ad$(i)
INPUT Str$(i) + ". kullanıcının soyadı:", Soyad$(i)
INPUT Str$(i) + ". kullanıcının yaşı:", Yas(i)
Next i




Bu örnekte 10 tane Ad, Soyad ve Yaş verisi istenmektedir. Bunlara ulaşırken Print Ad$(1) şeklinde kullanmak zorundayız yani Ad$ tek başına bir anlam ifade etmiyor. Bu dize değerleri bize kullanımda çok büyük kolaylık sağlamaktadır. Birçok veri birim zamanda işlenebilmekte ve depolanabilmektedir.


DIM SHARED
SUB'lar arasında da geçerli olan Değişken değerleridir. Normalde her SUB kendi içinde değişkenleri kabul eder fakat bu kullanımla beraber Tüm alt programlar içinde geçerli olan değişkenler yaratılmaktadır.


~ Kodlar ~
DIM SHARED Yas, KanG$



UYARI: Ister DIM ister COMMON olsun eğer SHARED kullanıyorsak bunu mutlaka Ana Kodlar(Main Module) kısmında kullanmalıyız.


EXIT SUB
Bunu yalnız SUB içinde kullanabilirsiniz. Bu ilgili Modülü kapatıp ana ekrana geri dönmesini sağlamaktadır...


GOSUB
Öncedende bahsetmiştik. Bu komut aynı modül içinde olmak şartıyla ilgili etikete gider ve RETURN komutuyla geri döner. Yani sık sık yapılan bir işi hızlandırmaya yarar. Bu da bir ALT program çeşididir.


~ Kodlar ~
INPUT "Bir kelime yazin..", Kelime$
GOSUB Duzelt
PRINT Kelime$
END

Duzelt:
Yeni$ = ""
FOR i = 1 TO LEN(Kelime$)
HarfNo = ASC(MID$(Kelime$, i, 1))
IF HarfNo >= 65 AND HarfNo <= 96 THEN
Yeni$ = Yeni$ + CHR$(HarfNo + 32)
ELSE
Yeni$ = Yeni$ + CHR$(HarfNo)
END IF
NEXT i
Kelime$ = Yeni$
RETURN



Bu örnekte Duzelt, Kelime$ içine yazılan bir cümledeki büyük harfleri küçük harfe çevirecektir. Örneğin eğer MURAT yazarsak sonuç murat olarak çıkacaktır. Asıl mantık GOSUB Duzelt dediğimizde oraya gitmesi işlevi gerçekleştirmesi ve RETURN komutuyla geri gelmesidir.


ASC(), Bu fonksiyon bir karakterin ASCII değerini verir. Bu değer sayısal bir değer olup 0-255 arasında olabilir. Dersimiz burda bitti. Sevgiler...


8. Ders: DATA, RESTORE, READ, CLEAR
DATA komutu bilgileri programa yerleştirmenin diğer bir yoludur. Bu şekilde program içine veriler önceden verilir ve daha sonra çağırılırlar. İki örnekte bunu inceleyelim. İlk örnek Veri kullanımında faydalanabileceğimiz şekilde...


~ Kodlar ~
DIM Ay$(12)

For i = 1 to 12
Read Ay$(i)
Next i

Gun = Val(Mid$(Date$, 1, 2))
AyNo = Val(Mid$(Date$, 4, 2))
Yil = Val(Mid$(Date$, 7, 4))

Print "Bugün"; Str$(Gun); " "; Ay$(AyNo); " "; Str$(Yil)

DATA "Ocak","Şubat","Mart","Nisan","Mayıs","Haziran "
DATA "Temmuz","Ağustos","Eylül","Ekim","Kasım","Ara lık"



~ Görünüş ~
Bugün 26 Mart 2004



DATA komutu programın neresinde olursa olsun ilk okunan kısımlardan biridir. Örneğin yukarıdaki örnekte programın sonunda kullandık. Bunlar işlev olarak değer görmezler yani PRINT komutundan sonra komut yokmuş gibi düşünün. Yukarıda READ komutunu kullandık. Bu DATA'daki verilerin okunması için gerekli olan koddur. Eğer DATA bittiği halde READ yani okuma işlemi devam ederse bilgisayar bir hata iletisi verecektir: OUT OF DATA


RESTORE, data okunduktan sonra tekrar başa dönmeyi sağlar. Böylece verileri yeniden kullanabilirsiniz. CLEAR, verileri tamamen temizlemek için kullanılır.


Aynı zamanda grafik yapımında da DATA'dan yararlanılabilir. Aşağıda buna bir örnek var. 7x7'lik bir kalp yaptık ve bunu ekrana yapıştırıyoruz..


~ Kodlar ~
RANDOMIZE TIMER
SCREEN 13

DATA 0,12,12,0,12,12,0
DATA 12,12,12,12,12,12,12
DATA 12,12,12,12,12,12,12
DATA 12,12,12,12,12,12,12
DATA 0,12,12,12,12,12,0
DATA 0,0,12,12,12,0,0
DATA 0,0,0,12,0,0,0

For i3 = 1 to 1000 'Yineleme Sayısı
YapX = INT(RND * 320 + 1): YapY = INT(RND * 320 + 1)

RESTORE
FOR i1 = 1 to 7: FOR i2 = 1 to 7
Read Renk
PSET (YapX + i2, YapY + i1), Renk
Next i2: Next i1

Next i3



Bu şekilde program çalıştırılırsa RND ile belirtilmiş karışık noktalardan başlamak üzere bir 1000 kalp yapıştıracaktır ekrana.


DATA'dan yazı tipi oluşturma da, grafik çizimlerinde, karakterler için gölge efektlerinde, renklendirme de ve daha pek çok alanda kullanabilirsiniz.

9. Ders: TYPE, GET #1, PUT #1
Bu konuda çok soru geliyor. Bu nedenle bu dersi ayrıntısıyla anlamaya çalışalım.


TYPE
Bu bir değişken için birden fazla tür yaratmaktır. Bir değişken depolama sistemi diyebiliriz. Eğer MySQL ve Tablolama hakkında bir fikriniz varsa bu sistemi ona benzetebilirsiniz. Örnekle başlayalım:


~ Kodlar ~
TYPE TestRecord
Ad As String * 20
Yas As INTEGER
END TYPE

DIM Veri As TestRecord



Burda da görüldüğü gibi kullanım TYPE [Kayıt Adı] şeklinde başlar ve kayıtın içerdiği değişkenler türleri ile belirtilir ve sonra END TYPE ile bitirilir. Bu kaydı kullanacak Değişken DIM ile belirtilir.


Şimdi isterseniz bu kaydın dosyalara eklenmesi ve bilgilerin alınmasını öğrenelim.


PUT #1
İlk önce dosyayı açalım. Dosyayı açarken yine OPEN komutunu kullanırız ve RANDOM modunda açarız.. LEN komutu ile dosya büyüklüğü programa bildirilir. Bunun için aşağıdaki kalıbı kullanmanız yeterli...


~ Kodlar ~
(bir öncekinin devamıdır)
OPEN "Data.Dat" FOR RANDOM AS #1 LEN = LEN(Veri)



PUT #1 kullanmanın zamanı geldi. Şimdi kayıtları yerleştirme zamanı! Aşağıdaki örnekte sürekli Ad ve Yaş isteyecek sizden. Her bilgi verdiğinizde bunu kayıt nosuna ekleyecek ve tekrar diye soracak. Evet dediğiniz sürece kayıt büyüyecektir..


~ Kodlar ~
TYPE TestRecord
Ad As String * 20
Yas As INTEGER
END TYPE

DIM Veri As TestRecord

OPEN "Data.Dat" FOR RANDOM AS #1 LEN = LEN(Veri)
CLS
i = 0
DO
i = i + 1
INPUT "Adı :", Veri.Ad
INPUT "Yaşı:", Veri.Yas
PUT #1, i, Veri
Print "Yeniden? (E/H)"
c$ = INPUT$(1)
IF c$ = "H" THEN GOTO Bitir
LOOP
Bitir:
Print "Toplam"; Str$(i); " kayıt yazıldı.."
CLOSE #1



Yukarıda yazan kodları bir not defterine kopyalayıp Deneme.Bas adı ile kaydedip çalıştırdıktan sonra (tabi 3-5 tane de değer girin) açtığımız dosya olan DATA.DAT dosyasına bakın. Burda ikili değerde yerleştirilmiştir ve Yaşlar görünmemektedir. Bunu el ile değiştirmek dosyanın yokolmasına yol açabilir...


GET #1
Şimdi kaydettiğimiz bilgileri yeniden alalım. Burda bilgisayara kaç kayıt olduğunun bildirilmesi gerekir. LOF(1) / LEN(Veri) (Not: Veri kaydın adıdır kod ile ilgisi yok) kullanırız..


~ Kodlar ~
TYPE TestRecord
Ad As String * 20
Yas As INTEGER
END TYPE

DIM Veri As TestRecord

OPEN "Data.Dat" FOR RANDOM AS #1 LEN = LEN(Veri)
CLS
Max = LOF(1) \ LEN(Veri)
FOR i = 1 TO Max
GET #1, I, Veri
PRINT Veri.Ad, Veri.Yas
NEXT I
CLOSE #1



Yukarıdaki şekilde çalıştırırsak kayıtların tamamı Ad ve Yaş olarak okunacaktır. (Önceki dosyaya kaç kayıt girildiyse hepsi)...


Böylece Kayıt değerlerindeki GET/PUT'u öğrendik. Bu komut aynı zamanda Grafik kullanımlarında da kullanılmakta bu konuya sonra deyineceğim GET/PUT ile ilgili sorunlarınızda bana ulaşabilirsiniz.

10. Ders: BAZI FONKSİYONLAR
Atlamış olabileceğim ya da fazla ayrıntı isteyen bazı fonksiyon ve kodları bu derste sizle paylaşmak istiyorum.


CONST
Sabit değerdir. Bu değer programda hiç değişmeyen değerler için kullanılır. Aşağıdaki örnekte PI adlı değişken her zaman 3.14 olarak alınacaktır.


~ Kodlar ~
CONST PI=3.14



REDIM
Az önce öğrendiğimiz DIMENSION(DIM) kodu sadece 1 kere kullanılabilir. Eğer değişkenlerin kalıplaşmış değerlerinde değişiklik yapmak istiyorsanız REDIM kullanarak DYNAMIC özellik kazandırabilirsiniz. Böylece ERASE komutu kullanarak silebilirsiniz. (Bu konu sonra incelenecektir)


SHELL
Bir programı çalıştırmak için kullanılır. Program MS-Dos Exe dosyası olursa program içinde çalışır. Windows için bir program çalıştırıyorsanız (mesela Notepad.exe) bu durumda program Not Defterini açacak ve devam edecektir.. Yani MS-Dos Programlarında ilgili program açıldıktan sonra kendi programımız diğer programın bitmesini bekler..


~ Kodlar ~
SHELL "C:\Command.com"



DECLARE SUB [SUB ADI]
Bu programda kullandığınız SUB'ların varlığını programa belirtmek için kullanılır. Mutlaka bulunur. Bunu Qbasic kendisi yapıştırır çoğu zaman. Eğer DECLARE SUB ile ilgili bir hata varsa bunların hepsini silin. Nasıl olsa Qbasic tekrar, üstelik doğru şekilleri ile bunu yerleştirecektir...


COMMAND$
Program başında kullanılır ve Programın başlangıç anahtarlarının belirlenmesini sağlar. Mesela programımızın adı Oyun.Exe olsun. Eğer komut satırına Oyun.Exe NOSOUND yazıp da programı çalıştırırsak COMMAND$ değeri NOSOUND olacaktır. Bu sayede gerekli anahtarlar belirlenebilir.


~ Kodlar ~
IF COMMAND$ = "H" THEN
Print "Yardım Dosyası'na Hoşgeldiniz..."
ELSE
Program Kapatıldı..
END IF



Bu örnekte program H anahtarı ile açılırsa 'Yardım Dosyası' mesajı ile açılıyor bunun dışında hep 'Program Kapatılacak' der..


ON ERROR GOTO [ETIKET]
Bilgisayar bir hata ile karşılaştığında belirttiğiniz etikete gidecektir. Bu programın sorunsuz çalışmasına yardımcı olabilir. Çünkü Etiket içinde RETURN NEXT kullanabilirsiniz. Bu sonraki satırdan devam et anlamını taşır.. Aşağıdaki örnekte 0'ı 1'e bölerek hata yapıyoruz. Normalde bilgisayarda ON ERROR GOTO [ETIKET] komutu olmasa hata iletisi vereceği halde aşağıdaki şekilde çalıştırırsanız hatalı satır atlanarak geçilecektir ve hata iletisi görmeyeceksiniz...


~ Kodlar ~
ON ERROR GOTO HANDLE

Hata = 0 / 1
PRINT Hata
END

HANDLE:
RETURN NEXT



ON ingilizcede üstünde anlamındadır. Bu kodun birçok kullanım şekli vardır. Bunları ilerleyen derslerde ayrıntısıyla bakacağız...


LTRIM$() ve RTRIM$()
LTRIM$(), bir STRING değişkenin sol tarafında bulunan tüm boşlukları siler. RTRIM$() ise sağ taraftaki boşluklar içindir.. Aşağıdaki örneği inceleyin..


~ Kodlar ~
Deger$ = " SELAM "
PRINT RTRIM$(LTRIM$(Deger$)) + " (Düzeltilmiş)"




~ Görünüşü ~
SELAM (Düzeltilmiş)



TIME$
Visual Basic'te de aynı şekilde kullanılan bu kod bize bilgisayar saatini görüntüler... 00:12:25 şeklindedir. Yani Saat, Dakika ve Saniye olarak. MID$, LEFT$, RIGHT$ komutları ile bunları ayrı ayrı ele alabilirsiniz..


~ Kodlar ~
Saat = VAL(MID$(TIME$, 1, 2))
Dakika = VAL(MID$(TIME$, 4, 2))
Saniye = VAL(MID$(TIME$, 7, 2))



DATE$
Tarihi görüntüleyen koddur. 26/03/2004 şeklindedir. Yani Gün, Ay, Dakika olarak. MID$, LEFT$, RIGHT$ komutları ile bunları ayrı ayrı ele alabilirsiniz..


~ Kodlar ~
Gun = VAL(MID$(TIME$, 1, 2))
Ay = VAL(MID$(TIME$, 4, 2))
Yil = VAL(MID$(TIME$, 7, 4))



Matematiksel Fonksiyonlar
Bir sayının SIN sinüsünü, COS kosünüsünü, TAN tanjantını, ATN arktanjantını verir. Üç boyutlu oyun yapımında bu kodlar çok fazla kullanılmaktadır. İleri düzeyde ayrıntısına geçeriz...


CALL [SUB ADI]
Bir Prosedür/Alt Program/SUB çağırmak için kullanılır. CALL Renklendir yazılırsa Renklendir adlı SUB çağırılacaktır. Bunu CALL kullanmadan da yapabileceğinizi unutmayın...


RANDOMIZE TIMER
Normalde bu kod kullanmazsa RND'nin kullanıldığı her işlem standart olacaktır. Yani program ilk açıldığında INT(RND * 3 + 1)'de sonuç 2 geliyorsa bu ve bundan sonraki seçimler de hep böyle olacaktır. Bu kod zamanın karışık algılanmasına yardımcı olmaktadır. RND'yi kullandığınız her programda mutlaka bulunmalıdır...

"Kardeşim sen düşünceden ibaretsin. Geriye kalan et ve kemiksin. Gül düşünür gülistan olursun. Diken düşünür dikenlik olursun."
  Alıntı ile Cevapla
Eski 29-11-06, 13:35 Çevrimdışı   #3
Profesör
Sanatkârlar grubu
 
Hewall - ait Avatar
<