Form nasıl create edilmeli?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Form nasıl create edilmeli?

Mesaj gönderen aslangeri »

s.a.
programlarda kullandığım formları manuel create ediyorum. böylelikle programın açılışını hızlandırıyorum, açılışta animasyon vs bişeyler yapıyorum.
ilk başlarda formları dpr dosyasında yazdığı şekilde create ediyordum

Kod: Tümünü seç

application.createform(tfxxx,fxxx)
daha sonra create işlemini şu şekilde yapmaya başladım.

Kod: Tümünü seç

fxxx:=tfxxx.create(application.mainform)
bu şekilde çalışırken bu gün başıma bir olay geldi.

ikinci şekilde create ettiğim formun oncreate olayında forma ulaşamadım.

Kod: Tümünü seç

procedure TFxxx.FormCreate(Sender: TObject);
begin
  RenkVeFontlariAyarla(fxxx);
end;
burda fxxx in üzerine fare ile geldiğim zaman bana fxxx in nil olduğunu söyledi.
create comutunu ilk şekilde yapınca çalıştı.
Formların stylı fsdialog yani mdi değil.
Bu iki create metodu arasındaki farklar nelerdir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Mesaj gönderen csunguray »

Formlar için veya bir başka class için her zaman create kalıbı aşağıdaki şekilde olmalıdır.

Kod: Tümünü seç

  Form1:=TForm1.Create(Self)
  try
    Form1.ShowModal;
  finally
    Form1.Free;
  end;
  
Sizin sorununuza gelince. Fxxx yerine self kullanmayı denediniz mi? Ayrıca bahsettiğiniz sorunla ben karşılaşmıyorum. Debugger bazen yanılıyor. Onu da hesaba katın.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

gercekten ilginc bir sorunmus. ben de ilk defa aslangeri nin mesajindan sonra fark ettim. sanirim bu bir bug ve diger surumlerde duzeltilmis olabilir.

Kod: Tümünü seç

Form1:=TForm1.Create(Self)  
bu sekilde bir cagrida ilgili formun OnCreate olayinda forma kendi adiyla ulasilamiyor lakin csunguray'in da belirttigi sekilde Self parametresiyle bir sorun cikmiyor.

application.createform(tfxxx,fxxx) olayinin kaynak kodlarina bakinca bu cagrinin neden boyle bir soruna neden olmadigi belli oluyor. Create olayini tetiklemeden once forma referans eden degiskene olusturdugu nesne ornegi ataniyor.

Kod: Tümünü seç

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance; //degiskene olusan nesne ataniyor
  try
    Instance.Create(Self); //olusan nesnenin onCreate olayi cagriliyor.
diger delphi surumleri icin bi yorum yok ama delphi 6 da cozum self kullanmak.

Kod: Tümünü seç

DegerleriAyarla(self)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

sadettinpolat yazdı:

Kod: Tümünü seç

Form1:=TForm1.Create(Self)  
bu sekilde bir cagrida ilgili formun OnCreate olayinda forma kendi adiyla ulasilamiyor lakin csunguray'in da belirttigi sekilde Self parametresiyle bir sorun cikmiyor.

Kod: Tümünü seç

Form1:=TForm1.Create(Self);

Form1:=TForm1.Create(Form1);
Delphi 7 ile deniyorum ve her iki durumda da Form 1 in OnCreate olayı tetikleniyor..
Tam olarak anlayamadım @sadettinpolat, Delphi6 da ikinci satır çalışmıyormu?
Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

calisiyor ama soyle bir kod tam olarak isteneni yapmiyor.


Unit1

Kod: Tümünü seç

Form2:=TForm2.Create(form1);
Form2.Showmodal;

Unit2

Kod: Tümünü seç

Procedure BasligiDegistir(Form:TForm);
begin
 Form.Caption :='a';
end;

procedure Form2.onCreate(sender vs vs)
begin
  BasligiDegistir(Form2);
end;
form2 create edildigi zaman BasligiDegistir metodunun calisip form2 nin captionu "a" yapilmasi gerekiyor ama olmuyor. cunku metoda gecen form2 o an icin nil degerine sahip. form2 henuz isaret etmesi gereken nesneyi isaret etmiyor. BasligiDegistir(Self) denildigi zaman ise caption olmasi gerektigi gibi degisiyor.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

