Dll içinde Tab Tuşu Çalışmıyor ama Exe de çalışıyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Dll içinde Tab Tuşu Çalışmıyor ama Exe de çalışıyor

Mesaj gönderen delphist »

S.a. Arkadaşlar Bu Tab Tuşu Çalışmıyor Dll içinde :evil: kafayı falan yedim...Parçalayacam kendimi...Exelerde çalışıyor ama benim yaptığım prgramda modüller dll ve tab tuşu çalışmıyor kesinlikle ben ne yapacam nasıl yapacam hata nerde bulamıyorum çıldırmak üzereyim .....Teşekkürler :cry:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

- Ben de denedim ama TAB tuşu sorunsuz çalışıyor. Siz nasıl Create ettiniz. Bir örnek verir misiniz... Benim örneğim aşağıdaki gibi...

- Delphi IDE'de DLL projesi açıkken yeni bir form oluşturup üzerine 3 tane TEdit koydum ve DLLFormUnit olarak kaydettim.

Kod: Tümünü seç

library DLLFormDLL;

uses
  Forms,
  SysUtils,
  Classes,
  DLLFormUnit in 'DLLFormUnit.pas' {Form1};

{$R *.res}
Procedure KayitFormu;
begin
  Application.CreateForm(TForm1, Form1);
  Form1.ShowModal;
end;

Exports
  KayitFormu;
begin
end.


- Daha sonra yeni Proje açıp DLL procedure tanımını yapıp, sadece 1 TButton koydum.

Kod: Tümünü seç

Procedure KayitFormu; StdCall; External 'D:\Programcilik\Delphi\Guncel\DLL Form ornegi\DLLFormDLL.dll'; 

procedure TForm1.Button1Click(Sender: TObject);
begin
  KayitFormu;
end;
- Kısa bir süre için örnek proje ikilisini FTP'ye koyuyorum...
http://divxturk.divxforever.com/files/g ... _arman.zip
Resim
Resim ....Resim
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

Teşekkür ederim açıklayıcı ve bu güzel cevabınız için benim şu anda kullandığım projedeki yapıyı ve çağırma şeklide dahil aşağıdadır. Yardımlarınızı bekliyorum eğer bir hata varsa neree gerçekten bulamadım.

Kod: Tümünü seç

procedure Mdichildgoster(MainApp: TApplication; Formname: string; kullanici:
  string; ADMINMI: string); export;
begin
  if not Assigned(DllApp) then
  begin
    DllApp := Application;
    Application := MainApp;
  end;
 

//////////////////////////////////////////////////////////////////////
  if Formname='Frm_stokizleme' then
   begin
    if not assigned(Frm_stokizleme) then
     begin
      Frm_stokizleme := TFrm_stokizleme.Create(Application.MainForm);
      Frm_stokizleme.FormStyle := fsmdichild;
      Frm_stokizleme.Show;
     end;
   end; 
////////////////////////////////////////////////////////////////////////

end;


