Runtime Create Form

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Okann
Üye
Mesajlar: 70
Kayıt: 09 Tem 2010 02:55

Runtime Create Form

Mesaj gönderen Okann »

Arkadaşlar Merhaba,

Çalışma zamanında bir formdan başka bir form türetiyorum. Bu türettiğim forma isim veriyorum.
diğer formlardan, türettiğim bu forma erişim için form adını nasıl register edebilirim.

Kod: Tümünü seç

frmMain.AOwnerMainForm(TfrmAccounts, 450, 550);

Kod: Tümünü seç

procedure TfrmMain.AOwnerMainForm(AOwnerForm: TFormClass; FWidth, FHeight: Integer);
var
  FOwnerForm: TForm;
begin
  FOwnerForm := AOwnerForm.Create(Self);
  FOwnerForm.Width := FWidth;
  FOwnerForm.Height := FHeight;
  if (frmAccounts is AOwnerForm) then
    FOwnerForm.Name := 'frmAccounts2';
  FOwnerForm.ShowModal;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2211
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Runtime Create Form

Mesaj gönderen freeman35 »

FOwnerForm := AOwnerForm.Create(Self);
bir değişken sadece bir adres tutabilir.
Tlist kullanabilirsin, yada dinamik array. Pointer tipinde, form olarak erişmek içinde TForm(değişken).xxx şeklinde erişebilirsin.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Okann
Üye
Mesajlar: 70
Kayıt: 09 Tem 2010 02:55

Re: Runtime Create Form

Mesaj gönderen Okann »

Merhaba,
İlginiz için teşekkür ederim Sayın Adminim.

Daha önceden pointer ile yapmayı denemiştim. Fakat projeme uygun olmadı.
frmAccounts formunu diyelimki 2 kez create ettim. Pointer ile referans tutunca hangi create ettiğim formun üzerindeki bir componente dışarıdan müdehale etmem gerektiğini bilemiyor ve ikisinede aynı işlemi yapıyor.
formun handle numarasından istediğim formun üzerindeki bileşene ulaşabiliyormuyum. yani handle numarası ... olan formun üzerindeki gridde şu işlemi yap gibi bir şey diyebiliyormuyum.

Mesela ekteki örnekde cari hesaplar browserında 2 kez ekle dedim ve 2 tane form açtım. sonra soldaki resimdeki özel kod butonuna tıklayıp yeni bir pencere açtım ve özel kodu seçtim. sadece ilgili forma yansıdı. dışardan create ettiğim forma müdehale etmekten kastım bu aslında.
En son Okann tarafından 18 Eki 2015 08:28 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4733
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Runtime Create Form

Mesaj gönderen mrmarman »

Sana bir öneri; özel mesaj ile sormak yerine @freeman35'in söylediklerini örnek bir proje aç ve kodlar ile deneyerek uygula.
Yapamadığın yeri buradan o örnek proje üzerinden yeniden sor.

Yaptım dediğini aslında yapamadığını değerlendiriyorum.
Aşağıdaki kurguyu Dinamik Array ile senin için kurdum. En azından bu proje üzerinden denemelerini yap. Uygulamada başarılı olduğunu düşündüğün an gerçek projene ihtiyacın olanı uygularsın.

Kod: Tümünü seç

Var
  xGlobalFormListesi : Array of TForm1;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  iFormSay : Integer;
begin
  iFormSay := High( xGlobalFormListesi ) - Low(xGlobalFormListesi) + 1;

  SetLength( xGlobalFormListesi, iFormSay + 1 ); // Yeni form için ARRAY'de rezervasyon...
  // zero based yani index 0'dan başlar.
  xGlobalFormListesi[iFormSay] := TForm1.Create(nil);
  With TForm1( xGlobalFormListesi[iFormSay] ) do
  begin
    Name    := Format('ARMANForm_%.2d', [ iFormSay ]);
    Caption := Name;
    Show;
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
  i : Integer;
begin
  ComboBox1.Items.Clear;
  for i := Low(xGlobalFormListesi) to High( xGlobalFormListesi ) do
    ComboBox1.Items.Add( TForm1(xGlobalFormListesi[i]).Name );
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
Var
  Edit : TEdit;
begin
  Edit := TEdit( TForm1( xGlobalFormListesi[ComboBox1.ItemIndex] ).FindComponent('Edit1') );

  Edit.Text := Edit.Text + IntToStr( Length( Edit.Text ) );
end;
Resim
Dosya ekleri
FORM_Dinamik.rar
Dinamik Form Örneği
(52.01 KiB) 28 kere indirildi
Resim Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2211
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Runtime Create Form

Mesaj gönderen freeman35 »

Pointer(değişken[variable]) ve handle bunları öncelikle öğren. Class larla uğraşacaksan öncelikle ne olduğunu sonrasında yapılarını öğrenmen gerek. Form dediğinde TForm Class ı dır.

TxxxForm a public bir değişken ekle
Public
Tlist_id : Integer;

Index_Id := TList.Add(TxxxForm.Create(xxxxx)); // TList (Array gibi düşünebilirsin)
TxxxForm(TList.Item[Index_Id]).Tlist_id := Index_Id;
TxxxForm(TList.Item[Index_Id]).Name := "FalanFilan_" + Inttostr(Index_Id);

İster Tlist ten ister formun kendisinden TList teki pointer ına ulaşabilirsin. Yada kendi kurgunu yapabilirsin. Sana önemli tek tiyom, "TList.Delete()" sakın kullanma, yoksa index numaraların karışır, onun yerine "TList.Item[xxxxx] := Nil;" kullan. e tabi bunu yapmadan öncede formu free lemen gerektiğini söylememe gerek yoktur sanırım.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Okann
Üye
Mesajlar: 70
Kayıt: 09 Tem 2010 02:55

Re: Runtime Create Form

Mesaj gönderen Okann »

Yardımlarınız için teşekkür ederim. Sağolun.
Cevapla