Dinamik Yüklenen Paketler Hk.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cihan
Üye
Mesajlar: 65
Kayıt: 02 Ağu 2005 03:34

Dinamik Yüklenen Paketler Hk.

Mesaj gönderen cihan »

Arkadaşlar öncelikle ne yapmak istediğimle ilgili bilgi verip bu konuda bilgilerinize ihtiyacım var .Forum da ve nette aradım bir kaç örnek buldum birkaç kitapda inceledim ama bir türlü çözüm bulamadım.

Yapmak istediğim şey

Firebird IBX bileşenlerini kullanarak bir stok programı yazdım. Bu program
bir ana menüden diğer formlara ulaşarak çalışacak. Formları paketlerin içine koyup dinamik olarak yüklemek istiyorum. Araştırmalarımda DLL lerin sorun yaratabileceği bunun yerine BPL kullanmanın daha avantjlı olduğu bilgisini edindim. Normalde bu işlemi arabirim kullanarak yada paketteki formları register ederek yapabiliyorum. Çözemediğim kısım Anafrm bulunan yada Datamodulde bulunan IBdatabase ile pakette bulunan IBDataseti birbirine bağlayamıyorum her paketin içine datamodulü bağlayıp derlemek çok mantıklı gelmiyor.Birden fazla IBdatabase kullanmakta mantıklı gelmiyor.

Yardımlarınız için şimdiden teşekkür ederim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

Ben BPL kullanımında bağlantıyı yapmak için.
Aşağıdaki kodu kullanmıştım

Kod: Tümünü seç

sorgu.Database:=TIBDatabase(application.MainForm.FindComponent('IBDB'));
sorgu.Transaction:=TIBTransaction(application.MainForm.FindComponent('IBTR'));

Burada sorgu : IBTable veya IBQuery ;
IBDB : TIBDatabase;
IBTR : TIBTransaction;

Kod: Tümünü seç

application.mainform
yerine

Kod: Tümünü seç

application.findcomponet('FormAdi')
deyimini de kullanabilirsin.


DataFieldleri (ya da bindingsource) bağlamak için ise aşağıdakiörnek kodu kullandım

Kod: Tümünü seç

DSTKod.DataField      :='STKOD';        //30
DSTAD.DataField       :='STAD';  //120
DSATISF1.DataField    :='SATISF1'; // Double
DAlisF1.DataField     :='ALISF';
DDovizTipi.DataField  :='DOVIZTIPI';      // 10
DBirim1.DataField     :='BIRIM1'; //30
DBirim2.DataField     :='BIRIM2';     // 30
DBIRIM3.DataField     :='BIRIM3'; //30
DLBIRIM1.DataField    :='BIRIM1'; //30
DLBIRIM2.DataField    :='BIRIM2'; //30
DBIRIM12.DataField    :='BIRIM12'; //30
DBIRIM23.DataField    :='BIRIM23'; //30
DUreticiKodu.DataField:='URETICIKODU';//60
DTipi.DataField       :='TIPI';    // 20
DNetAg.DataField      :='NETAG';
DBrutAg.DataField     :='BRUTAG';
DAcilisTar.DataField  :='ACilisTar';
DVadeGunu.DataField   :='VADEGUNU';
DiskontoA.DataField   :='ISKONTOA';
DiskontoS.DataField   :='ISKONTOS';
DDSatisf1.DataField   :='DSATISF1';
DDAlisF1.DataField    :='DALISF';
DKDVA.DataField       :='KDVA';
DKDVS.DataField       :='KDVS';
Kullanıcı avatarı
cihan
Üye
Mesajlar: 65
Kayıt: 02 Ağu 2005 03:34

Mesaj gönderen cihan »

Lost Soul yazdı:Ben BPL kullanımında bağlantıyı yapmak için.
Aşağıdaki kodu kullanmıştım

Kod: Tümünü seç

sorgu.Database:=TIBDatabase(application.MainForm.FindComponent('IBDB'));
sorgu.Transaction:=TIBTransaction(application.MainForm.FindComponent('IBTR'));

Burada sorgu : IBTable veya IBQuery ;
IBDB : TIBDatabase;
IBTR : TIBTransaction;

Kod: Tümünü seç

application.mainform
yerine

Kod: Tümünü seç

application.findcomponet('FormAdi')
deyimini de kullanabilirsin.


DataFieldleri (ya da bindingsource) bağlamak için ise aşağıdakiörnek kodu kullandım

Kod: Tümünü seç

DSTKod.DataField      :='STKOD';        //30
DSTAD.DataField       :='STAD';  //120
DSATISF1.DataField    :='SATISF1'; // Double
DAlisF1.DataField     :='ALISF';
DDovizTipi.DataField  :='DOVIZTIPI';      // 10
DBirim1.DataField     :='BIRIM1'; //30
DBirim2.DataField     :='BIRIM2';     // 30
DBIRIM3.DataField     :='BIRIM3'; //30
DLBIRIM1.DataField    :='BIRIM1'; //30
DLBIRIM2.DataField    :='BIRIM2'; //30
DBIRIM12.DataField    :='BIRIM12'; //30
DBIRIM23.DataField    :='BIRIM23'; //30
DUreticiKodu.DataField:='URETICIKODU';//60
DTipi.DataField       :='TIPI';    // 20
DNetAg.DataField      :='NETAG';
DBrutAg.DataField     :='BRUTAG';
DAcilisTar.DataField  :='ACilisTar';
DVadeGunu.DataField   :='VADEGUNU';
DiskontoA.DataField   :='ISKONTOA';
DiskontoS.DataField   :='ISKONTOS';
DDSatisf1.DataField   :='DSATISF1';
DDAlisF1.DataField    :='DALISF';
DKDVA.DataField       :='KDVA';
DKDVS.DataField       :='KDVS';

