Programlama yapalım ve Öğrenelim. - Delphi Eğitim48
  Ana Sayfa
  .NET Eğitim Notları
  Visual C# .NET Örnek Kodları
  VisualBasic.NET Örnek Kodları
  J# Örnekleri
  ASP.NET Örnek Kodları
  Delphi Eğitim
  => Delphi Eğitim1
  => Delphi Eğitim2
  => Delphi Eğitim3
  => Delphi Eğitim4
  => Delphi Eğitim5
  => Delphi Eğitim6
  => Delphi Eğitim7
  => Delphi Eğitim8
  => Delphi Eğitim9
  => Delphi Eğitim10
  => Delphi Eğitim11
  => Delphi Eğitim13
  => Delphi Eğitim14
  => Delphi Eğitim15
  => Delphi Eğitim16
  => Delphi Eğitim17
  => Delphi Eğitim18
  => Delphi Eğitim19
  => Delphi Eğitim20
  => Delphi Eğitim21
  => Delphi Eğitim22
  => Delphi Eğitim23
  => Delphi Eğitim24
  => Delphi Eğitim25
  => Delphi Eğitim26
  => Delphi Eğitim27
  => Delphi Eğitim28
  => Delphi Eğitim29
  => Delphi Eğitim30
  => Delphi Eğtim31
  => Delphi Eğitim32
  => Delphi Eğitim33
  => Delphi Eğitim34
  => Delphi Eğitim35
  => Delphi Eğitim36
  => Delphi Eğitim37
  => Delphi Eğitim38
  => Delphi Eğitim39
  => Delphi Eğitim40
  => Delphi Eğitim41
  => Delphi Eğitim42
  => Delphi Eğitim43
  => Delphi Eğitim44
  => Delphi Eğitim45
  => Delphi Eğitim46
  => Delphi Eğitim47
  => Delphi Eğitim48
  => Delphi Eğitim49
  => Delphi Eğitim50
  => Delphi Eğitim51
  => Delphi Eğitim52
  => Delphi Eğitim53
  => Delphi Eğitim54
  => Delphi Eğitim55
  => Delphi Eğitim56
  => Delphi Eğitim57
  => Delphi Eğitim58
  => Delphi Eğitim59
  => Delphi Eğitim60
  => Delphi Eğitim61
  => Delphi Eğitim62
  => Delphi Eğitim63
  => Delphi Eğitim64
  => Delphi Eğitim65
  => Delphi Eğitim66
  => Delphi Eğitim67
  => Delphi Eğitim68
  => Delphi Eğitim69
  => Delphi Eğitim70
  => Delphi Eğitim71
  => Delphi Eğitim72
  => Delphi Eğitim73
  => Delphi Eğitim74
  => Delphi Eğitim75
  => Delphi Eğitim76
  => Delphi Eğitim77
  => Delphi Eğitim78
  => Delphi Eğitim79
  => Delphi Eğitim80
  => Delphi Eğitim81
  => Delphi Eğitim82
  => Delphi Eğitim83
  => Delphi Eğitim84
  => Delphi Eğitim85
  => Delphi Eğitim86
  => Delphi Eğitim87
  => Delphi Eğitim88
  => Delphi Eğitim89
  => Delphi Eğitim90
  => Delphi Eğitim91
  => Delphi Eğitim92
  => Delphi Eğitim93
  => Delphi Eğitim94
  => Delphi Eğitim95
  => Delphi Eğitim96
  => Delphi Eğitim97
  => Delphi Eğitim98
  => Delphi Eğitim99
  => Delphi Eğitim100
  => Delphi Eğitim101
  => Delphi Eğitim102
  => Delphi Eğitim103
  => Delphi Eğitim104
  => Delphi Eğitim105
  => Delphi Eğitim106
  => Delphi Eğitim107
  => Delphi Eğitim108
  => Delphi Eğitim109
  => Delphi Eğitim110
  => Delphi Eğitim111
  => Delphi Eğitim112
  => Delphi Eğitim113
  => Delphi Eğitim114
  => Delphi Eğitim115
  => Delphi Eğitim116
  => Delphi Eğitim117
  => Delphi Eğitim118
  => Delphi Eğitim119
  => Delphi Eğitim120
  => Delphi Eğitim121
  => Delphi Eğitim122
  => Delphi Eğitim123
  => Delphi Eğitim124
  => Delphi Eğitim125
  => Delphi Eğitim126
  => Delphi Eğitim127
  => Delphi Eğitim128
  => Delphi Eğitim129
  => Delphi Eğitim130
  => Delphi Eğitim131
  => Delphi Eğitim132
  => Delphi Eğitim133
  => Delphi Eğitim134
  => Delphi Eğitim135
  => Delphi Eğitim136
  => Delphi Eğitim137
  => Delphi Eğitim138
  => Delphi Eğitim139
  => Delphi Eğitim140
  => Delphi Eğitim141
  => Delphi Eğitim142
  => Delphi Eğitim143
  => Delphi Eğitim144
  => Delphi Eğitim145
  => Delphi Eğitim146
  => Delphi eğitim147
  => Delphi Eğitim148
  => Delphi Eğitim149
  => Delphi Eğitim150
  => Delphi Eğitim151
  => Delphi Eğitim152
  => Delphi Eğitim153
  => Delphi Eğitim154
  => Delphi Eğitim155
  => Delphi Eğitim156
  => Delphi Eğitim157
  => Delphi Eğitim158
  => Delphi Eğitim159
  => Delphi Eğitim160
  => Delphi Eğitim161
  => Delphi Eğitim162
  => Delphi Eğitim164
  => Delphi Eğitim165
  => Delphi Eğitim166
  => Delphi Eğitim167
  => Delphi Eğitim168
  => Delphi Eğitim169
  => Delphi Eğitim170
  => Delphi Eğitim171
  => Delphi Eğitim172
  => Delphi Eğitim173
  => Delphi Eğitim174
  => Delphi Eğitim175
  => Delphi Eğitim176
  => Delphi Eğitim177
  => Delphi Eğitim178
  => Delphi Eğitim179
  => Delphi Eğitim180
  => Delphi Eğitim181
  => Delphi Eğitim182
  => Delphi Eğitim183
  => Delphi Eğitim184
  => Delphi Eğitim185
  => Delphi Eğitim186
  => Delphi Eğitim187
  => Delphi Eğitim188
  => Delphi Eğitim189
  => Delphi Eğitim190
  => Delphi Eğitim191
  => Delphi Eğitim192
  => Delphi Eğitim193
  => Delphi Eğitim194
  => Delphi Eğitim195
  => Delphi Eğitim196
  => Delphi Eğitim197
  => Delphi Eğitim198
  => Delphi Eğitim199
  => Delphi Eğitim200
  => Delphi Eğitim201
  => Delphi Eğitim202
  => Delphi Eğitim203
  => Delphi Eğitim204
  => Delphi Eğitim205
  => Delphi Eğitim206
  => Delphi Eğitim207
  => Delphi Eğitim208
  => Delphi Eğitim209
  => Delphi Eğitim210
  => Delphi Eğitim211
  => Delphi Eğitim212
  => Delphi Eğitim213
  => Delphi Eğitim214
  => Delphi Eğitim215
  => Delphi Eğitim216
  => Delphi Eğitim217
  => Delphi Eğitim218
  => Delphi Eğitim219
  => Delphi Eğitim220
  => Delphi Eğitim221
  => Delphi Eğitim222
  => Delphi Eğitim223
  => Delphi Eğitim224
  => Delphi Eğitim225
  => Delphi Eğitim226
  => Delphi Eğitim227
  => Delphi Eğitim228
  => Delphi Eğitim229
  => Delphi Eğitim230
  => Delphi Eğitim231
  => Delphi Eğitim232
  => Delphi Eğitim233
  => Delphi Eğitim234
  => Delphi Eğitim235
  => Delphi Eğitim236
  => Delphi Eğitim237
  => Delphi Eğitim238
  => Delphi Eğitim239
  => Delphi Eğitim240
  => Delphi Eğitim241
  => Delphi Eğitim242
  İletişim

Toplama kodlar

Ctrl alt del    gizleme

 

SetWindowLong(Application.Handle,GWL_HWNDPARENT,WS_EX_TOOLWINDOW);

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

Track bar konumu

showmessage(inttostr(TrackBar1.Position));

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

Font sitili

Canvas.Font.Style := Canvas.Font.Style + [fsBold];

Canvas.Font.Name := `Courier New';

Canvas.Font.Size := 14;

Canvas.Font.Style := Canvas.Font.Style + [fsBold];

Canvas.TextOut(20, 20, `Testing');

 

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

