Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Fonksiyona gönderdiğim parametrelerin değişken olması
#1
Sorusunu bile nasıl soracağımı bilemediğim bir sorunum var. Anlatmayı deneyeyim. Anaformum MDi ve child formlardan oluşan bir proje yapıyorum. Main menüde açılmasını isteğim forma tıklayınca bir fonksiyon çalışıyor ve form açık olup olmadığına göre formu açıyor. Bu fonksiyona gönderdiğim parametrelerin de tıkladığım butona göre değişken olacak şekilde oluşmasını istiyorum. Yani parametreyi ben el ile girmek istemiyorum. Şöyle ki fonksiyona parametre gönderen kodum  
FormAc(Tform_sirket,form_sirket)

Buradaki Tform_sirket ve form_sirket kısmının tıkladığım menu butonuna göre oluşmasını nasıl sağlarım. Saygılar.
//Bu Fonksiyon formları açmaya yarar. Form açıksa tekrar açmaya çalışmaz.
function FormAc(const FormSinifi:TComponentClass;var Form):Boolean;
var Bilesen: TComponent;
begin
    if not Assigned(TComponent(Form)) then begin
      Bilesen := TComponent(FormSinifi.NewInstance);
      TComponent(Form) := Bilesen;
      Bilesen.Create(Application);
    end;
    with TForm(Form) do begin
      Show;
    end;
end;


procedure Tform_ana.Tform_sirketClick(Sender: TObject);
begin
FormAc(Tform_sirket,form_sirket);
//if form_sirket=nil then Application.CreateForm(Tform_sirket,form_sirket);
end;
Cevapla
#2
Tıkladığın nesneyi kodda anlamak istiyorsan SENDER'i deneyebilirsin kardeşim.

FormAc(Tform_sirket,form_sirket, SENDER);
begin
  if SENDER=FilanNesne then
WWW
Cevapla
#3
(06-12-2018, Saat: 13:06)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlTıkladığın nesneyi kodda anlamak istiyorsan SENDER'i deneyebilirsin kardeşim.

FormAc(Tform_sirket,form_sirket, SENDER);
begin
  if SENDER=FilanNesne then

Asıl sorunum FormAc fonksiyonuna form bilgisini gönderen (Tform_sirket ve form_sirket) parametrenin menude tıklanan forma göre değişkenlik arzetmesi. Menu de Şirket Tanım a bastığımda FormAc(Tform_sirket ve form_sirket) olurken, Birim Tanım a bastığımda FormAc(Tform_birim,form_birim) şeklinde gönderebilmek ve bunu sadece bir menu sekmesinin eventen da yapmak.
Cevapla
#4
Anladığım gibiyse formun class'ını "Class Type" gibi bir şeyle getirmen lazım.

Parametre olarak geçirmen için TForm tipi yapabilirsin.
Veyahut ben bunun yerine bazen TBenimFormum gibi yapıp
ortak fonksiyonları bunun içine yığarım ve ilgili formları bundan türetirim.

Yine zorda kalırsan belki FindClass da işine yarayabilir.


TBenimFormum = class(TForm);

TŞirketFormu = class(TBenimFormum);
TSatışFormu = class(TBenimFormum);

procedure FormAc(tip:TBenimFormum,form:TForm);
begin
  if form is TŞirketFormu then TŞirketFormu(form)...
  elseif form is TSatışFormu then TSatışFormu(form)...
