.INC Dosyası Kullanımı

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1061
Kayıt: 01 Nis 2007 01:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

.INC Dosyası Kullanımı

Mesaj gönderen Lost Soul » 17 Mar 2010 01:55

Dün yazdığım bir unit 7000 satırı bulunca bu uniti nasıl sadeleştirirm diye düşünürken .inc tavsiye üzerine inc dosyalarını inceledim. Ve sonucu sizinle paylaşmak istedim.
INC Dosyaları nedir.
INC ( INCLUDE) Dosyaları rutin kullanılan ve hiç değişmeyen kodları yazıp projenin herhangi bir yerine dahil edebileceğiniz
kod dosyalarıdır.
Bu açıklamaya göre Rutin kullanılan kodları zaten metod olarak yazıp istediğimiz yerden çağırabiliyorken neden bu dosyaya ihtiyaç duyalım denilebilir. Ancak burada include edilen sadece metot değildir. Kod bloğunda yazan herhangi birşey olabilir.

INC Dosyasını Adım Adım Örneklendirelim.
Başlangıç
Yeni bir proje olluşturup 1 Adet Edit ve 2 adet Button yerleştirelim.
Butonların on Click olayına aşağıdaki aşağıdaki gibi kodları yazalım.
İşimiz bittiğinde şöyle bir unit olması gerekiyor.

Kod: Tümünü seç

unit fmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := 'Merhaba';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s : String;
begin
  s:=Edit1.Text;
  Showmessage(S);
end;

end.
Şimdi burada Button1 deki kodu proje klasörümüzde Edit1.inc diye bir dosya oluşturup o dosyanın içine atalım.
Edit1.inc

Kod: Tümünü seç

Edit1.Text := 'Merhaba';
Edit1. Click olayına ise aşağıdaki kodu yazalım

Kod: Tümünü seç

{$I Edit1.inc}
Böylece Unitimiz şöyle olacaktır.

Kod: Tümünü seç

unit fmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$I Edit1.inc}
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s : String;
begin
  s:=Edit1.Text;
  Showmessage(S);
end;


end.
yukarıdaki kod bloğu derleyici için ilk yazdığımızdan farksızdır. Unit derlenirken $I ile belirtilmiş inc dosyasındaki kod derlemeye eklenecek ve kaldırğı yerden diğer kodları eklemeye devam edecektir.
Şimdi daha da ileri gidip Button2click'deki s değişkenine atadığımız değeri inc dosyasından yazdıralım.
bunun için s.inc diye bir dosya oluşturup showmessage(s) deyimini bu dosyaya kaydedip projemizden silelim.
s.inc

Kod: Tümünü seç

Showmessage(S);

Kod: Tümünü seç

unit fmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$I Edit1.inc}
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s : String;
begin
  s:=Edit1.Text;
  {$I s.inc}
end;


end.
inc dosyasına alışamayanlar için biraz garip bir kod oldu değil mi :)
yani s.inc dosyasında ShowMessage(s) yazıyor. ne uses var ne procedure var
bu s nerden geldi nereye gidiyor soran eden yok. üstelik program hala çalışıyor :)

şimdi biraz daha cüreetkar olalım :)


s.inc dosyası

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  s : String;
begin
  s:=Edit1.Text;
  Showmessage(S);
end;
unitimizin son hali

Kod: Tümünü seç

unit fmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$I Edit1.inc}
end;

  {$I S.inc}

end.
yok artık. Bu kod da çalışır mı?.... :D
çalışıyor :mrgreen:

Peki nasıl çalışıyor?
inc dosyasını programın herhangi bir yerinde $I ile çağırdığınızda program projeyi derlerken çağrılan dosyayı
çağrıldığı satırdan itibaren derlemeye dahil edip $I satırı bittikten sonra kalan kodu tekrar derlemeye dahil ediyor.
Yani $i nereye yazılırsa o kaynak koda ekleniyor.
E madem koda derleme esnasında ekleniyor o zaman bellek ve dosya boyutu açısıından bize getirisi yok varsın unitim 2 satır fazla olsun incsiz olsun.

Kod: Tümünü seç

El-Cevap.
Mesela bir projenizde 15-20 tane formunuz var.
Ve bu formlarınızın hepsinde ya da büyük bir kısmında rutin olarak kullandığınız bir metod var.
Örneğin form key press bu örneğimiz için oldukça belirgin bir emsal.

Kayıt işlemlerinin yapıldığı tüm foormlarda key up ya da down işlemine şöyle bir kod yazdık diyelim.

Kod: Tümünü seç

  if shift=[] then
  begin
    case key of
      vk_f1:btnyeni.Click;
      vk_f4:btnduzenle.Click;      // Düzenle
      vk_f2:btnkaydet.Click;      // Kaydet
      vk_f6:btnvazgec.Click;      // Vazgeç
      vk_f3:btnsil.Click;      // Sil
      vk_escape:btnKapatx.Click;  // Kapat
      vk_f11:btnlistele.Click;
    end;
  end;
bu kod atıyorum 15 tane formunuzda var.
bu 15 kere aynı kodun yazılmış olması demek.
peki dediniz ki ben bu formlarda page up page down ile kayıtlar arası önceki kayıt sonraki kayıt, ctrl+page up page down ile de ilk kayıt son kayıt şekline getirmek istiyorum.
haliyle şöyle bir kod yazacaksınız

Kod: Tümünü seç

  if shift=[] then
  begin
    case key of
      vk_f1:btnyeni.Click;
      vk_f4:btnduzenle.Click;      // Düzenle
      vk_f2:btnkaydet.Click;      // Kaydet
      vk_f6:btnvazgec.Click;      // Vazgeç
      vk_f3:btnsil.Click;      // Sil
      vk_escape:btnKapatx.Click;  // Kapat
      
      vk_Prior : btnonceki.Click;
      vk_next:btnsonraki.Click;
      vk_f11:btnlistele.Click;
    end;
  end
  else
  if (shift=[ssctrl]) then
  begin
    if key=vk_prior then btnilk.Click;
    if key=vk_next then  btnson.Click;
  end;

şimdi bu özelliği 15 formunuza da koymanız gerekyor. Bu 15 kez copy paste demek oluyor ki genelde arada 1-2 forma koymanın unutulması çok sık rastlanan bir durum :)

onun yerine bu kodu KeyUp.inc diye bir dosyaya kaydedip tüm formlarda bu kısmı

Kod: Tümünü seç

{$I KeyUp.inc}
şeklinde belirtseydik. tek yapmamız gereken bu inc dosyasnı değiştirmek olacaktı.

kaldı ki.
daha da ötesi btnYeni,btnSil ... metotları da standart ise onu da KayitIslemleri.inc dosyasına atıp çağırabilirdik mesela.

Böylece hem gözümüzün önünden artık daha da kullanmayacağımız bu kodlar silinmiş olur hem de değişiklikler daha da rahat olur.
İyi çalışmalar.

Not : Benim 7000 satırlık unit artık 2000 satır :mrgreen:

Bay_Y
Üye
Mesajlar: 115
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: .INC Dosyası Kullanımı

Mesaj gönderen Bay_Y » 10 Mar 2018 12:49

Teşekkürler güzel bir anlatım olmuş , Eline sağlık.

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 135
Kayıt: 01 Oca 2008 05:34

Re: .INC Dosyası Kullanımı

Mesaj gönderen Commandx » 04 Nis 2018 10:50

derlenen program sanki iç organları dışarıda biriymiş gibi davranıyor xD
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

Cevapla