findcomponet dışında bir yöntem yokmu?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

FindComponenet zaten olayı tek satırda çözüyor.
Eğer niyetin designtime da veritabanına erişip gerekli bağlantıları yapmak ise bildiğim kadarıyla bu mümkün değil.

Ayrıca find componentin olduğu fonksiyonu direkt kullanmak yerine şöyle bir procedure oluşturabilirsin.

Kod: Tümünü seç

Procedure TBenimBPL.TabloAc(TabloAdi : String);
begin
if tablo.active then tablo.Close;
tablo.Database:=TIBDatabase(application.MainForm.FindComponent('IBDB'));
sorgu.Transaction:=TIBTransaction(application.MainForm.FindComponent('IBTR'));

tablo.TableName:=TabloAdi;
tablo.Open;
ayrıca

Kod: Tümünü seç

DSTKod.DataField      :='STKOD';        //30
DSTAD.DataField       :='STAD';  //120
DSATISF1.DataField    :='SATISF1'; // Double
DAlisF1.DataField     :='ALISF';
DDovizTipi.DataField  :='DOVIZTIPI';      // 10
DBirim1.DataField     :='BIRIM1'; //30
DBirim2.DataField     :='BIRIM2';     // 30
DBIRIM3.DataField     :='BIRIM3'; //30
DLBIRIM1.DataField    :='BIRIM1'; //30
DLBIRIM2.DataField    :='BIRIM2'; //30
DBIRIM12.DataField    :='BIRIM12'; //30
DBIRIM23.DataField    :='BIRIM23'; //30
DUreticiKodu.DataField:='URETICIKODU';//60
DTipi.DataField       :='TIPI';    // 20
DNetAg.DataField      :='NETAG';
DBrutAg.DataField     :='BRUTAG';
DAcilisTar.DataField  :='ACilisTar';
DVadeGunu.DataField   :='VADEGUNU';
DiskontoA.DataField   :='ISKONTOA';
DiskontoS.DataField   :='ISKONTOS';
DDSatisf1.DataField   :='DSATISF1';
DDAlisF1.DataField    :='DALISF';
DKDVA.DataField       :='KDVA';
DKDVS.DataField       :='KDVS';
TABLO.First;

end;
yerine nesnelere designtime da fieldler ile aynı ismi verirsin.
ve bağlanma esnasında.

Kod: Tümünü seç

For i := Tablo.FieldCount-1 do
 TDBEdit(BenimBPL.findcomponent(Tablo.fields[i].fieldname)).DataField:=Tablo.Fields[i].FieldName;
diyerek tüm Modüllerinde kullanabilirsin.
Başka da aklıma gelmiyor. Daha kısa yöntemi var mı bilmiyorum.
İyi çalışmalar.
Kullanıcı avatarı
cihan
Üye
Mesajlar: 65
Kayıt: 02 Ağu 2005 03:34

Mesaj gönderen cihan »

Lost Soul yazdı:FindComponenet zaten olayı tek satırda çözüyor.
Eğer niyetin designtime da veritabanına erişip gerekli bağlantıları yapmak ise bildiğim kadarıyla bu mümkün değil.

Ayrıca find componentin olduğu fonksiyonu direkt kullanmak yerine şöyle bir procedure oluşturabilirsin.

Kod: Tümünü seç

Procedure TBenimBPL.TabloAc(TabloAdi : String);
begin
if tablo.active then tablo.Close;
tablo.Database:=TIBDatabase(application.MainForm.FindComponent('IBDB'));
sorgu.Transaction:=TIBTransaction(application.MainForm.FindComponent('IBTR'));

tablo.TableName:=TabloAdi;
tablo.Open;
ayrıca

Kod: Tümünü seç

DSTKod.DataField      :='STKOD';        //30
DSTAD.DataField       :='STAD';  //120
DSATISF1.DataField    :='SATISF1'; // Double
DAlisF1.DataField     :='ALISF';
DDovizTipi.DataField  :='DOVIZTIPI';      // 10
DBirim1.DataField     :='BIRIM1'; //30
DBirim2.DataField     :='BIRIM2';     // 30
DBIRIM3.DataField     :='BIRIM3'; //30
DLBIRIM1.DataField    :='BIRIM1'; //30
DLBIRIM2.DataField    :='BIRIM2'; //30
DBIRIM12.DataField    :='BIRIM12'; //30
DBIRIM23.DataField    :='BIRIM23'; //30
DUreticiKodu.DataField:='URETICIKODU';//60
DTipi.DataField       :='TIPI';    // 20
DNetAg.DataField      :='NETAG';
DBrutAg.DataField     :='BRUTAG';
DAcilisTar.DataField  :='ACilisTar';
DVadeGunu.DataField   :='VADEGUNU';
DiskontoA.DataField   :='ISKONTOA';
DiskontoS.DataField   :='ISKONTOS';
DDSatisf1.DataField   :='DSATISF1';
DDAlisF1.DataField    :='DALISF';
DKDVA.DataField       :='KDVA';
DKDVS.DataField       :='KDVS';
TABLO.First;

end;
yerine nesnelere designtime da fieldler ile aynı ismi verirsin.
ve bağlanma esnasında.

Kod: Tümünü seç

For i := Tablo.FieldCount-1 do
 TDBEdit(BenimBPL.findcomponent(Tablo.fields[i].fieldname)).DataField:=Tablo.Fields[i].FieldName;
diyerek tüm Modüllerinde kullanabilirsin.
Başka da aklıma gelmiyor. Daha kısa yöntemi var mı bilmiyorum.
İyi çalışmalar.
Teşekkürler
Cevapla