exe in içinde bulunduğu dosyayı çağırma

ExtractFilePath(Application.ExeName) + 'serelif.wav'

mediaplayer1.filename:=extractfilepath(application.exename)+'serelif.wav';

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

{$R *.DFM}

function PlayWavFile(const FileName: string): Boolean;

begin

Result := PlaySound(PChar(FileName), 0, SND_ASYNC);

end;

 

!Dizinden okutma :PlayWavFile(ExtractFilePath(Application.ExeName)+ '.Verilersound.wav');

 

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

iki formu aynı anda gösterme

Görünmesini istediğin formu stayontop yapıp diğer formun istediğin yerinde konumlandırabilirsin.

 

Oncreate olayına sol ve üst koordinatlarını belirtebilirsin.

 

Form2.left:=form1.left+100;

fom2.top:=form1.top+300;

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

FARE

fareyi takip eden nesne

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

RadioButton1.Left:=x-30;

RadioButton1.Top:=y+30;

end;

 

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

timeri nesneden ayarlamak :

Timer1.interval:=StrToInt(Edit1.Text)

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

timerin sadece bir sefer çalışması

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Timer1.Enabled := False;

YapilacakIslemler;

end;

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

Açılış formu örneği değişik

____________________________________

       procedure Delay(ms : longint);

var TheTime : LongInt;

begin

TheTime := GetTickCount + ms;

while GetTickCount < TheTime do

Application.ProcessMessages;

end;

 

//test

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage('Start');

Delay(2000);//2sn

ShowMessage('End');

end;

 

2. ÖRNEK

program Project2;

 

uses

  Forms,

  Unit1 in 'Unit1.pas' {Duzenfrm},

  Unit2 in 'Unit2.pas' {Anafrm},

  Unit3 in 'Unit3.pas' {Form3},

  Unit4 in 'Unit4.pas' {AboutBox},

  Unit5 in 'Unit5.pas' {yrdfrm},

  Unit6 in 'Unit6.pas' {ayrfrm};

 

{$R *.res}

 

begin

  Form3:=TForm3.Create(nil);//Form3 nin daha önce hazırlanmış olması gerekir.

  Form3.Show; //splash ekranımız gürünsün

  //Sleep(1000);  //Windows unitini eklersek 1 saniye bekler

  Application.ProcessMessages;

  Form3.Update;

  Application.Initialize;

  Application.Title := 'Açıklamalı Bilgisayar Sözlüğü';

  Application.CreateForm(TAnafrm, Anafrm);

  Form3.Hide; ;//Ana form oluştuğunda Splash ekran saklanıyor

  Form3.Release; ;//Bellekten atılıyor. Free ile olabilir

  Application.Run;

 

End

___________________________________________________________________________

Alfa    efekti

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

 

var

i, cavb : 0..255;

begin

 

if AlphaBlend=False then

begin

AlphaBlendValue:=255;

AlphaBlend:=True;

end;

cavb:=AlphaBlendValue;

for i := cavb downto 0 do

begin

AlphaBlendValue := i;

Application.ProcessMessages;

Sleep(4);{saniyesi ne kadar çok olursa yavaş kapanması okadar çok olur}

end

end;

 

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

KLAVYE DURUMU

const

  CapPanel  = 2;

  NumPanel  = 3;

  ScrlPanel = 4;

  DatePanel = 5;

 

 

 

procedure TAnafrm.Timer2Timer(Sender: TObject);

begin

with StatusBar1 do

  begin

    if GetKeyState(VK_CAPITAL) <> 0 then

      StatusBar1.Panels[CapPanel].Text := 'CAP'

    else

      StatusBar1.Panels[CapPanel].Text := '';

    if GetKeyState(VK_NUMLOCK) <> 0 then

      StatusBar1.Panels[NumPanel].Text := 'NUM'

    else

      StatusBar1.Panels[NumPanel].Text := '';

    if GetKeyState(VK_SCROLL) <> 0 then

      StatusBar1.Panels[ScrlPanel].Text := 'SCRL'

    else

      StatusBar1.Panels[ScrlPanel].Text := '';

   StatusBar1.Panels[DatePanel].Text := FormatDateTime(' dddddd', now);

end;

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

 

VERİ TABANI NOTLARIM

Tablo listbox'a aktarma

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

Table1.Refresh;

  ListBox1.Clear;

  table1.First;

  while not table1.eof do begin

    if ListBox1.Items.IndexOf(Table1Kelime.AsString)<0 then

    ListBox1.Items.Add(Table1Kelime.AsString);

    table1.Next;

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

indekssiz arama :Table1.Locate('anlamı',edit1.text,[LoCaseInsensitive]);

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

uses FileCtrl;

 

filreleyerek arama

 

procedure TForm1.Edit2Change(Sender: TObject);

begin

ClientDataSet1.Filtered:=True;

  ClientDataSet1.Filter:='Kelime Like ''%'+Edit2.Text+'%''';

end;

 

end.

 

Dbgrid de sıralama yapmak

procedure TAnaform.DBGrid1TitleClick(Column: TColumn);

begin

if Column.Index<4 then // ben yalnızca 4 alan tanımladığım için bu şartı koydum.

table1.IndexName:=inttostr(column.Index);

end;

RENGİ GRİ YAPMA

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

 

//Kaynak : Delphi FAQs and TIs.chm;bir rengi gri yapmak

function RgbToGray(RGBColor : TColor) : TColor;

var

  Gray : byte;

begin

  Gray := Round((0.30 * GetRValue(RGBColor)) +

                (0.59 * GetGValue(RGBColor)) +

                (0.11 * GetBValue(RGBColor )));

  Result := RGB(Gray, Gray, Gray);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  Shape1.Brush.Color := RGB(255, 64, 64);

  Shape2.Brush.Color := RgbToGray(Shape1.Brush.Color);

end;

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

MEMO NUMARALANDIRMA

var

  I: Integer;

label

  MyLabel;

begin

  Memo1.Clear;

  I := 0;

MyLabel:

  Inc(I);

  Memo1.Lines.Add(IntToStr(I));

  if I < 100 then

    goto MyLabel;

 

procedure TForm1.Button5Click(Sender: TObject);

var

  I: Integer;

label

  MyLabel;

begin

  Memo1.Clear;

  I := 0;

MyLabel:

  Inc(I);

  Panel1.Lines.Add(IntToStr(I));

  if I < 50 then

    goto MyLabel;

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

Sürükle bırak

//drony@mynet.com

// icq:266148308

 

öncelikle formumuza bir listbox ve edit ekliyoruz

ve listbox'ın dragmode değerini object inspector'dan "dmautomatic" olarak değiştiriyoruz

ve edit'in ondragover ve ondragdrop procedure'üne aşağıdaki kodları ekliyoruz.

 

 

procedure TForm1.Edit1DragOver

 (Sender, Source: TObject;

 X,Y: Integer; State:TDragState;

 var Accept: Boolean);

begin

 Accept := True;

end;

 

procedure TForm1.Edit1DragDrop

 (Sender, Source: TObject; X,Y: Integer);

begin

 (Sender as TEdit).Text :=

   (Source as TListBox).Items

   [(Source as TListBox).ItemIndex]

end;

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

tliste arama

1. listbox1.ItemIndex:=ListBox1.Items.IndexOf('Aranacak Kelime');

 

Daha basit 1 yol

listbox1.ItemIndex:=ListBox1.Items.IndexOf(Edit1.Text);

2. Bileşeni süreki taşımak

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

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

  Y: Integer);

begin

Button1.Left:=x-30;

Button1.Top:=y+30;

end;

 

end.

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

procedure TForm1.Button1Click(Sender: TObject);

var

  search: string;

begin

  search := 'mali';

  if SendMessage(ListBox1.Handle, lb_selectstring, - 1, Longint(PChar(search))) <> LB_ERR then

    ShowMessage('Bulunulanlar: ' + IntToStr(ListBox1.ItemIndex));

end;

 

 

 

2.fonksiyon

var

  search: string;

begin

  search := Edit1.Text;

   SendMessage(ListBox1.Handle, lb_selectstring, - 1, Longint(PChar(search)));

   IntToStr(ListBox1.ItemIndex);

end;

end.

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

 

ListBox Bileşenine Resim Ekleme

 

 

ComboBox1 ın Style özelliğini csOwnerDrawFixed yapın

ComboBox1 in items özelliğini kulanarak listeye eleman ekleyin.

imagelist e ImageList Editor'ü kullanarak resim ekleyin.

 

ve son olarak ListBox'un OnDrawItem olayına aşağıdaki kodu yazın

 

