Bulunduğu Forma ait prosedürler çalışsın.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Bulunduğu Forma ait prosedürler çalışsın.

Mesaj gönderen vampir261 »

Dün gece forumda baya gezdim parent ile güzel örenkler vardı ancak benim istediğim tasarım için uygun kodu bulamadım. Çok basit bir kod ama olmayınca olmuyor demekki :) neyse daha fazla uzatmayayım.


Elimde form1 ( anaform ) , form2,form3 olmak üzere 3 adet form var. Form1 de bir panel var bu panelde ileri, geri, ekle,sil gibi sabit butonlar olacak. Benim amacım açtığım formda bu panel alt kısımda görünsün (bu kısımda sorun yok parent ile yapılıyor) ve görünen paneldeki butonlara tıklandığı zaman bulunduğu forma ait ileri,geri,ekle,sil gibi procedure leri çağırabilsin. Yazdığım kodda butona tıklanınca hep form3 e ait procedure çalışıyor.

Kod: Tümünü seç

  Panel2.Parent:=form2;
  form2.ShowModal;
form2 yi açan kod paneli atayarak

Kod: Tümünü seç

  Panel2.Parent:=form3;
  form3.ShowModal;
form3 ü açan kod paneli atayarak

Kod: Tümünü seç

ekle(self);
paneldeki ekle butonu altındaki kod

Kod: Tümünü seç

procedure ekle(Sender: TObject);
begin
  ShowMessage('Bu yazıyı okuyabiliyorsanız form2 de kayıtlı bulunan ekle prodecure çalışmış demektir');
end;
form2 deki ekle procedure

Kod: Tümünü seç

procedure ekle(Sender: TObject);
begin
  ShowMessage('Bu yazıyı okuyabiliyorsanız form3 te kayıtlı bulunan ekle prodecure çalışmış demektir');
end;
form3 teki ekle procedure

Umarım sorumu açıkça anlatabilmişimdir. Bir sorunun farklı çözümleri olabilir eminim bu iş için daha farklı ve güzel çözümleri olanlar vardır. Forumda da cevap vardır belki ama ben hangi kelimeler ile arayacağımı tam olarak bilemedim. Bu yüzden de çözüm için yardımlarınızı bekliyorum Saygılar.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
interface kullanarak yapılabilri gibime geliyor.
ama fazla kasmadan panelin parentini ayarladığın yerde buttonların onclick eventinida değiştir...
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Merhaba,

Self kismini, TForm(Panel1.Parent) seklinde degistirip deneyebilirmisiniz?

Kolay gelsin.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Benim fikrim geldi =)

Bir record tip tanımlanır:

Kod: Tümünü seç

type
  TIsmlemler = record
    Ekle: TNotifyEvent;
    Duzenle: TNotifyEvent;
  // ve benzeri
  end;
ana form dahil tüm formlarda AIslemler: TIslemler tanımlanır.

Ana form haricinde formların 'OnCreate' yordamlarında AIslemler'in prosedürleri atanır:

Kod: Tümünü seç

begin
  AIslemler.Ekle := Ekle;
  AIslemler.Duzenle := Duzenle;
  // ve diğerleri
Ana form ise

Kod: Tümünü seç

Panel2.Parent := Form3;
AIslemler := Form3.AIslemler;
Form3.ShowModal;
şeklinde düzenlenir.

Panel2'deki butonlara ise, örneğin ekle butonuna, şu şekilde kod yazılır:

Kod: Tümünü seç

begin
  AIslemler.Ekle(Self);
end;
bu biir.

İkincisi, bu butonlara yazılan kodlar yalnızca Post, Append vb. tek satırlık kodlar ise, bu record tip hiç tanımlanmaz, anaformda ADataSource tanımlanır, Form2, Form3.. açılırken ADataSource := Form2.DataSource şeklinde atama yapılır ve paneldeki butonlarda kodlar DataSource.DataSet.Append vb. biçimlerde yazılır.

Aslında yapılması gereken ilk başta ata form kullanmaktır ya, neyse.. :P

Kolay gelsin..
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Glen yazdı:Merhaba,

Self kismini, TForm(Panel1.Parent) seklinde degistirip deneyebilirmisiniz?

Kolay gelsin.
Bunu denemiştim ama sonuç self ile hemen hemn aynı çıktı. Diğer kardeşimin yönteminide deneyeceğim. Aslında geçen hafta bir abi ile yazdık ama o kayıt etmeyi unutmuş ve tekrar yazdığımız o basit kodu arıyorum sakin kafa ile bulurum inşallah
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

ulu coder yazdı:Benim fikrim geldi =)

İkincisi, bu butonlara yazılan kodlar yalnızca Post, Append vb. tek satırlık kodlar ise, bu record tip hiç tanımlanmaz, anaformda ADataSource tanımlanır, Form2, Form3.. açılırken ADataSource := Form2.DataSource şeklinde atama yapılır ve paneldeki butonlarda kodlar DataSource.DataSet.Append vb. biçimlerde yazılır.

