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.
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 nokta
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.
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.