sadettinpolat yazdı:calisiyor ama soyle bir kod tam olarak isteneni yapmiyor.


Unit1

Kod: Tümünü seç

Form2:=TForm2.Create(form1);
Form2.Showmodal;

Unit2

Kod: Tümünü seç

Procedure BasligiDegistir(Form:TForm);
begin
 Form.Caption :='a';
end;

procedure Form2.onCreate(sender vs vs)
begin
  BasligiDegistir(Form2);
end;
form2 create edildigi zaman BasligiDegistir metodunun calisip form2 nin captionu "a" yapilmasi gerekiyor ama olmuyor. cunku metoda gecen form2 o an icin nil degerine sahip. form2 henuz isaret etmesi gereken nesneyi isaret etmiyor. BasligiDegistir(Self) denildigi zaman ise caption olmasi gerektigi gibi degisiyor.
Evet doğru söylüyorsun ama zaten olması gereken bu değilmi :)

unit2 içindeki..

Kod: Tümünü seç

var
   Form2: TForm2;
satırlarda Form2 nesnesi tanımlanmış ama form 2 içinde create edilmemiş durumda.
Form 1 içersinde create ediyorsun sadece.

bu satırı ram lediğinde ve oncreate i aşağıdaki gibi..

Kod: Tümünü seç

procedure TForm2.FormCreate(Sender: TObject);
begin
  BasligiDegistir((Sender as TForm2)); // yada BasligiDegistir(Self);
end;
Unit1 de çağırdığın yerde de..

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
Form2 :TForm2;
begin
  Form2 := TForm2.Create(self);
  Form2.Showmodal;
end;
gibi olduğunda daha iyi anlaşılacaktır..
Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
arkadaşlar form create işini self parametresi ile yaptığım zaman düzelmedi.
yani formu create işleminde

Kod: Tümünü seç

fxx:=tfxx.create(application.mainform);
fxx:=tfxx.create(self);
ikiside aynı sonucu verdi.
ancak formun oncreatesine yazdığım kodda parametreyi
@lazio nun dediği şekilde yapınca

Kod: Tümünü seç

BasligiDegistir((Sender as TFxx)); // yada BasligiDegistir(Self); 
create metodlarının ikiside çalıştı.
hatta (sender as Tform) demem (TFxx yerine) demem bile yeterli oldu.
teşekkür ediyorum arkadaşlar.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

zaten sender as Tform yerine self kullanmanı önermişlerdi. Zira aynı kapıya çıkıyor. (özel durumlar dışında)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