end;
WWW
Cevapla
#5
Sorulan soru ile alakalı değil ama paylaşılan kodlarlaalakalı bir ekleme yapmak istiyorum:
FormAc içerisinde kullandığınız 2 parametre ve verdiğiniz örneklere bakılırsa sadece Form'u parametre olarak geçmeniz yeterli. Bu formun ClassName'i zaten size diğer parametreyi veriyor.
There's no place like 127.0.0.1
WWW
Cevapla
#6
Cevaplarınız için teşekkür ederim. Ancak ilk paylaştığım koddaki formac(Tform_sirket,formsirket) kodunda parantezin içindekileri bir değişkenden nasıl alırım bu cevap benim için çok önemli olacak. Örnek: formac(formsinifim,formum) buradaki formsınıfım ve formum parametrelerini nasıl declare edip formac fonksiyonuna göndereceğim?. Kusura bakmayın bilgi az olunca neyi nasıl soracağımızı bile bilemiyoruz. Bu arada bilgileri formaç fonksiyonuna gönderilen formun gönderildiği esnada create edilmediğini belirtmem gerekir sanırım.
Cevapla
#7
CreateForm(InstanceClass: TComponentClass; var Reference);
zaten sizin istediğiniz değilmi
Cevapla
#8
Zaten form açma işini sizin verdiğiniz şekilde ilk mesajda görülen formac fonksiyonu yapıyor. Lakin ben bu fonksiyona göndereceğim form sınıfı ve form bilgisini direk yazmayıp (formac(Tform_sirket,form_sirket), mesela bunun yerine butonuna tıkladığım menunun hint kısmını göndermek istiyorum. Butonun hint kısmına form_sirket yazdım. Bana da biraz garip geldi ama formac(param1,param2) değerlerini string bir değerden alacak. Bu string değer form sınıfına nasıl dönecek işte orası çok önemli.
Cevapla
#9
Bu dediğiniz olayı ancak şu şekilde yapabilirsiniz, bir yerde, var olan formlarınızı tipine göre tanıtacaksınız (array mesela), id veya hint teki text e göre array' da varmı yokmu ona bakıp create ediceksiniz. Yoksa örneğin, button un caption kısmına edit1 yazıp, button.caption.text := 'vsvs' yazıp edit1.text'i doldurmasını bekleyemezsiniz.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#10
İyi günler. Burada sanırım hem form sınıfı hem de o forma ait değişkenin takibi paralel olarak yapılmak istenilmektedir. Eğer sadece sınıfa bağlı olarak sınırsız form açılmak istenseydi iş çok kolaydı aslında sadece RegisterClass-FindClass fonksiyonları iş görürdü. Eğer TForm1 sınıfı oluştuğunda veya yok edildiğinde var Form1:TForm1; değişkenini de etkileyecekse işler biraz kontrol kodları eklemeye bağlı olarak yine çözümlenebilir. Mesela .dpr projenizde tanımlı unitlerin en başına aşağıdaki untFormlar.pas unit'ini ekleyelim. Örnek .dpr aşağıdaki gibi olacaktır.
program Project1;

uses
 Vcl.Forms,
 untFormlar in 'untFormlar.pas',
 Unit1 in 'Unit1.pas' {Form1},
 Unit2 in 'Unit2.pas' {Form2},
 Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
 Application.Initialize;
 Application.MainFormOnTaskbar := True;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
untFormlar.pas dosyası:
unit untFormlar;

interface

uses System.SysUtils, Vcl.Forms, System.Generics.Collections;

type
 TAtaForm=class(TForm)
 private
   procedure DoCreate;override;
   procedure DoDestroy;override;
   procedure DoClose(var Action: TCloseAction); override;
 end;

 TFormBilgisi=record
   FormSinifi:TFormClass;
   FormDegiskenAdresi: Pointer;
 end;

 TFormBilgileri=TList<TFormBilgisi>;

var FormBilgileri:TFormBilgileri;

function indexOfFormClass(const fsFormSinifi:TFormClass):Integer;overload;
function indexOfFormClass(const sFormSinifiAdi:String):Integer;overload;
function FormSinifiEkle(const fsFormSinifi:TFormClass;const pFormDegiskenAdresi: Pointer):Integer;
function FormAc(const sFormSinifAdi:String):TForm;

implementation

function indexOfFormClass(const fsFormSinifi:TFormClass):Integer;
var bAramaYap:Boolean;
begin
 Result:=FormBilgileri.Count-1;
 bAramaYap:=True;
 while bAramaYap and (Result>=0) do begin
   if fsFormSinifi=FormBilgileri[Result].FormSinifi then
    bAramaYap:=False
   else Dec(Result);
 end;
end;

function indexOfFormClass(const sFormSinifiAdi:String):Integer;
var bAramaYap:Boolean;
begin
 Result:=FormBilgileri.Count-1;
 bAramaYap:=True;
 while bAramaYap and (Result>=0) do begin
   if SameText(sFormSinifiAdi, FormBilgileri[Result].FormSinifi.ClassName) then
    bAramaYap:=False
   else Dec(Result);
 end;
end;

function FormSinifiEkle(const fsFormSinifi:TFormClass;const pFormDegiskenAdresi: Pointer):Integer;
var fbFormBilgisi:TFormBilgisi;
begin
 Result:=indexOfFormClass(fsFormSinifi);
 if (Result<0) then begin
   fbFormBilgisi.FormSinifi:=fsFormSinifi;
   fbFormBilgisi.FormDegiskenAdresi:=pFormDegiskenAdresi;
   Result:=FormBilgileri.Add(fbFormBilgisi);
 end;
end;

function FormAc(const sFormSinifAdi:String):TForm;
var iYer:Integer; fbFormBilgisi:TFormBilgisi;
begin
 Result:=nil;
 iYer:=indexOfFormClass(sFormSinifAdi);
 if iYer>=0 then begin
   fbFormBilgisi:=FormBilgileri[iYer];
   Result:=TForm(fbFormBilgisi.FormDegiskenAdresi^);
   if not Assigned(Result) then begin
     Result:=fbFormBilgisi.FormSinifi.Create(Application);
   end;
   Result.Show;
 end;
end;

{ TAtaForm }

procedure TAtaForm.DoClose(var Action: TCloseAction);
begin
 Action:=caFree;
 inherited;
end;

procedure TAtaForm.DoCreate;
var iYer:Integer; pFormAdresi: Pointer;
begin
 inherited;
 iYer:=indexOfFormClass(TFormClass(Self.ClassType));
 if (iYer>=0) then begin
   pFormAdresi:=FormBilgileri[iYer].FormDegiskenAdresi;
   if not Assigned(TForm(pFormAdresi^)) then
    TForm(pFormAdresi^):=Self;
 end;
end;

procedure TAtaForm.DoDestroy;
var iYer:Integer; pFormAdresi: Pointer;
begin
 iYer:=indexOfFormClass(TFormClass(Self.ClassType));
 if (iYer>=0) then begin
   pFormAdresi:=FormBilgileri[iYer].FormDegiskenAdresi;
   //if Assigned(TForm(pFormAdresi^)) then -> hatalı 
   if (Self=TForm(pFormAdresi^)) then
    TForm(pFormAdresi^):=nil;
 end;
 inherited;
end;

initialization
 FormBilgileri:=TFormBilgileri.Create;
finalization
 FormBilgileri.Free;
end.
Artık kayda geçilecek bütün formların atası olarak TAtaForm'u verip initialization bloğunada bir kayıt yapan satır eklemekle istediğiniz yapı kurulacaktır. Mesela projede bulunan böyle formlardan birisi TFormX olsun.
unit untFormX;

interface

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

type
 TFormX = class(TAtaForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 FormX: TFormX;

implementation

{$R *.dfm}

initialization
 FormSinifiEkle(TFormX, @FormX);
end.
Bu şekilde TAtaForm'dan türeyen ve initialization bloğunda kayda geçilen sınıf ve sınıfa ait değişkeni artık aşağıdaki gibi kullanabiliriz. Üstelik uses satırına çağırdığımız forma ait uniti  eklememiz de gerekmemektedir. Her form oluştuğunda (mesela TFormX) ilgili forma ait (FormX) değişkene oluşan form atanır veya yok edildiğinde nil ataması gerçekleşecektir. Bütün bunları TAtaForm sınıfı organize ettiği için formların bu sınıftan türemesi şarttır. Bu formlardan birisini kullanmak için ise sadece
FormAc('TFormX');
demek yeterli olacaktır. Eğer siz daha sonra
FormX.Free;
yazsanız bile AtaForm, FormX değişkenine nil değeri atayacaktır. İyi çalışmalar.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [ÇÖZÜLDÜ] Query ismini değişken olarak göndermek Lord_Ares 14 472 12-10-2018, Saat: 12:33
Son Yorum: Lord_Ares
  Classım ile birlikte Listview Elemanlarımın yok olması yhackup 8 3.119 20-09-2016, Saat: 10:10
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi