DLL den dinamik olarak MDIChild form çağırmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mkaderoglu
Üye
Mesajlar: 48
Kayıt: 04 Tem 2007 11:14
Konum: Konya
İletişim:

DLL den dinamik olarak MDIChild form çağırmak

Mesaj gönderen mkaderoglu »

S.A. Herkese kolay gelsin. Arkadaşlar yapmak istediğim şey bir proje ağacı oluşturmak ve bi blob alanda dll leri tutmak. Kullanıcı modül ağacında iki kez tıkladığında Dll li blob alandan çekip çalıştırsın. Bunun için veri tabanı ile alakalı sorunlarımı hallettim. Aşağıdaki kodda

ShowMessage('Deneme');

kodu yerine bu veri tabanı ile alakalı işlemleri koyacağım. Benim sorunum dinamik olarak dll li çağırabiliyorum. Fakat Dll deki formu kapattıktan sonra tekrar açmak istediğimde Dll yerine ana formu açıyor. :)

MDITab.AddTab(F_AnaSayfa.ActiveMDIChild);

Bu kod TAdvOfficeMDITabSet diye bi componente formu ekliyor. Dediğim gibi eğer Dll deki formu kapatıp tekrar açmaya çalışırsam MDITab'a kendini ekliyor.

Yardımcı olacak arkadaşlara şimdiden çok teşekkür ederim.

Kod: Tümünü seç


//MDI Ana Formu

procedure TF_AnaSayfa.DinamikDLLYukle(DllAdi:String);
type
  TDllPrc = Function (MainApp : TApplication; Formname:string;Hand:Cardinal):TForm;stdcall;
var
  PrcMDI :TDllPrc;
begin
  if FileExists(D_Data.T_ModulAgaciDllName.Value + '.dll')
    then
      begin
        DLLHandle := SafeLoadLibrary(DllAdi + '.dll');
        if DLLHandle<>0
          then
            begin
              @PrcMDI := GetProcAddress(DLLHandle , 'ShowMDIChild');
              if @PrcMDI <> nil then MDITab.AddTab(PrcMDI(Application,'F_' + DllAdi,DLLHandle));
            end;
      end
    else
      begin
        ShowMessage('Deneme');
      end;
end;

procedure TF_AnaSayfa.AgacDblClick(Sender: TObject);
begin
  DinamikDLLYukle(D_Data.T_ModulAgaciDllName.Value);
  MDITab.AddTab(F_AnaSayfa.ActiveMDIChild);
end;

//DLL

library Order;

uses
  SysUtils,
  Windows,
  Classes,
  Forms,
  Dialogs,
  Frm_Order in 'Frm_Order.pas' {F_Order};

{$R *.res}

var
DllApp : TApplication;

Function ShowMDIChild(MainApp : TApplication; Formname:string;Hand:Cardinal):TForm; stdcall;
begin
 if not Assigned(DllApp)
  then
    begin
      DllApp := Application;
      Application := MainApp;
    end;

 if Formname='F_Order'
  then
    begin
      if not assigned(F_Order)
        then
          begin
            F_Order := TF_Order.Create(Application.MainForm);
            Result:=F_Order;
            F_Order.Tag:=Hand;
            F_Order.Show;
          end
        else
          begin
            F_Order.Show;
          end;

    end
  else
   begin
    ShowMessage(Formname+' Bu Form Kütüphanede Bulunamıyor');
   end;
 end;

procedure MyDLLProc(Reason: Integer);
begin
 if Reason = DLL_PROCESS_DETACH
  then
    begin
      if Assigned(DllApp)
        then
          begin
            Application := DllApp;
          end;
    end;
end;

exports
ShowMDIChild;

begin
DLLProc := @MyDLLProc;
end.

:) :)
Hayat öldüğünde diplomanı alacağın bir okuldur. Önemli olan doğru hocaları bulmak.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Eğer uygulamanızı parça parça yazıyorsanız ve çok geç değilse size önerim DLL yerine BPL kullanmanız yönünde olacaktır, çünkü özellikle form uygulamalarında %100 uyum ve bellek yönetimiyle ilgili çok titiz olmanıza gerek kalmıyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mkaderoglu
Üye
Mesajlar: 48
Kayıt: 04 Tem 2007 11:14
Konum: Konya
İletişim:

Mesaj gönderen mkaderoglu »

Öneriniz için çok teşekkür ederim. Fakat BPL dosyası ile dinamik olarak yüklemeyi denedim beceremedim. Benim için en önemli aşama ben Exe dosyasını yayınladığım zaman bir daha Exe yayınlamak istemiyorum. Ben bir modül ağacı yaptım. Veri tabanından alıyor datayı. Bu modül ağacında bi blob alan tuttum. Bu alanada bu Dll yada BPL dosyalarını eklemek istiyorum. Her bir modül bir DLL yada BPL dosyası olacak. Amacım eğer bi güncelleme yapacaksam veri tabanına güncel DLL yüklemek. Eğer ki dinamik olarak BPL dosyasını çalıştırabileceğim bi örnek kod varsa elinizde tabiki BPL yapmak sorun olmaz. İlginiz için çok teşekkür ederim.
Hayat öldüğünde diplomanı alacağın bir okuldur. Önemli olan doğru hocaları bulmak.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
Aslında dinamik yükleme yönteminde BPL ile DLL arasında bir fark yok, aşağıdaki makaleyi incelerseniz adım adım BPL içindeki basit bir formun dinamik olarak nasıl çağrılıp kullanılacağı anlatılıyor.

http://delphi.about.com/od/objectpascal ... 12301b.htm

İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mkaderoglu
Üye
Mesajlar: 48
Kayıt: 04 Tem 2007 11:14
Konum: Konya
İletişim:

Mesaj gönderen mkaderoglu »

Sayın vkamada verdiğiniz bilgi için çok teşekkür ederim. Verdiğiniz linkten sorunumu çözdüm.
Hayat öldüğünde diplomanı alacağın bir okuldur. Önemli olan doğru hocaları bulmak.
Cevapla