(* kullanılan doğru highlite rengi barındırır *)

combobox1.canvas.fillrect(rect);

(* Aktüel resmi çizer *)

imagelist1.Draw(comboBox1.Canvas,rect.left,rect.top,Index);

(* resimden sonra metini giren satırdır.*)

combobox1.canvas.textout(rect.left+imagelist1.width+2,rect.top,

combobox1.items[index]);

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

CÜMLE FORMATLAMA

function formtyaz(frmy:ansistring):ansistring;

  var

  a:integer; ch:string;

 begin

if length(frmy)<>0  then

begin

CASE FRMY[1]  OF

               'ı': FRMY[1] := 'I';

               'i': FRMY[1] := 'İ';

               else

               begin

               ch:=FRMY[1];

         ch:=ansiUpperCase(ch);

               FRMY[1] :=ch[1];

 

               end;

               end;

 FOR A:=2 TO LENGTH(FRMY) DO

 BEGIN

if (frmy[A-1]='.') OR  (frmy[A-1]=' ') THEN

CASE FRMY[A]  OF

               'ı': FRMY[A] := 'I';

               'i': FRMY[A] := 'İ';

               else

                begin

               ch:=FRMY[a];

         ch:=ansiUpperCase(ch);

               FRMY[a] :=ch[1];

 

               end;

               end

               else

 CASE FRMY[A]  OF

               'I': FRMY[A] := 'ı';

               'İ': FRMY[A] := 'i';

               else

   begin

               ch:=FRMY[a];

         ch:=ansilowerCase(ch);

               FRMY[a] :=ch[1];

 

               end;

               end;

 end;

result:=frmy; end;

 

  end;

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

Şifreleme

button 1.click;

if edit1.text="then

label1.coption:='lütfen edit'e bilgi giriniz'

else

begin

if(edit1.text='AHMET')or(edit1.text='AHMET')then

begin

form2.show

form1.hide;

end else

begin

label1.caption:=edit1.text;

end;

end;

end;

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

 

SİSTEME ŞİFRE İLE GİRİŞ YAPMA

ComboBox ile kullanıcı adı edit ile şifre girişi ve giriş butonu.

 

procedure TForm2.BitBtn1Click(Sender: TObject);

var

username,password:string;

begin

username:=combobox1.text;

password:=maskedit1.Text;

if datamodule8.adotable1.locate('ADMIN ADI;ADMIN SIFRE',vararrayof([username,password]),[])then

begin

showmessage('Hoşgeldiniz....');

form1.show;

FORM2.Hide;

end

else

begin

showmessage('yanlış kullanıcı adı yada şifresi girdiniz...');

i:=i+1;

maskedit1.Clear;

 

2.örnek

// Formun oncreate olayına...

procedure TForm1.FormCreate(Sender: TObject);

var

x,b:string;

begin

b:='Buraya şifre giriniz';

x:=inputbox('Programa Giriş','Programa girmek için şifreyi Giriniz:','');

if x=b then

application.messagebox('Programa Girişiniz Onaylandı.Tebrikler ..!','Tebrikler',mb_ok+mb_defbutton1)

else

halt;

end;

end.

 

Delphi - .....................................

 

Hata Mesajı Kontrolü

Delphide kritik hata mesajları nasıl yakalanır

 

Aşağıdaki kod satır bloğunu kullanarak kritik hataları

yakalayıp bu hatalar oluştuğunda yaptırmak istediğiniz

işleri ve verdirmek istediğiniz hata mesajları verdirebilirsiniz.

 

var

  wOldErrorMode : Word;

begin

  wOldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS );

  try

  {

    hata mesajina sebep olabilecek kod buraya yazilir.

  }

  finally

  {

    bir önceki hata moduna dön.

  }

  SetErrorMode( wOldErrorMode );

  end;

end;

 

Delphi - .....................................

 

toplama makaleler

TOPLAMA MAKALELER

Class Procedure

 

Pek çoğumuzun bilmediğini düşündüğüm bir konuya rastladım geçenlerde. Sizinle paylaşmak istedim. "Class Procedure" kavramını biliyor musunuz? Bir nesneyi "create" eder, daha sonra da "destroy" işimizi bitiririz. Şimdi bu işlemleri komponenti oluşturup, yine kendisine "destroy" yaptırabiliriz. Örneğimizde bir form ve butonlar, TRcihEdit içerisine açılan, kullanıcıya bağlı bir text dosyasını göreceğiz. Formumuza Form2 adını verelim.

 

form2 := TForm2.create(application);

try

            form2.RichEd.lines.LoadFromFile(filename);

            result := form2.ShowModal;

finally

            form2.release;

end;

 

 

 

TForm2 bir class procedure ve ona bağlı Execute functionını kullanıyor.

 

type

  TForm2 = class(TForm)

    Panel1: TPanel;

    RichEd: TRichEdit;

    Panel2: TPanel;

    BitBtn1: TBitBtn;

    BitBtn2: TBitBtn;

  private

    { Private declarations }

  public

    class function Execute(filename:string):TModalResult;

  end;

 

implementation

 

{$R *.DFM}

 

class function TForm2.Execute(filename:string):TModalResult;

var Form2: TForm2;

begin;

form2 := TForm2.create(application);

try

  form2.RichEd.lines.LoadFromFile(filename);

  result := form2.ShowModal;

 

finally

  form2.release;

end;

end;

 

CLASS ifadesi ile functionın tanımlandığına dikkat edin. Böylelikle form create edilmeden bizim fonksyonumuz kullanıma hazır hale geliyor. Bunu  da Form2 classına referans vererek yaparız. Diğer bir formdan bizim fonksyonu kullanmak istersek aşağıdaki gibi bir kod yazmamız yeterli.

 

 

 

TForm2.execute('c:autoexec.bat');

 

 

 

Böylece form "create" edilecek, autoexec.bat dosyası görüntülenebilecektir. Formu kapatmak içinse "OK" ve "CANCEL" (free - destroy) yeterli olacaktır. Elbette bu bir fonksyon olduğuna göre geri dönen değeri de kontrol ettirebiliriz.

 

 

 

if TForm2.execute('c:autoexec.bat') = mrOK

  then label1.caption := 'OK'

  else label1.caption := 'Cancel';

REG

Delphi'de TIniFile ve TRegIniFile Bileşenleri

Delphi ile yazdığınız programlarda çeşitli ayarları ve hatta bilgileri saklamak istiyorsunuz ama bunun için pratik bir yol bulamadınız mı? Ya da bilgileri saklamak ve okumak için TextFile'dan daha iyi bir alternatif mi arıyorsunuz? Buyrun...

İçerik Başlıkları

 

 TIniFile ve TRegIniFile

TIniFile ve TRegIniFile

 

 

TIniFile

 

Yazdığınız programlardaki ayarları ya da saklamak istediğiniz verileri sistematik ve pratik bir şekilde saklayıp, istediğinizde de aynı rahatlıkla okumanızı sağlayacak bileşenimizin adı TIniFile. Hemen belirtelim bu bileşeni kullanmak için "IniFiles" unit'ini programınıza dahil etmeniz gerekiyor.

 

".ini" uzantısına sahip dosyaları eğer notepad ile açtıysanız köşeli parantezlerle belirtilen ana bölümlerin altında çeşitli değişkenler ve karşılarına eşittirden sonra yazılmış çeşitli değerler olduğunu görmüşsünüzdür. Eğer bunu hiç yapmadıysanız açın bakın bir tanesine, öyleler :). Burada köşeli parantezler arasında kalan kısım o "bölümün(section)" adı oluyor. Farklı bölümlerde aynı isimde değişkenler kullanılabiliyor. Ayrıca bu bölümler verileri kategorize etmenize de yarıyor. Bileşenimiz direk bir bölüme ait herhangi bir değişkenin değerini okuyabildiği gibi size bütün bölüm adlarını, bir bölümün içindeki değişken adlarını, isim-değişken çiftlerini de çeşitli şekillerde verebiliyor. Yani oldukça esnek bir kullanım sözkonusu. Lafı daha fazla uzatmadan nasıl kullanıldıklarına bakalım...

 

Öncelikle TIniFile tipide bir değişken tanımlıyoruz.

 

ayarlar: TIniFile;

 

Daha sonra bunu oluşturmamız gerekiyor.

 

ayarlar:= TIniFile(dosyaadi);

 

Buradaki "dosyaadi" string tipinde bir değişken veya direk elle girilen bir değer olabilir. Oluşturulacak veya okunacak ini dosyasının tam yolunu içermeli. Eğer bu isimde bir dosya yoksa oluşturulur ve yine dosya yoksa bile okuma işlemleri esnasında sorun çıkmaz merak etmeyin. Oraya da geliyoruz yavaş yavaş.

 