procedure MyDLLProc(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    { DLL is unloading. Restore the Application pointer. }
    if Assigned(DllApp) then
      Application := DllApp;
end;

begin
DLLProc := @MyDLLProc;
end.


Exedende dinamik çağırıyorum aşağıdaki gibi

var
 Handle: integer;
 Mdichildgoster: procedure(Application: Tapplication; Formname: string;
 kullanici: string; ADMIN: string);
begin
  try
  Screen.Cursor := crSQLWait;
   handle := LoadLibrary('../moduller/stok/stokmdl.dll');
    if Handle <> 0 then
    begin
      @Mdichildgoster := GetProcAddress(handle, 'Mdichildgoster');
      if @Mdichildgoster <> nil then
        Mdichildgoster (Application, 'Frm_stokizleme', username, ADMINUSER)
      else
      begin
        ShowMessage('HATA : 00001, Çağrılan Procedure Bulunamadı [Stok Modülü]');
      end;
    end
    else
    begin
      ShowMessage('HATA : 00002, Stokmdl Dll Kütüphanesi Bulunamadı [Stok Modülü]');
      FreeLibrary(Handle);
    end;
  finally
  Screen.Cursor := crDefault;
  end;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Merhaba.

- Yazdığın örneğe göre kendi örneğimi güncelledim aşağıdaki gibi oldu. Bu şekilde yine çalışıyor. Yalnız bir şartla. Modal bir form oluşturursan. Yani MDIForm kullanmazsan. Aşağıdaki açıklamalarımdan önce söylemeliyim ki -kesin konuşmayı sevmem biraz yumuşatıcam- probleminin direkt çözümü olduğu görülmüyor.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
 Handle: integer;
 KayitFormu: Procedure;
begin
  try
  Screen.Cursor := crSQLWait;
   handle := LoadLibrary('D:\Programcilik\Delphi\Guncel\DLL Form ornegi\DLLFormDLL.dll');
    if Handle <> 0 then
    begin
      @KayitFormu := GetProcAddress(handle, 'KayitFormu');
      if @KayitFormu <> nil then
        KayitFormu
      else
      begin
        ShowMessage('HATA : 00001, Çağrılan Procedure Bulunamadı [Stok Modülü]');
      end;
    end
    else
    begin
      ShowMessage('HATA : 00002, Stokmdl Dll Kütüphanesi Bulunamadı [Stok Modülü]');
      FreeLibrary(Handle);
    end;
  finally
  Screen.Cursor := crDefault;
  end;
end;
- Borland'ın bir BUG'una takılmışsın gibi görülüyor. Borlandın sitesinde Bug listesine ulaşamadım ama google sonuçlarındaki ortak kanı bu yönde ve TeamB de (gönüllü yazılım çözüm üretici bir gruptur) bunun aksini söylemediğine göre doğru gibi görünüyor... Onlar da çözüm olarak Package kullanın diyorlar...

- DLL içerisinde MODAL olamayacak türde bir Form olan MDIChild form kullanmak karşılaştığın sorunları doğuruyor.

- Bu linkte ve benzerlerinde seninle aynı sorunu paylaştıkları görülüyor.

- Ben daha önce bu tip bir uygulama yapmadım ama MDIChild ile denediğimde aynı sorunla karşılaştım. Delphi 7 kullanıyorum. Bu durum eğer gerçekten bir BUG ise bu sürümde de halen devam ediyor.

- Yorumlardan edindiğim ilginç izlenimlerden ikisi,

- DLL yerine PACKAGE kullanırsan bu problem ortadan kalkacağı ama diğer yandan DLL dinamizmini yitireceğinden, program güncellemesi yapıldığında çalışmakta olan programın tekrar kapatılıp açılması gerekeceği...

- Asıl ilginç olanı ise Delphi 5 ve sonrasında aynı sorunu çıkartırken, Delphi 4 ile projede değişiklik yapılmaksızın derlendiğinde sorunun olmadığını rapor edenler var.

- Ayrıca değişik çözüm üretenler de var. Mesajları Ana Form'dan tuş mesajlarını kapıp bunu MDIChild'a yönlendirme metodu bunlardan birisi...

- Bunların dışında karamsar bir tablo çizenler de var...

Roman Broz'un yazdıkları gibi...

- Üzgünüm çözüm üretemedik... İngilizcenin durumuna göre Google'da konu ile ilgili çok kaynak var. Gözümden kaçmış olanları da vardır ki bu en son yazdığım Roman Broz'un threadi 1999 yılından kalma. Araştırmaya devam et. Sonucu burada bildir ki ihtiyacı olabilecek ben dahil herkese faydalı olsun...
Resim
Resim ....Resim
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Problemi çözdük,

TAB tuşunun message ını mdi forma ulaşamamasından dolayı olduğunu varsayarak tuşun oluşturduğu message ı applicationun ana mesaj döngüsünden almaya çalışmanın yollarını araştırdım.

Şöyle bir yol bulduk :

Kod: Tümünü seç

type

  TForm1 = class(TForm)

    ...

  private

    ...

    procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);

    ...

  end;

<--------------->
procedure TForm1.FormCreate(Sender: TObject);

begin

  Application.OnMessage := ApplicationMessage;

end;

procedure TForm1.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin

  if (Msg.Message  =   WM_KEYDOWN) and (Msg.wParam = VK_TAB) then
  begin
        self.Perform(Wm_NextDlgCtl, 0, 0);
   end;

end;

Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

undefined kardeşim çok teşekkür ederim cillop gibi çalışıyor... :)
Cevapla