Aslında yapılması gereken ilk başta ata form kullanmaktır ya, neyse.. :P

Kolay gelsin..

Bazı kısımlarda böyle basit kodlar olacak ama işlem yap gibi özel butonlar olacak aktif forma göre farklı işlemler yapacak. Düşünceniz için teşekkür ederim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

MethodAddress adli bir fonkisyon var. bu fonksiyon ile method adini string olarak belirtip adresini ogrenebiliyorsun. bu fonksiyonu kullanarak aktif form uzerindeki prosedur veya fonksiyonlari bularak cagirabilirsin.
dikkat edilmesi gereken tek husus var o da MethodAddress fonksiyonu ile bulmak istedigin prosedur ya da fonksiyonun published bolumunde tanimlanmis olmasi gerekir.

buna benzer bir sorunla karsilasinca kullanmistim. senin isini ne derece gorur bilemiyorum ama benim isimi gormustu ama uygulanabilecek en iyi cozum degil bana gore. bu yontem yerine nesneye yonelik programlamanin kalitim ve cok bicimlilik ozellikleri kullanilirsa bakimi ve gelistirmesi kolay bir kod elde etmis olursunuz.


Unit1.Pas

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public

  published
  procedure btn1;
  procedure btn2;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.btn1;
begin
ShowMessage('btn1 ' +  self.ClassName);
end;

procedure TForm1.btn2;
begin
ShowMessage('btn2 ' +  self.ClassName);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  myProc:procedure of object;
begin
TMethod(myProc).data:=panel1.Parent;
TMethod(MyProc).code :=panel1.Parent.MethodAddress('btn1');
if Assigned(myProc) then  myProc;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  myProc:procedure of object;
begin
TMethod(myProc).data:=panel1.Parent;
TMethod(MyProc).code :=panel1.Parent.MethodAddress('btn2');
if Assigned(myProc) then  myProc;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Panel1.Parent := form2;
form2.ShowModal;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Panel1.Parent := form3;
form3.ShowModal;
end;

end.
Unit1.dfm

Kod: Tümünü seç


object Form1: TForm1
  Left = 187
  Top = 212
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 16
    Top = 40
    Width = 257
    Height = 49
    Caption = 'Panel1'
    TabOrder = 0
    object Button1: TButton
      Left = 16
      Top = 8
      Width = 75
      Height = 25
      Caption = 'Button1'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 112
      Top = 8
      Width = 75
      Height = 25
      Caption = 'Button2'
      TabOrder = 1
      OnClick = Button2Click
    end
  end
  object Button3: TButton
    Left = 344
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 1
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 344
    Top = 56
    Width = 75
    Height = 25
    Caption = 'Button4'
    TabOrder = 2
    OnClick = Button4Click
  end
end


unit2.pas

Kod: Tümünü seç


unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
 public
  published
  procedure btn1;
  procedure btn2;

    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.btn1;
begin
ShowMessage('btn1 ' +  self.ClassName);
end;

procedure TForm2.btn2;
begin
ShowMessage('btn2 ' +  self.ClassName);
end;

end.


unit3.pas

Kod: Tümünü seç

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm3 = class(TForm)
  private
    { Private declarations }
  public
  published  
  procedure btn1;
  procedure btn2;
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

{ TForm3 }

procedure TForm3.btn1;
begin
ShowMessage('btn1 ' +  self.ClassName);
end;

procedure TForm3.btn2;
begin
ShowMessage('btn2 ' +  self.ClassName);
end;

end.

"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Gönderdiğiniz çözüm işimi gördü.:D Teşekkür ederim. Akşamüstü bizde buna benzer bir yolla çözüleceğini düşündük ama vakit yetmedi çalışan bir kod yazamadık. :evil: Yapılacak proje ufak çaplı olduğu için bu çözüm sağlıklı çalışacağına inanıyorum. :wink: Önerileriniz için ayrıca teşekkür ederim. :bravo:
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

vampir261 yazdı:Gönderdiğiniz çözüm işimi gördü.:D Teşekkür ederim. Akşamüstü bizde buna benzer bir yolla çözüleceğini düşündük ama vakit yetmedi çalışan bir kod yazamadık. :evil: Yapılacak proje ufak çaplı olduğu için bu çözüm sağlıklı çalışacağına inanıyorum. :wink: Önerileriniz için ayrıca teşekkür ederim. :bravo:
forma gizli bir bileşen koyar ve invisible yaparsın. o a datasource atarsın.

butonların kodunuda hep şöyle yazacasksın

dbedit1.datasource.dataset.post; gibi
böylece kodun jenerik olur. bunu repositorye ekleyip formu inherit edersen hiç bir sorun kalmaz.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Cevapla