Şimdi, önce yazma işlemlerinden bahsedelim bence. Sonuçta daha elimizde hazır bir dosya yok. Bu bileşen sık kullanılan birçok değişken tipini rahatça yazmaya yarayan fonksiyonlara sahip. String tipinde bir değer yazmak için

 

ayarlar.WriteString('bölüm','değişkenadı',değer);

 

Şeklinde bir fonksiyon kullanabilirsiniz mesela. Burada bölüm yerine bölüm adı, değişken adı yerine dosyadaki değişken adı ve değer yerine de yazılacak değeri koymalısnız. Buradaki tüm parametreler sabit değerler olabileceği gibi string tipinde, gerekli bilgileri taşıyan değişkenler de olabilirler. String yazdırma dışında aynı şekilde kullanılan sadece sonundaki değer parametresi, yazacağı değişken tipine göre değişen

 

WriteInteger, WriteBool, WriteDate, WriteDateTime, WriteTime, WriteFloat ve WriteBinaryStream fonksyionları var. Bunlardan sonuncu olanı KESİNLİKLE önermiyorum. Hem gereksiz yere boyutu arttırıyor hem de belirli bir boyuttan daha büyük dosyalarla çalışmıyor.

 

Şimdi bu fonksiyonların okuma versiyonlarının bir örneğini göstereceğim, çünkü yapı tamamen aynı. Sadece isimler ve tipler değişiyor. String okuma fonksiyonumuz

 

okunan:=ayarlar.ReadString(bölüm,değişkenadı,varsayılan değer);

 

Gördüğünüz gibi burada farklı olarak "varsayılan değer" bölümü var. Bu bölüm eğer okumaya çalıştığınız değişken herhangi bir sebepten yoksa(dosya yok, ilgili bölüm yok, değişken yok) değer olarak buraya koyulan değeri döndürüyor. Yani burada "okunan" isimli değişkene ya dosyadan okunan değer ya da böyle bir değer okunamadıysa varsayılan değer atanıyor. Yani dosyanın olup olmaması çok büyük bir sorun değil :). Bütün diğer yazma fonksiyonlarının başındaki "Write" kısımlarını "Read" yapıp yukarıdaki kurala göre kullanabilirsiniz.

 

Bir de çoklu değer okumak için kullanılan fonksiyonlar var. Mesela "ReadSection" fonksiyonu.

 

ayarlar.ReadSection(bölümadı,liste);

 

Bu fonksiyon, "bölümadı" ile belirtilen bölümdeki tüm değişken isimlerini "liste" yerine vereceğiniz TStrings tipindeki yapıya kopyalar.

 

ayarlar.ReadSections(liste);

 

Bu fonksiyon "liste" ile verilen TStrings tipindeki yapıya dosyadaki bölüm isimlerini kopyalar.

 

ayarlar.ReadSectionValues(bölümadı,liste);

 

Bu fonksiyon da "bölümadı" ile belirtilen bölümdeki "değişken=değer" çiftlerini "liste" yerine verdiğiniz TStrings yapısına kopyalar.

 

Böylece fonksiyonlarımızın sonuna geldik. İşiniz bitince değişkeni serbest bırakmayı unutmayın.

 

ayarlar.Free;

 

TRegIniFile

 

Bu tip de TIniFile'ın değerleri kayıt defterinde saklayan versiyonudur. Bunu kullanmak için "Registry" unit'ini projenize dahil etmeniz gerekir. Kullanımında TIniFile'dan tek farkı bunu oluşturuken(create metoduyla) dosya adı yerine HKEY_CURRENT_USER ana anahtarı altında bir alt anahtar adı girmeniz gerekmesi. Bu istediğiniz kadar içerideki bir anahtar olabilir(örn: SoftwareMicrosoftWindows). Kayıt defteri ile daha detaylı bilgi için "Windows" başlığı altındaki "Kayıt Defteri" yazı diziine bakabilirsiniz. Diğer tüm fonksiyonlar ve kullanımları aynı. Yine işiniz bitince bunu da serbest bırakmalısınız. Kolay gelsin.

Event ve Sender KavramlarıEvent ve Sender Kavramları

 

 

 

Aşağıda TButton için tanımlanmış bir OnClick olayını görüyorsunuz.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

 ...

end;

 

 

ButtonClick olayında görüldüğü üzere TObject tipinde Sender değişkeni tanımlanıyor. Sender değişkeni ile hangi komponentin işlem gerçekleştirdiğini anlayabiliriz. Bçylelikle komponentin değişik işlevleri ve özelliklerine hükmetmemiz kolaylaşır. Bunun yanında TObject nesnesi ile yardımlaşıp farklı komponentlerin aynı Event procedurelerini kullanabilmelerini sağlayabiliriz.

 

Örneğin, aşağıdaki procedure tanımlamasını public bölümünde gerçekleştirdiğimizde, Object Inpector penceresinde Events penceresinden Click olaylarından MySenderDenemeClick seçilebilir.

 

 

 

procedure TForm1.MySenderDenemeClick(Sender: TObject);

begin

   . . .

 

end;

 

 

                Kısacası birden fazla nesnenin tek OnClick eventına hükmetmesi sağlanmış olur. Örneğin birden fazla butonun Clickini tek Click eventına bağlayıp tek elden çalıştırabilirsiniz.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

 {Ortak kod tanımlamalarını yazabilirsiniz.}

 {...}

if Sender = Button1 then

  ShowMessage('Button1 click olayı !')

 else if Sender = MenuItem1 then

  ShowMessage('MenuItem1 click olayı!')

 else

  ShowMessage('Farklı bir nesne click olayı !');

end;

 

 

Genelde kullanılan yaklaşım nesnenin adından kontrol gerçekleştirmektir.

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  Button1Click(Button2);

  {' 'Farklı bir nesne click olayı !' sonucunu döndüren kod}

end;

 

 

   "is"  Kavramları "as"

 

Sender TObject nesnesinden türediğinden, herhangi bir nesne Sender üzerinden işlem yapabilir. "is" kullanımı ile hangi nesneden geldiğini kontrol edebiliriz.

 

if Sender is TButton then

  Yapılacak işler

else

  Değilse yapılacak işler;

 

 

 

Aşağıdaki kodda sender için Edit1 nesnesi kullanılmıştır.

 

procedure TForm1.Edit1Exit(Sender: TObject);

begin

 Button1Click(Edit1);

end;

 

 

Yukarıdaki kodda  ShowMessage('Farklı bir nesne click olayı !'); yerine aşağıdaki kodu eklediğimizde TEdit nesnesini kontrol etmiş oluruz.

 

{... else}

begin

 if Sender is TButton then

   ShowMessage('Farklı bir nesne olayı...')

 else if Sender is TEdit then

   with Sender as TEdit do

    begin

     Text   := 'Edit1Exit olayı gerçekleşti';

     Width  := Width * 2;

     Height := Height * 2;

    end {begin with}

end;

______________________________________________--

 TListView bileşeni

Makaleler TListView bileşeni ve Pratik Kullanımı TListView bileşeni ve Pratik Kullanımı

Explorer tarzı bir görünüm sağlayan bu bileşeni bir çok uygulamada kullanabilirsiniz. Bu bileşenin kullanımı hakkında detaylı bilgi, çeşitli tüyolar ve bir kaç güzel fonksiyon ilginizi çekerse buyrun okuyun :)

İçerik Başlıkları

 

 TListView

TListView

 

 

Öncelikle TListView bileşenin ne olduğunu iyice açıklayalım. Bu bileşen Explorer penceresinde gördüğünüz, dosyaların, klasörlerin gösterildiği yerle aynı özelliklere sahip olan bir bileşen. Yani bu bileşenin içinde çeşitli alt birimler oluşturup bunlara bir simge ve başka alt bilgiler ekleyip, şık bir şekilde ekrana yansıtabiliriyorsunuz. Bu bileşen "Win32" kategorisi altında bulunuyor.

 

