Ana formu kapatıp form2 yi açmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seci20

Ana formu kapatıp form2 yi açmak

Mesaj gönderen seci20 »

Kolay gelsin ustalarım. Forumlarda bir çok konu var bu konuyla ilgili ama hepsi form işlem yaparken hata veriyor en basitinden şu kodu normal bir button eklediğim zaman sorunsuz çalışıyor ama form işlemdeyken eklediğimde form 2 açsamda form 1 kapatamıyorum kod şu

Kod: Tümünü seç

form2.show;
form1.hide;
Normal şartlarda butonda çalışan kodun işlem yaparkende çalışması lazım ama şu tarz hatalar veriyor

Kod: Tümünü seç

delphi cannot change visible in onshow

Tarzında hatalar veriyor.ne kadar kod denesemde bir türlü başaramadım form 2 açıp form 1 kapatmayı yardımlarınız için şimdiden teşekkür ederim.
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen ertank »

Merhaba,

Ünite içindeki haliyle kodları paylaşmamışsınız. Dolayısıyla hata mesajı üzerinden varsayımda bulunarak cevaplamak gerekiyor.

Paylaştığınız ilk kodu formun OnShow() olayı içine yazmayın. Buton tıklaması olarak deneyin.
seci20

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen seci20 »

ertank yazdı: 04 Eyl 2017 10:04 Merhaba,

Ünite içindeki haliyle kodları paylaşmamışsınız. Dolayısıyla hata mesajı üzerinden varsayımda bulunarak cevaplamak gerekiyor.

Paylaştığınız ilk kodu formun OnShow() olayı içine yazmayın. Buton tıklaması olarak deneyin.
Hocam bir kod yazmadım daha en basitinden ilk aklıma gelen kodu yazdım ama netteki veya bu forumdakileride yazsam aynı şekilde olmuyor örneğin bu yazdığım koda bu söylediğim hatayı veriyor.Butona yazdığımda bu kod sorunsuz çalışıyor hocam ama mesela formda devam eden bir işlemde yazmıyor. Örneğin şu şekildeki bir kodda çalışmıyor.

Kod: Tümünü seç

    memoara(true,'Found','Credict check :',0);
                   delay(2000);
                  memosil('Checked...','Credict check :',0);
sRichEdit1.Lines.Add('Credict  :') ;
memoara(true,Format('%g',[UniQuery1.FieldByName('kredi').AsFloat ]),'Credict  :',0);
    rAttrib.Font := TFont.Create;
rAttrib.Font.Color := clBlue;
rAttrib.BackColor := clWhite;
SetTextColor(form1.sRichEdit1,Format('%g',[UniQuery1.FieldByName('kredi').AsFloat ]),rAttrib);
            delay(1000);
            sRichEdit1.Lines.Add('Form opening...') ;
            delay(1000);
form2.show;
form1.close;
Bu kod form activede yazılı hocam mesela. Butona yazdığımda sorun yok ama buraya yada timere yada farklı bir şekilde açıcam mesela ufak bir şart tanımlayıp ama açmıyor yukardaki hatayı veriyor
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen ertank »

OnCreate(), OnShow(), OnActive() olayları bu gibi kodlar yazmak için uygun değil.

Eğer mutlaka bu olaylarda yapmak istiyorum diyorsanız forma bir TTimer ekleyin. Çok kısa süreli bir Interval olsun. Mesela 250. İlgili iki satırı OnTimer() olayına yazın. OnActive() olayında ise Timer'ı aktive edin. OnTimer() olayında Timer'ı pasif hale getirmeyi ihmal etmeyin.

Alternatif yöntemler de mümkün ancak basit ve hızlı sonuç alabileceğiniz bir yöntem olarak bunu kullanabilirsiniz.
seci20

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen seci20 »

ertank yazdı: 04 Eyl 2017 10:43 OnCreate(), OnShow(), OnActive() olayları bu gibi kodlar yazmak için uygun değil.

Eğer mutlaka bu olaylarda yapmak istiyorum diyorsanız forma bir TTimer ekleyin. Çok kısa süreli bir Interval olsun. Mesela 250. İlgili iki satırı OnTimer() olayına yazın. OnActive() olayında ise Timer'ı aktive edin. OnTimer() olayında Timer'ı pasif hale getirmeyi ihmal etmeyin.

Alternatif yöntemler de mümkün ancak basit ve hızlı sonuç alabileceğiniz bir yöntem olarak bunu kullanabilirsiniz.
Hocam şuan dediğiniz gibi yaptığımda oldu çok teşekkür ederim :)
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Ana formu kapatıp form2 yi açmak (AfterShow gerçekleştirme)

Mesaj gönderen csunguray »

Keşke AfterShow adında bir event olsaydı. Bu kodları oraya yazardık. Ama merak etmeyin. AfterShow u kendimiz de gerçekleştirebiliriz.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
  WM_AFTER_SHOW = WM_USER + 300; // custom message

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
  // Buraya istediğiniz kodları yazın.
end;

end.
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/)
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Ana formu kapatıp form2 yi açmak (AfterShow gerçekleştirme)

Mesaj gönderen ertank »

csunguray yazdı: 04 Eyl 2017 01:23 Keşke AfterShow adında bir event olsaydı. Bu kodları oraya yazardık. Ama merak etmeyin. AfterShow u kendimiz de gerçekleştirebiliriz.
Alternatiflere çok güzel bir örnek. Buradaki önemli nokta

Kod: Tümünü seç

PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
satırını en son satır olarak kullanmak olacaktır sanırım. Yoksa işler biraz karışabilir.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen csunguray »

csunguray yazdı: 04 Eyl 2017 01:23 satırını en son satır olarak kullanmak olacaktır sanırım. Yoksa işler biraz karışabilir.
Denemedim ama sanırım karışmaz. Çünkü PostMessage komutu mesaj kuyruğuna bir mesaj ekler. Yani kuyruktaki tüm işler bittikten sonra bu mesaj yayınlanır. Sonrasında da bu mesaj yayınına tepki olarak da WmAfterShow procedure'ü tetiklenir.
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/)
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: Ana formu kapatıp form2 yi açmak

Mesaj gönderen ertank »

Normal koşullarda dediğiniz doğru. Ancak bir sebepten kuyruktaki mesajların işlenmesi istenilir ise VE OnShow() ve WmAfterShow() içindeki kodlar birbirleri ile etkileşimi olur ise sorun çıkabilir.

Teknik olarak PostMessage() fonksiyonu asenkron çalışır.
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Yukarıda da bahsedildiği gibi PostMessage() mesajı post edip geri dönüyor. Devamında yapacağı işler varsa onları yapmaya devam ediyor.

Aşağıdaki gibi bir kod Memo1 satırlarına önce AfterShow ile ilgili mesajı ekleyecektir.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, 
  Winapi.Messages, 
  System.SysUtils, 
  System.Variants, 
  System.Classes, 
  Vcl.Graphics,
  Vcl.Controls, 
  Vcl.Forms, 
  Vcl.Dialogs, 
  Vcl.StdCtrls;

const
  WM_AFTER_SHOW = WM_USER + 300; // custom message

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
  Application.ProcessMessages();
  Sleep(2000);
  Memo1.Lines.Add(FormatDateTime('hh:nn:ss:zzz', Now()) + 'PostMessage sonrası');
end;

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
  Memo1.Lines.Add(FormatDateTime('hh:nn:ss:zzz', Now()) + 'AfterShow tetiklendi');
end;

end.
Cevapla