Merhabalar,
Kod: Tümünü seç
.
.
.
var
Form1 : TForm1;
//bunu global değişken olarak tanımlıyoruz..
Formlar : Array of TForm1; //te-form-bir
imlepementation
.
.
.
TForm1.Button1Click(Sender:TObject);
Var
FS : integer; //kısa isim makbuldür.
begin
FS := High(Formlar) + 2; //güzel kullanmışsın..
SetLength(Formlar, FS);
Formlar[High(Formlar)] := TForm1.create(Application);
//ya da Formlar[FS-1]
{
//buna gerek yok, çünkü Formlar dizisini zaten TFORM1 olarak
//tanımladık. Bizim Form1 adlı tutamacımız zaten TForm1 nesnesinden
//türetilmiş, kaldıki Fom1'i create ederken ayrıca
//Form1.OnCloSe := FormClose diyor muyuz?
Formlar[High(Formlar)].OnClose := FormClose;
}
Formlar[High(Formlar)].Show;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Bu formun kapandıktan sonra FREE edilmesini sağlıyacaktır..
Action := caFree;
end;
şimdi verdiğin örneğin daha doğru olanını yapalım, çünkü Formlaradlı Tform1 dizisi boşaltılamıyor. Başka bir açıdan bunu şöyle yapalım. Tam kodu veriyorum..
Kod: Tümünü seç
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
procedure BaslikYaz;
end;
var
Form3: TForm3;
Formlar : TList;
implementation
{$R *.dfm}
{$DEFINE YontemBir}
//ikinci yöntemi kullanmak isterseniz yukarıkini iptal ediniz.
//ve aşağıdakinin başındaki kesmeleri siliniz..
//{$DEFINE YontemIki}
procedure TForm3.BaslikYaz;
begin
//Ana formun başlığına bilgi yazıyoruz..
Application.MainForm.Caption := 'Form Sayısı: ' + IntToStr(Formlar.Count);
end;
procedure TForm3.Button1Click(Sender: TObject);
Var
F : TForm3;
begin
{$IFDEF YontemBir}
//biliyorum extreme bir kullanımdır..
F := TForm3(Formlar.Items[Formlar.Add(TForm3.Create(Application))]);
{$ELSE}
F := TForm3.Create(Application);
Formlar.Add(F);
{$ENDIF}
F.Show;
BaslikYaz;
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
var i : integer;
begin
Action := caFree;
i := Formlar.IndexOf(Sender);
if i <> -1 then Formlar.Delete(i);
BaslikYaz;
end;
initialization
Formlar := TList.Create;
finalization
Formlar.Free;
end.
Burada iki farklı yöntem kullandım, ikiside aynı kapıya çıkıyor..
İkinci yöntemi kullanmak isterseniz
//{$DEFINE YontemIki} yazan satırın başındaki
// işaretlerini kaldırın. Ve Yöntem birin başına bu işaretleri koyun.. Sakın her ikisinin de başındaki işaretleri kaldırmayın. Sadece biri aktif olmalıdır..
Forumlar adlı dizi işinize yaramayacaksa gereksiz ise en pratik yöntem aşağıdaki gibidir...
Kod: Tümünü seç
TForm1.Button1Click(Sender:TObject);
begin
with TForm1.create(Application) do Show;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Bu formun kapandıktan sonra FREE edilmesini sağlıyacaktır..
Action := caFree;
end;
Görüldüğü gibi Button1'e bastıkça yeni bir TForm1 sınıfından form üretilir.
De haydi kolay gelsin...