Hemen söyleyelim öğelerin yönetimi oldukça kolay. TStringList'ten bildiğimiz Add, Delete gibi metodların biraz değiştirilmiş hallerini burada da kullanabiliyoruz. Bir farkla, burada ekleme fonksiyonu parametre almıyor ve dönüş değeri olarak da eklenen öğeye ait bir adres ya da daha anlaşılır bir şekilde TListItem tipinde bir değişken döndürüyor. Bu değişken sayesinde yeni eklenen öğeyi rahatça düzenleyebiliyoruz. Bu bileşeni simgelerle birlikte kullanmak isterseniz(ki başka türlü çok da güzel görünmüyor zaten ) formunuza bir "TImageList" bileşeni eklemeniz gerekiyor. Hatta iki tane eklemelisiniz. Bunlardan biri 32x32'lik büyük simgeleri taşırken diğeri de 16x16'lık küçük simgeleri taşıyacak. TListView bileşeninin "LargeImages" ve "SmallImages" özelliklerini ilgili ImageList'lerle ilişkilendirmeyi unutmayın.(Özellikler bölümünden ilgili ImageList'i seçin.)

 

Gelelim TListItem'ın nasıl birşey olduğuna. Bunu iyi bilmelisiniz çünkü TListView bileşeninin tüm öğeleri bu tipte. Hemen özelliklerini tek tek inceleyelim:

 

Caption(string): Bu özellik adından da anlaşılacağı üzere öğenin başlık bilgisini, yani ekranda görüntülenecek olan metni tutuyor.(yenioge.Caption:='Adı';)

 

Checked(Boolean): Bu özellik -eğer TListView'un "checkboxes" özelliği true ise- öğenin tikli olup olmadığını belirtiyor.

 

Cut(Boolean): Bu özellik simgenin kesme işlemi yapıldığı sıradaki gibi yarı saydam görüntülenip görüntülenmeyeceğini belirtiyor.

 

DropTarget(Boolean): Bu özellik true yapıldığında, öğe bırakma-bölgesi olarak gösterilir ve ListView içindeki diğer tüm öğelerin bu özelliği false yapılır.

 

ImageIndex(Integer): Bu özellik öğenin ilişkilendirilmiş ImageList içindeki kaç numaralı resmi simge olarak kullanacağını belirtir. Değeri -1 olduğunda bir simge gösterilmez.

 

Index(Integer): Bu özellik öğenin ListView içindeki yerini belirtir. İlk öğenin Index'i 0'dır.

 

OverlayIndex(Integer): Bu özellik kulanılacak üst katman resminin(overlay image) ImageList içindeki yerini belirtir.

 

Selected(Boolean): Bu özellik öğenin seçili olup olmadığını belirtir. ListView içinde birden fazla öğe seçildiğinde öğenin seçili olup olmadığını bu özelliğine bakarak anlayabiliriz.

 

SubItemImages(Array of Integer): Bu özellik öğenin alt öğelerinin resim numaralarını tutar. Eğer alt öğelerin yanında resim görüntülemek istiyorsanız "SubItemImages[1]:=5" gibi bir ifadeyle bunu yapabilirsiniz. Burada köşeli ayraçlar arasındaki "1" alt öğenin indexini ve "5" de resim indexini belirtiyor.

 

SubItems(TStrings): Bu özellik alt öğeleri tutar. Alt öğe eklemek, silmek veya yönetmek oldukça basittir. Bir Memo ya da ListBox bileşeninin öğelerini yönetmekle hemen hemen aynıdır. TStrings tipini biraz bilmeniz yeterli.

 

Evet işimize yarayan özellikler bunlar. Şimdi ListView'a geri dönelim isterseniz. ColumnClick ve Columns adı altında 2 özelliğimiz var dikkat ettiyseniz. Bunlardan "Columns" ayrıntılı gösterimdeki sütunların isimlerini temsil ediyor. Yani örneğin her öğenizin 2 alt öğesi(subitem) var. O zaman "columns" bölümüne toplam 3 başlık eklemeniz gerekiyor. Birincisi öğenin adının bulunduğu sütunun adı, diğerleri de sırasıyla birinci ve ikinci alt öğelerin başlığı olacak. ColumnClick özelliğini true yaparsanız bu sütunlara tıklanabilecek ve siz bu tıklama olaylarını yönetebileceksiniz, ki bu iş genelde o sütundaki alt öğeye göre sıralama yapmak için kullanılır.

 

Ve son 2 önemli özelliğimiz, SortType ve ViewStyle. Sort type alfabetik sıralamanın neye göre yapılacağını belirtir. stNone bir sıralama yapmazken stName sadece başlıklara göre, stData alt öğelere göre, stBoth ise her iki bilgiye göre sıralama yapar. Ayrıca bunu stNone yapıp kendi sıralama sisteminizi de geliştirebilirsiniz. Bunun için ListView bileşeninizin onCompare olayına bir kaç kod yazmanız gerekiyor. Ayrıca sıralama fonksiyonunun çalışması için de "AlphaSort" metodunu çağırmalısınız.(Listview1.AlphaSort;) onCompare olayında size 2 tane TListItem öğesi veriliyor ve siz buraya yazacağınız kodla hangisinin daha önce gelmesi gerektiğini belirtiyorsunuz. Eğer Item1 daha önce gelmeliyse Compare değerini sıfırdan küçük, daha sonra gelmeliyse Compare değerini sıfırdan büyük yapmalısınız. Eğer ikisi de eşitse o zaman bu değeri 0 yapmanız gerekiyor. ViewStyle özelliği de aktif olan gösterim tipini belirtiyor. vsIcon bildiğiniz "Büyük Simge" gösterimi, ve burada LargeImages'a bağlı ImageList kullanılıyor. Diğer tüm modlarda SmallIcons'a bağlı ImageList kullanılıyor. vsSmallIcons, küçük simgeler; vsList, liste ve vsReport, ayrıntılı gösterimi temsil ediyor. Bu değerleri program çalışırken de değiştirip farklı görünümler arasında geçiş yapabilirsiniz.

 

Evet, bu kadar ön bilgiden sonra sanırım ListView bileşenimize çalışma zamanı nasıl öğe ekleyip, bunları nasıl yöneteceğimizi öğrenmeye hazırız. Öncelikle TListItem tipinde bir değişken tanımlamalısınız. Daha sonra TListView.Items.Add fonksiyonuyla oluşturmalı, değişkenimize bağlamalı ve gerekli düzenlemeleri yapmalısınız.

 

Bir ListView bileşeninde toplu ve büyük değişiklikler yapmadan önce "BeginUpdate" ve bu işlemlerin sonunda da "EndUpdate" metodlarını çağırmak işlem hızını oldukça arttıracaktır. Bu komutlar her değişiklik olduğunda ekranın güncellenmesini engeller ve sonra işiniz bittiğinde tüm değişikliğin bir defada gösterilmesini sağlar. ListView'un "Clear" metodu, ListView'un içini güzelce temizler :). Ayrıca istediğiniz öğeyi silebilir, öğelerin yerini değiştirebilir ve daha başka birçok şey yapabilirsiniz. Hepsini burada anlatmam inanın çok zor. Yalnız yazıyı bir örnekle bitirmek istiyorum.

 

Örneğimiz bir TStringList içinde depolanmış dosya isimlerini ListView içinde göstermek. Ayrıca bu dosya isimlerinde dosya yolları da var ve biz bunu ayırıp her dosyanın ilk alt öğesinin bu dosyanın yolunu göstermesini de sağlayacağız.

 

Bunu yapmadan önce ImageList'imize istediğimiz simgeleri eklemeliyiz. Bunu yaptıktan sonra kodlara geçebiliriz:

 

var

yeni:TListItem;

i:integer;