sabanakman yazdı:zaten sender as Tform yerine self kullanmanı önermişlerdi. Zira aynı kapıya çıkıyor. (özel durumlar dışında)
iyide ben formları create ederken sender as tform kullanmıyordum ki?
hem
madem aynı kapıya çıkıyorlar niye iki tane var.
aynı değillerse niye aynı kapıya çıkıyorlar
ikinci bir kapı niye yapılmamış...
müteahhit malzemeden mi çalmış...
olası depremde bu kapılar sağlam kalırmı....vs....
.............
(bakırköyden arkadaşlar gelir...= :twisted:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Form nasıl create edilmeli?

Mesaj gönderen sabanakman »

aslangeri yazdı:ikinci şekilde create ettiğim formun oncreate olayında forma ulaşamadım.

Kod: Tümünü seç

procedure TFxxx.FormCreate(Sender: TObject);
begin
  RenkVeFontlariAyarla(fxxx);
end;
burda fxxx in üzerine fare ile geldiğim zaman bana fxxx in nil olduğunu söyledi.
Bu söylediklerine istinaden cevap yazdımdı. RenkVeFontlariAyarla(fxxx); yerine RenkVeFontlariAyarla(Sender as TForm); veya RenkVeFontlariAyarla(Self); kullanmanın hata çıkaramayabileceğini demek istemiştim :oops: .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: Form nasıl create edilmeli?

Mesaj gönderen fduman »

aslangeri yazdı: ..
ikinci şekilde create ettiğim formun oncreate olayında forma ulaşamadım.

Kod: Tümünü seç

procedure TFxxx.FormCreate(Sender: TObject);
begin
  RenkVeFontlariAyarla(fxxx);
end;
burda fxxx in üzerine fare ile geldiğim zaman bana fxxx in nil olduğunu söyledi.
create comutunu ilk şekilde yapınca çalıştı.
Formların stylı fsdialog yani mdi değil.
Bu iki create metodu arasındaki farklar nelerdir.

Kod: Tümünü seç

fxxx:=tfxxx.create(application.mainform)
Bu kodda tfxxx in Create constructor ında fxxx değişkeninin nil dönmesi gayet normal. Çünkü tfxxx.create constructor u geriye instance pointer ını henüz döndürmemiş ki fxxx içinden ulaşabilesin. tfxxx.create in işi bitip geriye instance pointer döndüğü zaman fxxx içine ataması yapılacak.

Örneği basitleştirirsek.

Kod: Tümünü seç

var
  s: string;

function test: string;
begin
    // s in değeri burada hala boş string
    result:= 'DENEME';
end;

begin
    // S in değeri burada boş string
    s:= '';
    // s burada hala boş string, ta ki test ten geriye DENEME stringi dönünceye dek
    s:= test;
    // s içeriği burada DENEME oldu
end.
Çözüm class içinde değişken değil Self kullanmak. Self instance pointer ını geriye döndürecektir. Değişkenin kullanılması zaten yanlış.

Sadettin in bahsettiği CreateForm önce bir instance oluşturup hemen bunun atamasını değişkene yapıyor.

Bug olduğunu düşünmüyorum yani. :)

Görüşürüz.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

furkan yazdı: fxxx:=tfxxx.create(application.mainform) Bu kodda tfxxx in Create constructor ında fxxx değişkeninin nil dönmesi gayet normal. Çünkü tfxxx.create constructor u geriye instance pointer ını henüz döndürmemiş ki fxxx içinden ulaşabilesin. tfxxx.create in işi bitip geriye instance pointer döndüğü zaman fxxx içine ataması yapılacak.
evet şimdi oturdu.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Form nasıl create edilmeli?

Mesaj gönderen sadettinpolat »

fduman yazdı: Çünkü tfxxx.create constructor u geriye instance pointer ını henüz döndürmemiş ki fxxx içinden ulaşabilesin.
fxxx ' e henuz olusan nesne atanmamis konusu tamam ama simdi aklima baska birsey takildi. madem fxxx'e birsey atanmamis neden Accees violation hatasi olusmuyor ?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Form nasıl create edilmeli?

Mesaj gönderen sabanakman »

sadettinpolat yazdı:
fduman yazdı: Çünkü tfxxx.create constructor u geriye instance pointer ını henüz döndürmemiş ki fxxx içinden ulaşabilesin.
fxxx ' e henuz olusan nesne atanmamis konusu tamam ama simdi aklima baska birsey takildi. madem fxxx'e birsey atanmamis neden Accees violation hatasi olusmuyor ?
Tfxxx nesnesi oluşmuş fakat sorun bu değerin henü fxxx değişkenine atanmadan önce Tfxxx.FormCreate olayının çalışmasından kaynaklanıyor. Tabi Fxxx değerini henüz alamadan onCreate olayında bu değişkeni kullanmak hata oluşturacaktır fakat Self kullanıldığı zaman sorun çıkmayacaktır. Çünkü form nesnesi oluşturulmuştur. Zaten Fxxx:=TFxxx.Create(Application) atamasından sonra formun onCreate olayında kullanılan Self ile aynı nesneyi referans almaktadır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

onCreate olayinda form olusmus fakat fxxxx e henuz degeri aktarilmamis. bu nedenle onCreate icinde forma ulasmak istersek self kullaniyoruz. bu kısma kadar okey ama onCreate icinde Fxxxx kullandigimiz zaman o an ki degeri itibariyle Fxxx hicbir nesneye isaret etmemektedir.

bu nedenle onCreate icinde fxxx in kullanimi sonucu access violation hatasi almamiz gerekmez mi ?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla