Kod: Tümünü seç
form2.show;
form1.hide;
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.
Kod: Tümünü seç
form2.show;
form1.hide;
Kod: Tümünü seç
delphi cannot change visible in onshow
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.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.
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;
Hocam şuan dediğiniz gibi yaptığımda oldu çok teşekkür ederimertank 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.
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.
Alternatiflere çok güzel bir örnek. Buradaki önemli noktacsunguray 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.
Kod: Tümünü seç
PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
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.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.
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.