begin

  ListView1.Items.BeginUpdate; //bahsettiğimiz güncelleme başlangıcı

  ListView1.Clear;  //temizleyelim

  for i:=0 to dosyalar.Count-1 do //TStringListimizin adının "dosyalar" olduğunu varsayalım

  begin

    yeni:=Listview1.Items.Add; //yeni öğeyi ekleyip ve rahatça düzenlemek için adresini değişkenimize atadık.

    yeni.Caption:=ExtractFileName(dosyalar[i]); //başlığını dosya adı yaptık

    yeni.SubItems.Add(ExtractFilePath(dosyalar[i]); //yolunu alt öğe olarak ekledik

    yeni.ImageIndex:=1; //burası size kalmış, resim indexi

  end;

  ListView1.Items.EndUpdate; //değişiklik yapmayı bitirdik

end;

 

Evet yukarıdaki örnek kodların da yardımıyla TListView bileşenini daha rahat ve etkin kullanabileceğinizi umuyorum. Kolay gelsin...

 

TListBox Üzerine TEdit Yerleştirmek

TListBox görsel nesnesinin görevi string tipteki verileri collection olarak scroll kullanma imkanı vererek listeleyebilmesidir. Ancak listede verilen string ifadeleri edit yapabilmek mümkün değildir. Bu işlemi gerçekleştirmek için nesnemize TEdit yerleştirebilirsek bunu başarabiliriz.

 

 

 

                Formun OnCreate olayında Tedit nesnemizi dynamic olarak create edebiliriz. TListBox nesnesinin OnClick olayında TEdit nesnesini koordinatlarını belirterek yerleştirmemiz gerekir. Ayrıca TEdit içerisinde enter tuşu kullanıldığında da eski bilgi yerine yeni bilgiyi insert yapmamız gerekir. Şimdi kaynak kodu görelim:

 

 

 

type

   TForm1 = class(TForm)

     ...

   private

     ListEdit : TEdit;

     procedure ListEditKeyPress(Sender: TObject; var Key: Char) ;

   end;

 

...

 

procedure TForm1.FormCreate(Sender: TObject) ;

begin

   ListEdit := TEdit.Create(self) ;

   ListEdit.Visible := false;

   ListEdit.Ctl3D := false;

   ListEdit.BorderStyle := bsNone;

   ListEdit.Parent := ListBox1;

   ListEdit.Width := ListBox1.ClientWidth;

   ListEdit.OnKeyPress := ListEditKeyPress;

end;

 

procedure TForm1.ListBox1Click(Sender: TObject) ;

var

   ii : integer;

   lRect: TRect;

NASIL YAZILIMCI OLUNUR

 

 

İnsan bir çay poşetine benzer; Sıcak suyun içine atana kadar gerçek rengini bilemezsiniz.

 

Nasıl Yazılımcı Olunur?

 

 Yazılım yazmak aynı zamanda teknik bir iştir. Program yazmak isteyen tüm arkadaşlarımın, alt kısımlarda yazacaklarımı dikkatle okumasını istiyorum. Yazdıklarım tamamen benim ifade özgürlüğümdür.

 

Yazılım yazmak kolay gibi görünsede uğraş isteyen bir meslektir. Zor değildir fakat kesinlikle bazı durumlarda çok sabır gerektiren bir meslektir.  Yazılım yazmak için bir kere sabırlı olmak gerekir. Yazılım yazmaya başlamadan önce mutlaka araştırın. Sizlere bazı kaynaklar yazacağım. Bu kaynakları bilgisayarınıza indirip bir cd haline getirmenizi öneririm.

 

Evet başlıyoruz...

 

1. Elinizde program yazmak için bir uygulama yoksa Delphi 7 Data Architect Trial versiyonunu indirin. Program yazmak için Delphi dilini kullanacağız.

 

2. Size yön gösterecek ve bazı kaynakları nasıl kullanacağınız konusunda hazır kod programları lazım, tüm yazılımcıların mutlaka kullandığı meşhur Kodbank 3.1 i (3.57 Mb.) indiriniz. Kodbank 3.1 in içerisinde sadece gönüllü üyeler tarafından verilmiş örnek kodlar vardır. Tabii kodbankasını kullanabilmek için pasaportum üyesi olmanız gerekir. Üyelik ücretsizdir.

 

3. Delphicilerin buluştuğu bir platformun Delphi Türkiye Off Line V3 (20.10 Mb.) (yani yardım dosyasını) indiriniz. Delphi Türkiye sitesinin full halini bu programla kullanabilirsiniz.

 

4. Yine Delphi Türkiye tarafından hazırlanmış bulunan Power Point Sunularını (2.32 Mb.) ek kaynak olarak indirebilirsiniz.

 

 

 

5. Eğer veritabanı kavramını Türkçe olarak ve kolay anlamak istiyorsanız (kişisel önerim) mutlaka size Advantage Veri Tabanı Yöneticisi Türkçe yi (3.59 Mb.) öreririm. (sonraki makalelerimde bil hassa ele alacağım)

 

6. www.enderarslanturk.com.tr  Programlama kısmını sürekli ziyaret ediniz. İleriki zamanlarda aşama aşama bilgiler bulabileceksiniz. Ayrıca bu sayfayı bir çok arkadaşınıza önerebilirsiniz.

 

Bunların haricinde inanılmaz delphi kaynakları mevcuttur. Ayrıca şunuda belirtmek isterimki diğer program yazma dillerine oranla delphi programlamaya ait kaynaklar daha fazladır. Kendim delphi programlamacısı olduğum için böyle düşünüyorum. Eğer yanılıyorsam pcim çöksün.

 

Delphi Türkiye Video Seminerleri:

 

1.  Delphi IDE (19.60 Mb.)

2.  Object Pascal (13.43 Mb.)

3.  İleri Object Pascal (28.53 Mb.)

4.  Component hiyerarşisi ve component yazma (18.52 Mb.)

5.  Veritabanı (17.27 Mb.)

6.  SQL (35.86 Mb.)

7.  Interbase/Firebird veritabanları (18.79 Mb.)

8.  DelphiTurkiye.com daki makale'nin pratik bir uygulamasi (20.19 Mb.)

9.  Raporlama (15.98 Mb.)

10. Delphi 8 (Delphi .net) ve .net framework (8.61 Mb.)

11. Data modelleme (23.02 Mb.)

12. Sybase Power Designer data modelleme (15.43 Mb.)

13. Örnek olaylar üzerinde İleri SQL (22.40 Mb.)

14. Modellemesi yapılan programın Delphi tarafında IBX ve FireBird ile sıfırdan yazılması (44.27 Mb.)

 

Teknik bir arızadan dolayı 13. ve 14. seminerlerde ses yoktur. Hem Delphi Türkiye Off Line V3 dosyasını yapmalarından dolayı hem de video seminerler için Delphi Türkiye ekibine teşekkür ederim.

 

Veritabanı yani bilgilerin tutulacağı alt yapıya sıra gelince size ilk bakışta alt yapı kullanımını rahatlıkla anlamanız için Advantange Database 'i öneririm. Advantage Database için, Türkiye distribitörlüğü tarafından hazırlanan Advantage Veritabanı Yöneticisinin Türkçe arayüzünü kullanabilirsiniz. Kullanımı gayet kolay ve basittir. Hatta veritabanı için hazırlanmış video seminerleri mutlaka indirip arşivinize ekleyiniz. Advantage Database ile ilgili ileriki zamanlarda ek bilgileri programlama kısmında bulabileceksiniz.

 

Advantage veri tabanına ait video seminerler:

 

1. Veritabanı yöneticisi ile veri tabanı oluşturma (203.94 Kb.)

2. Veritabanı yöneticisi ile tablo oluşturma (343.34 Kb.)

3. Veritabanı yöneticisi ile kullanıcı ve gruplarla çalışmak (193.48 Kb.)

4. Delphi bileşenleri ile tablolara bağlantı (174.54 Kb.)

5. Delphi bileşenleri ile advantage bağlantısı (207.81 Kb.)

 

Advantage veri tabanı için çok geniş bilgi içeren pdf formatında (acrobat reader) kullanım kitapçığı (1.44 Mb.) hazırlanmıştır.

 

Burada vermiş olduğum bilgilerin haricinde belirttiğim üzere daha nice kaynaklar mevcuttur. Mesela SQLNedir.com internet siteside bunlardan biridir.  Oda ne site devre dışı.

 

Arkadaşlar bildiğiniz kaynakları buraya yazabilirsiniz. Sıra dışı kaynakların olmasında fayda vardır. İndiren arkadaşlar yorum yazabilirler mi

 

Hepinize çalışmalarınızda başarılar dilerim.

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

 

Assembly'e Giriş

İşte en alt seviye programlama dili olan, hatta tam bir programlama dili bile olmayan Assembly'e başlayabilmeniz için anlaşılır ve pratik bir giriş yazısı...

 

İçerik Başlıkları

      Giriş

Giriş

 

Öncelikle hemen söyleyeyim bu yazı programlamayla EN AZ orta seviye ilgilenenlere yöneliktir. Yani bu kritere uymuyorsanız bence hiç bulaşmayın, sonra program yazma işinden tiksinebilirsiniz :). Tabi tiksinme kısmı şaka ama yine de size çok sıkıcı gelebilir. Neyse uzatmadan başlayalım yazımıza.

 

Programlarınızı yazdığınız ortamları merak ettiniz mi hiç? Acaba onlar nasıl yapıldılar? Ya da ilk programlama dili nasıl ve hangi dille yazıldı(biliyorum biraz garip bir cümle oldu)? İşte bütün bu sorulara genel olarak verilebilecek cevap ASSEMBLY'dir. Assembly, aslında makina dili diye de geçer. Bu dili kullanırken -ki aslında tam olarak bir dil demek de yanlış- işlemcinin temel komut setinde ne varsa onları kullanırsınız. Aynı zamanda bildiğiniz şekilde değişken oluşturma ve yönetme şansınız da yoktur(Örn "int i=10;" gibi komutlarınız yok). Tabi bunlar yüzeysel yorumlar. Çünkü Assembly kullanırken bütün bunları -birçok fonksiyon, değişken yönetimi vs.- siz yaparsınız. Yani bir değişkenin saklanacağı bellek adresi, uzunluğu vs. tamamen sizin denetiminiz ve sorumluluğunuzdadır.

 

