birden fazla mdimain form on single application

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
medcail007
Üye
Mesajlar: 12
Kayıt: 06 Tem 2009 11:30

birden fazla mdimain form on single application

Mesaj gönderen medcail007 »

S.a. Arkadaşlar. Bu ilk mesajım.

Kısaca mimariyi anlatmak istiyorum. Exe file var. Bu exe mdimain. Daha sonra her modül için açtığım dll ler içinde bir adet mdimain var ve dll içindeki diğer formları. Bu Mdimain formlarda açtırıyorum. Buraya kadar hiç bir problem yoktu. Fakat projemi remobjects kütüphanesinden faydalanarak değiştirdim. Hydra diye bir component kütüphanesi var. Bu kütüphanede dll içindeki ana formu hydranın çağırabilmesi için hydraplugin olarak açıyorum. Daha sonra önceden Tform sınıfında hiç bir problem olmadan kullandığım aşağıdaki methotlar çalışmamaya başladı. Aldığım hata ise System Error. Code: 1407. Pencere sınıfı bulunamadı. hatası alıyorum. dll içindeki mdi main form ve mdichild olarak açmak istediğim formun içindeki kodları gönderiyorum. Yardımlarınızı bekliyorum Teşekkür ederim.

Unitfrmstok ThyVisualPlugin sınıfına bağlı bir form. Bu mdimain problemsiz olarak açıyorum.

Kod: Tümünü seç

unit nfrmstok;

interface

uses
  {vcl:} Windows, Messages, SysUtils, Variants, Classes, Graphics, 
Controls, Forms, Dialogs, StdCtrls,
  {Hydra:} uHYVisualPlugin, uHYIntf, RzPanel, ExtCtrls, Menus;

type
  TFrm_stok = class(THYVisualPlugin)
    RzStatusBar1: TRzStatusBar;
    RzToolbar1: TRzToolbar;
    MainMenu1: TMainMenu;
    Dosya1: TMenuItem;
    MenuA1: TMenuItem;
    procedure MenuA1Click(Sender: TObject);
  private
  protected
  public
  end;

implementation

uses
  {Hydra:} uHYPluginFactories, nstokkartikayit;

{$R *.dfm}

procedure Create_Frm_stok(out anInstance: IInterface);
begin
  anInstance := TFrm_stok.Create(Application);
end;

resourcestring
  sDescription = '';

const
  sRequiredPrivilege = '';
  sUserData = '';

procedure TFrm_stok.MenuA1Click(Sender: TObject);
begin
if not assigned(Frm_stokkartikayit) then
 begin
   Frm_stokkartikayit := TFrm_stokkartikayit.Create(Self);
   Frm_stokkartikayit.FormStyle := fsMDIChild;
   Frm_stokkartikayit.Show;
 end;
end;

initialization
  THYPluginFactory.Create(HInstance, 'Frm_stok', Create_Frm_stok, TFrm_stok, 
                          1, 0, sRequiredPrivilege, sDescription, sUserData);
Buraya kadar herşey normal. Problemsiz olarak create ettiğim dll içindeki mdi main formun içinde mdi child açmaya çalışıyorum.

Kod: Tümünü seç

unit nstokkartikayit;

interface

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

type
  TFrm_stokkartikayit = class(THYVisualPlugin)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
   FMDIClientHandle:HWND;
    { Private declarations }
   procedure CreateWindowHandle(const Params: TCreateParams);override;
   function GetMDIClientHandle:hwnd;
   Procedure  DestroyWindowHandle;override;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Frm_stokkartikayit: TFrm_stokkartikayit;

implementation

uses nfrmstok;

{$R *.dfm}


procedure Tfrm_stokkartikayit.CreateWindowHandle(const Params: TCreateParams);
var
  CreateStruct: TMDICreateStruct;
begin
 try
  if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
  begin
 FMDIClientHandle := GetMDIClientHandle;
     with CreateStruct do
    begin
      szClass := Params.WinClassName;
      szTitle := Params.Caption;
      hOwner := HInstance;
      X := Params.X;
      Y := Params.Y;
      cX := Params.Width;
      cY := Params.Height;
      style := Params.Style;
      lParam := Longint(Params.Param);
      //lpa
    end;

    WindowHandle := SendMessage(FMDIClientHandle,
      WM_MDICREATE, 0, Longint(@CreateStruct));
    Include(FFormState, fsCreatedMDIChild);
   end else
   begin
     inherited CreateWindowhandle(Params);
   end;
 except
  Raise Exception.Create('Hata');
 end;
end;

procedure TFrm_stokkartikayit.DestroyWindowHandle;
begin
	if( fsCreatedMDIChild in FFormState ) then
		SendMessage(FMDIClientHandle, WM_MDIDESTROY, Handle, 0)
	else
		inherited DestroywindowHandle;

FMDIClientHandle := 0;
end;

