MDI sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

MDI sorunu

Mesaj gönderen RewriteRule »

Merhaba arkadaşlar,

MDI Form tipini kullanan bir stok uygulamam var. Bu stok uygulamama Datamodule ekledim ve diğer tüm MDIChild Formlarımda bu Datamodule üzerindeki Tablo nesnelerini kullanıyorum. Ancak diyelim ki Hareket formunu açtım ve DBGrid üzerindeki ürünlerde imleçle seçim yaptığım zaman aynı anda açık olan Ürün Yönetimi MDIChild Formumda da Hareketler Formumda işaretlediğim ürüne gidiyor. Çünkü ikisi de aynı Datasource'u kullanıyor. Bende Datamodule nesnesini dpr'dan kaldırdım ve şu kodları yazdım:

1. denediğim kodlar:

Kod: Tümünü seç

private
   { Private declarations }
   dmAll: TdmAll;

Kod: Tümünü seç

procedure TfrBrowse.FormCreate(Sender: TObject);
begin
   dmAll:=  TdmAll.Create(Self);
   dmAll.Inventory_Categories.MasterSource := dmAll.IP_DataSource1;
   dmAll.Inventory_Categories.MasterFields := 'PRODUCT_CATEGORY_ID';
end;
2. denediğim kodlar:

Kod: Tümünü seç

private
   dm: TDM;
   procedure dmcreate;

Kod: Tümünü seç

procedure TFormA.FormCreate(Sender: TObject);
begin
   dmcreate;
end;

procedure TFormA.dmcreate;
begin
  CoInitialize(nil);
  try
    if not assigned(dm) then
    begin
       dm := TDM.Create(Application);
    end;
  finally
    CoUninitialize;
  end;
end;
Ancak yine aynı şekilde oluyor. Her ne kadar dm veya dmAll objelerini private alanda tanımlasam da yine de o iki form birbirine paralel çalışıyor. Yani ayrı birer nesneymiş gibi işlem görmüyorlar. Oysa her forma ait ayrı bir nesene gibi görünmeleri gerekli değil mi? Yardımcı olursanız sevinirim.
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Re: MDI sorunu

Mesaj gönderen serkan »

bir adet stok tablosu ve buna bağlı bir datasource oluşturup projende stokla alakalı tüm kontrolleri (dbgrid,dbedit v.s) bu datasource bağlaman yanlış bir yöntem..Bu hem yazdığın gibi tüm ekranlarda imleç aynı kayda gider,hemde projeyi çok yavaşlatır,hemde mdi kullanmanın amacı olan kullanıcının aynı anda birden çok pencerede işlem yapma şansını ortadan kaldırır.Onun için birbirinden bağımsız pencerelerdeki her kontrolü başka bir stok tablosuna ve ona bağlı datasource bağlamalısın..Burda dikkat etmen gereken yöntem ise güncelleme yani stok kartı ekranından yeni stok kartı açıp,faturaya eklemek istediğinde faturada stok seçmen için gelen ekrandaki tabloyu güncellemelisin.Veri tabanı tasarımından sonra bir projede en çok üzerinde durulması ve iyi planlanması gereken kısımda budur diye düşünüyorum.Kolay gelsin.
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Re: MDI sorunu

Mesaj gönderen RewriteRule »

Bu sorunu çözmek için her formun Create constructorunu override yaptım:

Kod: Tümünü seç

constructor TfrMDIForm.Create(AOwner: TComponent);
var
  dmAll: TdmAll;
begin
  dmAll: TdmAll.Create(Self);
  inherited;
  dmAll.Name := '';
end;
ve private kısımlarına da dmAll: TdmAll; ekledim. Form içinde dmAll(DataSource) üzerindeki herhangi bir neseneye ulaşmaya çalışmadığımda, örneğin dmAll.OraTable1.Filtered := False; gibi, çok güzel bir şekilde çalışıyor. Ancak DataSource üzerindeki bir bileşene ulaşıp işlem yapmak istediğimde maalesef Access Violation hatası alıyorum. dmAll: TdmAll; nerde tanımlamalıyım ki hem diğer formlar göremesin hem de aynı form içinde her procedure'de bu yeni yarattığım nesneyi kullanabileyim?
serkan
Üye
Mesajlar: 666
Kayıt: 10 Tem 2003 12:08
Konum: bursa

Re: MDI sorunu

Mesaj gönderen serkan »

hocam,ne yaptığını bilmiyorum ama ,uğraşma bence yöntem yanlış belki o yazdığın kodlarla bir şekilde çözersin ama standartların dışına çıkma bence.Her penceredeki datacontrolü başka bir datasource bağla.Zor bişey söylesem kolayına kaçmak istiyon diycem ama sen kolayı varken zorunu seçiyorsun.
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Re: MDI sorunu

Mesaj gönderen RewriteRule »

serkan bıraktım zaten. OnActivate-OnDeactivate olaylarında Bookmark kullandım :D
Cevapla