Şimdi önce isterseniz gelin programlama dillerinin sınıflandırılmasına bakalım. Programlama dilleri makinaya yakınlığından insana yakınlığına göre sıralanır. Mesela .NET dillerinden C# insana en yakın dillerden biridir. Bir çok alt seviye işlem derleyici tarafından otomatik yapılır veya yapılması için gerekli kod programa eklenir. Bunun yanında C en alt seviye dillerden biridir. Bellek denetimi gibi şeyler programcıya bırakılmıştır ama bu dille yapabilecekleriniz ve alacağınız performans C#'tan çok daha fazla olacaktır. İşte assembly bu sınıflandırmada makinaya en yakın yerde bulunuyor. Eğer bu dili iyi öğrenirseniz ve kullanabilirseniz deyim yerindeyse bilgisayara takla bile attırabilirsiniz.

 

Bilgisayarlar verileri 2'lik sistemde işler ancak 16'lık sistemde saklarlar. Örneğin 2 sayıyı toplamak istediğinizde bunlar işlemciye bitler şeklinde iletilir ki bu 2'lik sistemdir. Ancak bunları bir dosyaya yazmak isterseniz bu sefer bir byte'lık alanlara yazarsınız ki bu alanlardaki bilgiler de 16'lık sistemde saklanır. Biz de bilgisayarda artık EN ALT seviyede uğraşacağımıza göre bu sistemleri iyi bilmeli, bu sistemler ve 10'luk sistem arasındaki dönüşümleri rahatça yapabilmeliyiz.

 

Bilgisayarda saklanan ve işlenen verilerden bahsetmişken hemen bunların çalışan programlar için nerelerde yapıldığına bakalım. Normal dillerle yazılan programların tamamı değişkenleri bellekte saklar. Her değişkene ait bir bellek adresi vardır. Hatta pointerlar'la haşır neşir olanlar bu bellek adresilerini anımsayacaklardır. İşte assembly kullanırken bu pointerlar bizim değişkenlerimizi temsil edecek dersek çok da yanlış olmaz. Ancak işlemci komutları genelde doğrudan bellek üzerinde işlem yapmak yapmak yerine genelde REGISTER adını verdiğimiz işlemci çekirdeği üzerindeki sabit değişkenler üzerinde değişiklikler yaparlar.

 

Bellekle ilgili bilmeniz gereken bir başka şey ise belleğin segmentlere ayrılmış olduğudur. Segment sözcüğünü dilimize kabaca KATMAN olarak çevirebiliriz. Bu katmanlarda benzer tip veriler bir arada tutulur. Örneğin Code Segment(CS)'ta programınızın kodları bulunurken Data Segment(DS)'ta kullandığınız bazı değişkenlerin verileri tutulur. Bunların yanında Stack Segment(SS) ve Extra Segment(ES) gibi başka katmanlar da bulunur. Tüm bu katmanların başlangıç adresleri yanlarında parantez içinde belirttiğim kısaltmalarla aynı adlardaki özel registerlarda tutulur. Bunları yeri geldiğinde göreceğiz. Segmentlerin içindeki hücrelere ulaşmak için de offsetleri(adresleri) kullanırız. Veri yazma ve oku işlemleri DS üzerinde yapılır. O zaman biz bir bellek okuması veya yazması yapacağımız zaman sadece işlemi yapacağımız offseti bilmek zorundayız. İşlemci otomatik olarak DS'de tutlan değere bizim verdiğmiz offset değerini ekler ve ilgili hücreye veriyi yazar yada bu hücreden veriyi okur.

 

