| |
| |
![]() |
![]() | | Konu Seçenekleri | ![]() |
| | #1 |
| Profesör Sanatkârlar grubu ![]() | 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." |
|
| | #2 |
| Profesör Sanatkârlar grubu ![]()
Mesajlar: 4.098
Teşekkür etti: 1.016
Teşekkür edildi: 1.056
Forum Gücü: 42 Forum Puanı:11433 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | 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." |
|
| | #3 |
| Profesör Sanatkârlar grubu ![]() < |