function TFrm_stokkartikayit.GetMDIClientHandle:hwnd;
begin
  Result := 0;
	if (owner is TForm) then

		Result := TForm(owner).ClientHandle;
	if (Result = 0) and (assigned(Application.MainForm))  then
		Result := Application.MainForm.ClientHandle;
	if( Result=0) then
		raise Exception.Create('No Parent MDI Form');
end;


procedure TFrm_stokkartikayit.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TFrm_stokkartikayit.FormCreate(Sender: TObject);
begin
//ShowMessage('aa');
end;

procedure TFrm_stokkartikayit.FormDestroy(Sender: TObject);
begin
Frm_stokkartikayit := nil;
end;

end.
Bunlarda client içindeki kodlar normalde bir projede birden fazla mdimain form açılalamakta. Ama Delphinin kendi Tform sınıfındaki formlarında bu method problemsiz çalışıyor. Ama Kullandığım bazı şeylerden dolayı Hydrayı kullanmam gerekiyor. Bundan dolayı böyle bir mesaj gönderiyorum. Teşekkür ederim. A.e.o.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: birden fazla mdimain form on single application

Mesaj gönderen sadettinpolat »

medcail007 yazdı:type
TFrm_stokkartikayit = class(THYVisualPlugin)
diger formlari neden plugin sinifindan turetiyorsunuz ?
plugin icindeki diger formlari normal tform dan turetip kullanabilirsiniz. hata bundan kaynaklaniyor olabilir.

tavsiyem yapmak istediginiz islemi sifirdan bir hydra projesi olusturup adim adim test ederek calistirmaniz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
medcail007
Üye
Mesajlar: 12
Kayıt: 06 Tem 2009 11:30

Re: birden fazla mdimain form on single application

Mesaj gönderen medcail007 »

s.a. cevabın için teşekkür ederim sadettin hocam. Yaptığım denemelerde acaba mı die mdichild formu Thyvisualplugin sınıfından türetmiştim ama normal Tform sınıfından da türettim. ama sonuçta aynı sadettin hocam.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: birden fazla mdimain form on single application

Mesaj gönderen sadettinpolat »

sade basit ve temiz bir proje yapmayi denedin mi sifirdan ?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
medcail007
Üye
Mesajlar: 12
Kayıt: 06 Tem 2009 11:30

Re: birden fazla mdimain form on single application

Mesaj gönderen medcail007 »

s.a. sadettin hocam. Denedim evet hocam ama sonuç aynı. Değişmedi. 2 gündür üzerinde çalışıyorum ama burada takıldım. Yol alamıyorum. Değerli yardımlarınızı bekliyorum. A.e.o.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: birden fazla mdimain form on single application

Mesaj gönderen sadettinpolat »

problemi cozmek icin olusturdugun sifir projeyi buraya atac et. boyle yukaridaki gibi kod yiginina bakinca ben birsey anlamiyorum. bir de ne yapmak istedigini resimle , formla birseyle gorsellestir. tam olarak ne istedigini anlayamadim henuz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
medcail007
Üye
Mesajlar: 12
Kayıt: 06 Tem 2009 11:30

Re: birden fazla mdimain form on single application

Mesaj gönderen medcail007 »

s.a. sadettin hocam. Bu konu ile alakalı biraz dumur oldum. Çünkü yanlışlıkla delphi 2009 sadece client ve dll tertemiz denemeye çalışırken yine aynı hata ile karlılaştım. FAkat yanlışlıkla bir ara delphi 2006 da compile etmişim çalıştı ve farkettimki delphi 2006 da compile ettiğim çalışan 2009 çalışmıyor :( şaşırdım. Proje ekliyorum. Yardımlarınızı bekliyorum. A.e.o.
Dosya ekleri
dllform.rar
proje dosyası mdimain form dll on single application
(233.46 KiB) 91 kere indirildi
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: birden fazla mdimain form on single application

Mesaj gönderen sadettinpolat »

bu mdi isinden cok anlamam ama sagdan soldan okuduklarima gore bir programda bir tane mdiform olabiliyor o da main form. sen ayni projede birden fazla mdi main form olusturunca program anlamsiz bir hata vermeye basliyor.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
medcail007
Üye
Mesajlar: 12
Kayıt: 06 Tem 2009 11:30

Re: birden fazla mdimain form on single application

Mesaj gönderen medcail007 »

Şimdi şöle bir soru işareti çıktı. Bir kaç projedede denedim. codegear 2009 da compile ettiğim exe ve dll daha sonra 2006 da ikisinede compile ediyorum çalışıyor ama herhangi birini 2009 da veya 2006 da compile ettiğim zaman çalışmıyorlar. Bu problem nedendir arkadaşlar. Muhtemelen bu problemden kaynaklanıyor bu mesajımdaki problem diye düşününorum. Acaba benim delphi 2009 da bişey mi var dedim hem 2006 hem de 2009 komple sıfır yükledim. üzerinde hiç bişi olmadan problem yine aynı. Yardımlarınızı bekliyorum. Teşekkürler.
Cevapla