Assembly dilindeki komutlar yani işlemcinin temel komutları genelde 2 parametre kullanır -ki bunlara artık OPERAND diyeceğiz- ve bunlar register adı, bellek bölgesi ya da sabit bir sayı olabilirler. Örnek vermek gerekirse: MOV komutu bri register ya da bellek bölgesine değer atamak için kullanılır. İlk operand atama yapılacak bellek bölgesi ya da register adı, ikinci operand da oraya atanacak değeri içeren bir başka bellek bölgesi, register ya da sabit sayı olabilir. Yeri gelmişken operandları ayırmak için aralarına ","(yazıyla=virgül, rakamla=?!?! ) koyuluyor. O zaman offseti 100 olan bellek bölgesine 10 değerini atamak için "MOV [$64],$0A" komutunu vermemiz gerekiyor. Dikkat ettiyseniz 100 yerine $64 ve 10 yerine de $0A yazdım. Çoğu assembler(asm kodlarını derleyen program) direk onluk tabandaki sayıları kabul eder ve siz 16'lık tabanda bir sayı girmek istediğiniz zaman başına $ işaretini koymanızı ister. Ancak debug gibi basit ve alt seviye bir derleyici kullanırsanız bütün sayılar standart oalrak 16'lık sitemde yorumlanacaktır. Bu arada komutta da gördüğünüz gibi bellek bölgelerine ulaşmak veya oralarda işlem yapmak için offsetini köşeli parantez içinde yazmamız gerekiyor. Ve son olarak o komut aslında hatalı. Çünkü bellek bölgesine byte cinsinden mi word(2 byte'lık veri) cinsinden mi yazacağımızı belirtmedik. O ne ki derseniz hemen açıklayayım. Bellek bölgeleri aslında 1 word'lük kapasiteye sahiptirler ancak oralara sabit sayılar atanırken 1 byte uzunluğundaki veriler de yazılabilir. Bunu açıklığa kavuşturmak için operandlardan önce "BYTE PTR" ya da "WORD PTR" yazmamız gerekiyor. Vay be, bir komutla amma çok şey anlatmış oldum!

 

Aslında buraya öyle detaylı bir kullanım rehberi ya da birçok komutun kullanım şeklini falan yazmayı düşünmüyorum. Çünkü hem ben o konuda anlatabilecek kadar yetkin değilim hem de zaten bu yazının amacı giriş yapmanızı sağlamak. Zaten sadece assembly kullanarak bir program yazmak aslında biraz çılgınlık (kabul ediyorum zamanında 16bitlik programlar yazdık biz arkadaşımla ama cidden kafayı yeme noktasına geldik ). Bu sebeple buradan öğrendiğiniz genel bilgiler ve komutları öğrenebileceğiniz bir kaynağın da yardımıyla programlarınızda hız artışı veya boyut azaltışı(!) yapabilirsiniz.

 

Bu kadar gevezelikten sonra genel kullanım ve birkaç komut açıklamsıyla yazımızı bitrelim. Daha önce de dediğim gibi burada komutlardan sonra operand giriyorsunuz. Bazı komutlar operandsız da olabiliyor. Ve bir komut en çok 2 operand alabiliyor(aslında daha çok alan da olabilir ama bildiğim kadarıyla 2 ile sınırlı). Daha önce bahsettiğim MOV komutu 2 operand alır. İlk operand atama yapılacak yeri belirtirken ikinci operand atama yapılacak değeri belirtir. Buraya sabit bir sayı yazabileceğinizi gibi birbellek bölgesi ya da register adı da yazabilirsiniz.

 

XOR komutu ilk operand ile ikinci operandı XOR mantıksal işleminden geçirir ve sonucu ilk operanda atar. AND, OR gibi diğre mantıksal operasyon komutları da aynı şekilde çalışır.({a:=a xor b} deyimi assemblyde {xor a,b}'ye denk gelir)

 

PUSH komutu arkasından verilen operandın değerini bellek yığınına atar ve arkasından çağırılan POP komutuyla bu değeri POP komutunun operandına geri yükler. Yanlız burada işlemin sırayla olduğunu unutmamanız gerekiyor. Yani

 

PUSH EAX

PUSH EBX

.

.

POP EAX

POP EBX

 

gibi bir komut yazarsanız EAX'ın değeri EBX'e, EBX'in değeri de EAX'a atanmış olur. Çünkü en son EBX'in push edilmesine rağmen ilk POP işleminde EAX kullanıldı. Özetlersek ilk giren son çıkar ya da son giren ilk çıkar diyebiliriz.

 

CMP komutu kıyaslama yapmak için kullanılır. Verilen ilk opranddan ikinci operand çıkartılır ancak operandların değerlerinde bir değişiklik olmaz. Bu işlem sadece FLAG adı verilen bazı kontrol bitlerinin değerlerinin değişmesine sebep olur ki bu da zaten kıyaslama sonucunda yapılacak işlemi berlemek için yeterlidir. Şöyle ki: burada BASIC'tenbildiğiniz "GO TO"ya benzer bir yapı kullanılıyor. Yani şu şöyleyse buraya git ve oradan devam et gibi bir yapı var. Bunları da GO TO değil JMP, JNZ gibi atlama komutlarıyla yapıyorsunuz. JMP komutu hiçbir koşul gözetmeden operand olarak verilen adrese atlar ve oradan devam eder. JNZ ise "Zero Flag"i olarak geçen ve son işlemin sonucu 0 ise değeri 1 yapılan bir bitin değerine göre atlama yapar. CMP işleminde de iki operandın değeri birbirinden çıkarıldığında sonuç sıfır ise bu iki değer birbirine eşit demektir ki bu durumda JNZ komutu(Jump if Not Zero) hiçbirşey yapmaz çünkü "Zero Flag"i 1'dir. Yani sonuç sıfırdır. JZ komutu ise JNZ'nin tam aksine Jump if Zero yani sonuç sıfırsa şu adrese git anlamına gelir. Yine az önceki durumu düşünürsek bu komutu kulanırsanız program belirtilen adrese sıçrayacak ve buradan devam edecektir.

 

Son olarak for ve/veya while döngülerine karşılık gelen LOOP komutunu da verelim. For döngülerinde kullandığınız değişken sanırım genel de "i" oluyor. Burada ise bu iş için standart olarak ECX register'ı kullanılıyor. Bu register'a döngünün kaç kez çalıştırlacağını atadıktan sonra işletilecek komutların sonuna LOOP {adres} komutunu yazıp adres olarak da komutların başlangıç adresini verirseniz tam bir for döngüsü elde etmiş olacaksınız. Yalnız burada dikkat etmeniz gereken birkaç nokta var. Öncelikle döngü komutu içerisinde ASLA ECX'in değerini değiştirmemelisiniz. Değiştirmek zorunda kalırsanız da mutlaka PUSH ve POP komutlarını gerekli şekilde kullanıp orijinal değerini geri döndürmeniz gerekir. Aksi takdirde döngünün uzunluğu alakasız şekilde değişebilir. İkinci olarak, LOOP'a operand olarak verdiğiniz adres ECX'registerına döngü sayısını atadığınız yerden sonra olmazsa programınız sonsuz döngüye girer. LOOP'un 2 farklı versiyonu daha var: LOOPZ ve LOOPNZ. Bunlar da hem ECX'in değerine bakıyorlar hem de "Zero Flag"inin değerine. LOOPZ, Loop if zero; LOOPNZ ise loop if not zero yani LOOPZ sıfır olduğu sürece, LOOPNZ de sıfır olmadığı sürece döngüye devam et anlamına geliyor. Eğer döngü içinde bir CMP işlemi varsa bu komutlardan birini kullanarak döngü sayısı bitmeden döngüden çıkılmasınıa sağlayabilirsiniz.(Bu da döngü içinde kullandığımız "break;" komutuna benziyor.)

 

Evet arkadaşlar biraz dağınık bir yazı oldu, farkındayım. Ama bu kadar geniş ve zor bir konuyu basitçe anlatmak benim için gerçekten çok zor. Ne kadar detaya gireceğimi, hangi komutlardan nasıl bahsedeceğimi belirlemek zor oldu. Umarım yararlı bir yazı olmuştur. Bir de bitirmeden önce bu yazıyı yazmama yardımcı olan değerli arkadaşlarım Yaman UMUROĞLU ve Şenol ÖZKAN'a buradan teşekkürlerimi yolluyorum. Bir sorunuz olursa e-posta adresim aşağıda, çekinmeden mektup yollayabilirsiniz.

 

Delphi - .....................................

 

Renk paletlerinin hazırlanması ve kullanımı

Renk Paletlerinin yaratılması ve kullanımı

Delphi uygulamasında çizim yapılırken, gereken paletin yaratılması ve kullanılması nasıl olur?

Eğer palet değiştirme yolu ile animasyon yapılacaksa, en az 256 renk modunda çalışılmalı ve, aşağıdaki kod örneğinde geçen bütün PC_NOCOLLAPSE değerleri PC_RESERVED olarak değiştirilmelidir.

Palet yaratmanın yanı sıra, yapılması gereken diğer işlemler de şunlardır.

1. Formun GetPalette davranışı,yeni paleti döndürecek şekilde değiştirilmelidir.

2. Boyamaya başlamadan hemen önce, yeni palet seçilmelidir.

OldPal := SelectPalette(Canvas.Handle, NewPalette, False);

RealizePalette(Canvas.Handle);

SelectPalette(Canvas.Handle, OldPal, False);

3. İşlem tamamlandıktan sonra palet yok edilmelidir.

4. Renk değeri almak için, RGB fonksiyonu yerine PaletteRGB fonksiyonu kullanılmalıdır.

function CreateIdentityPalette(const aRGB; nColors : Integer) : HPALETTE;

type

QA = Array[0..255] of TRGBQUAD;

var

Palette : PLOGPALETTE;

PalSize : Word;

ScreenDC : HDC;

I : Integer;

nStaticColors : Integer;

nUsableColors : Integer;

begin

PalSize := SizeOf(TLOGPALETTE) + SizeOf(TPALETTEENTRY) * 256;

GetMem(Palette, PalSize);

try

with Palette^ do

begin

palVersion := $0300;

palNumEntries := 256;

ScreenDC := GetDC(0);

try

if (GetSystemPaletteUse(ScreenDC) = SYSPAL_NOSTATIC)

then

begin

{$R-}

for i := 0 to (nColors-1) do

with palPalEntry[i], QA(aRGB)[i] do

begin

peRed := rgbRed;

peGreen := rgbGreen;

peBlue := rgbBlue;

peFlags := PC_NOCOLLAPSE;

end;

for i := nColors to 255 do

palPalEntry[i].peFlags := PC_NOCOLLAPSE;

I := 255;

with palPalEntry[i] do

begin

peRed := 255;

peGreen := 255;

peBlue := 255;

peFlags := 0;

end;

with palPalEntry[0] do

begin

peRed := 0;

peGreen := 0;

peBlue := 0;

peFlags := 0;

end;

{$R+}

end

else

begin

nStaticColors := GetDeviceCaps(ScreenDC, NUMRESERVED);

GetSystemPaletteEntries(ScreenDC, 0, 256, palPalEntry);

{$R-}

nStaticColors := nStaticColors shr 1;

for i:= 0 to (nStaticColors-1) do

palPalEntry[i].peFlags := 0;

 

nUsableColors := nColors - nStaticColors;

for I := nStaticColors to (nUsableColors-1) do

with palPalEntry[i], QA(aRGB)[i] do

begin

peRed := rgbRed;

peGreen := rgbGreen;

peBlue := rgbBlue;

peFlags := PC_NOCOLLAPSE;

end;

for i := nUsableColors to (255-nStaticColors) do

palPalEntry[i].peFlags := PC_NOCOLLAPSE;

 

for i := (256 - nStaticColors) to 255 do

palPalEntry[i].peFlags := 0;

end;

finally

ReleaseDC(0, ScreenDC);

end;

end;

Result := CreatePalette(Palette^);

finally

FreeMem(Palette, PalSize);

end;

end;

 

procedure ClearSystemPalette;

var

Palette : PLOGPALETTE;

PalSize : Word;

ScreenDC : HDC;

I : Word;

const

ScreenPal : HPALETTE = 0;

begin

PalSize := SizeOf(TLOGPALETTE) + SizeOf(TPALETTEENTRY) * 255;

GetMem(Palette, PalSize);

try

FillChar(Palette^, PalSize, 0);

Palette^.palVersion := $0300;

Palette^.palNumEntries := 256;

{$R-}

For I := 0 to 255 do

With Palette^.palPalEntry[i] do

peFlags := PC_NOCOLLAPSE;

{$R+}

ScreenDC := GetDC(0);

try

ScreenPal := CreatePalette(Palette^);

if ScreenPal <> 0

then

begin

ScreenPal := SelectPalette(ScreenDC,ScreenPal,FALSE);

RealizePalette(ScreenDC);

ScreenPal := SelectPalette(ScreenDC,ScreenPal,FALSE);

DeleteObject(ScreenPal);

end;

finally

ReleaseDC(0, ScreenDC);

end;

finally

FreeMem(Palette, PalSize);

end;

end;

 

Delphi - .....................................

Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol