Run time da ana formu değiştirmek

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ı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Run time da ana formu değiştirmek

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

procedure SetAsMainForm(aForm:TForm);
var
  P:Pointer;
begin
  P := @Application.Mainform;
  Pointer(P^) := aForm;
end;

Kod: Tümünü seç

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

procedure SetAsMainForm(aForm:TForm);
var
  P:Pointer;
begin
  P := @Application.Mainform;
  Pointer(P^) := aForm;
end;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);

  if Paramstr(1) = 'Param1' then
    SetAsMainForm(Form2);

  if Paramstr(1) = 'Param2' then
    SetAsMainForm(Form3);

  Application.Run;
end.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Hocam neden böyle bir şeye ihtiyaç duyuluyor acaba ? Yani nerelerde kullanılıyor bu ?
Açıklayabilirmisiniz.

Saygılar..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Bildiğimiz üzere ana form kapandığı zaman uygulamamız otomatik olarak sonlandırılıyor. Örnekte daha değişik bir amaçta kullanılmış ama ben şöyle bir durumda kullanıyorum. Eğer bir form kapandığı zaman programın sonlanması gerekiyorsa bu şekilde ana formu istediğim form olarak ayarlayıp programın sonlanmasını sağlıyorum. Daha somut bir örnek olarak programın açılışında kullanıcı adı ve şifre sorduğumuz bir formumuz var. Eğer kullanıcı bu pencerede Vazgeç düğmesine basarsa programın sonlanması gerekiyor ama (forma frmLogin diyelim) frmLogin ana form olmadığı için bu formun kapanmasıyla birlikte uygulama sonlanmıyor. Bu işi frmAna (ana formumuz) formunda postmessage gibi yöntemlerle manuel olarak kendimiz yapıyoruz. Bu yöntemle frmLogin ana form haline getiriliyor eğer kullanıcı adı ve şifresi yanlış girilirse veya vazgeç düğmesine tıklanırsa uygulama sonlanıyor aksi takdirde ana form tekrar frmAna yapılıp uygulama normal akışıyla devam ediyor.

Bu tür bir işlem yapmak için çeşitli yollar var ama bu yöntem daha sağlam duruyor gibi bence + bu yöntemin kullanılabileceği bir kaç durum daha geliyor aklıma ama sonuç olarak şöyle özetleyebiliriz. Bazı istisna durumlarda ana formun haricinde her hangi bir formun kapatılmasıyla programın sonlanmasını istiyorsak bu yöntemi kullanabiliriz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Şifre formunda

Kod: Tümünü seç

  Application.Terminate;
komutunu verdirmek daha kolay olmaz mıydı..

- Neyse bilgi her zaman bilgidir.. Teşekkürler... :o
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

mrmcop yazdı:- Şifre formunda

Kod: Tümünü seç

  Application.Terminate;
komutunu verdirmek daha kolay olmaz mıydı..

- Neyse bilgi her zaman bilgidir.. Teşekkürler... :o
terminate ile daha kolay olabilir ama şu an hatırlayamadığım bazı nedenlerle yukarıda bahsetiğim yöntemi kullanmaya başladım. maksat çeşit olsun ;)

şu şekilde kullanıyorum ben.

Kod: Tümünü seç

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {frmMain},
  Unit2 in 'Unit2.pas' {frmLogin};

{$R *.res}


procedure SetAsMainForm(aForm:TForm);
var
  P:Pointer;
begin
  P := @Application.Mainform;
  Pointer(P^) := aForm;
end;

begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(TfrmLogin, frmLogin);
  SetAsMainForm(frmLogin);
  if frmLogin.ShowModal = 1(*mrOK*) Then
     Application.Run;
end.
unit2.pas

Kod: Tümünü seç

procedure TfrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ModalResult = mrOk Then
     SetAsMainForm(frmMain);
end;

procedure TfrmLogin.Button1Click(Sender: TObject);
begin
  ModalResult := mrOk;
end;

procedure TfrmLogin.Button2Click(Sender: TObject);
begin
  ModalResult := mrCancel;
end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Açııklamaların için sağol hocam ,
daha detaylı yazmanı istememin sebebi ben de şifre formu falan aklıma gelmişti. Şifre formunda ben de Muharrem hocamın dediği gibi yapıyorum.

Tekrardan teşekkürler. :)
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re:

Mesaj gönderen Lost Soul »

sadettinpolat yazdı:
mrmcop yazdı:- Şifre formunda

Kod: Tümünü seç

  Application.Terminate;
komutunu verdirmek daha kolay olmaz mıydı..

- Neyse bilgi her zaman bilgidir.. Teşekkürler... :o
terminate ile daha kolay olabilir ama şu an hatırlayamadığım bazı nedenlerle yukarıda bahsetiğim yöntemi kullanmaya başladım. maksat çeşit olsun ;)
veritabanı uygulamasında terminate problem doğurabileceğinden olabilir mesela.
Cevapla