DLL Formu Panelde Göstermek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

Merhaba arkadaşlar konu başlığında da belirttiğim üzere dll formu panelde göstermek istiyorum.
Sitede formları panelde göstermek için bir kaç örnek buldum.


procedure TfrmMain.FormuPaneldeGoster(var Reference; InstanceClass: TComponentClass;
frmMain: TForm; PnlClient: TPanel; sb: TStatusBar);
begin
if Pointer(Reference) = nil Then
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(frmMain);
except
TComponent(Reference) := nil;
raise;
end;
end;
TForm(Reference).Parent := PnlClient;
sb.Panels[0].Text:= 'Gösterilen Pencere: ' + TForm(Reference).Caption;
TForm(Reference).BorderStyle := bsNone;
TForm(Reference).Position := poDefault;
TForm(Reference).Top := 0;
TForm(Reference).Left := 0;
TForm(Reference).ClientWidth := PnlClient.Width;
TForm(Reference).ClientHeight := PnlClient.Height;
TForm(Reference).Show;
end;


procedure TfrmMain.btnPersonnelRegistrationClick(Sender: TObject);
begin
FormuPaneldeGoster(frmPersonnel, TfrmPersonnel, Self, PnlClient, sb);
end;


bu şeklide sorunsuz bir şekilde form panelde gösterilebiliyor. Peki dll formu nasıl gösterebiliriz.

Burada dll formu panel üzerine alabilecek bir örnek var fakat yukarıdaki gibi esnek bir yöntem olması gerekiyor bunu yukarıdaki örneğe nasıl uyarlayabiliriz.
Yardımcı olursanız çok sevinirim.

library testdll;

uses dllunit in 'dllunit.pas' {Form1}, windows;

procedure callform(ParentForm: THandle);
// simple test, resource management is necessary on the form.
var
dllform: TForm1;
begin
dllform := TForm1.Create(nil);
dllform.Show;
Windows.SetParent(dllform.Handle, ParentForm);
end;

exports
callform;

end.


program mainprogram;

procedure callform(ParentHandle: THandle); external 'testdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
callform(Panel1.Handle);
end;
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: DLL Formu Panelde Göstermek

Mesaj gönderen omurolmez »

Merhaba,

(Şu an denemeye vaktim yok)

İlk örneğinizdeki formupaneldegoster işlevini, tıpkı ikinci örnekteki gibi dll e koyarak ve iki unit e de uses ShareMem ekleyerek deneyebilir misiniz ?
Ömür Ölmez
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

daha önce o şekilde denedim fakat bir sonuç alamadım. çünkü o yazdığım kod dll dosyasında aynı işlevi göremiyor.
aslında baktığımızda çok basit bir yöntemi var gibi görünüyor. fakat bir türlü işin içinden çıkamadım. dll formu exe deki formun üzerinde bulunan
panele yerleştirmek olay bu fakat dediğim gibi diğer yazdığım yönteme uygun bir şekilde yapmam gerekiyor. çünkü gösterilen pencere isimlerini
aynı şekilde durum çubuğunda göstermem gerekiyor. ilgilendiğiniz için çok teşekkür ederim. umarım yardımlarınızla bir sonuca ulaşırım.
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: DLL Formu Panelde Göstermek

Mesaj gönderen omurolmez »

Burada sıkıntı, formu panelde göstermek değil de dll içindeki formu alabilmek. İsterseniz şu linke bir bakın, olmazsa beraber deneyelim.
http://delphi.about.com/library/weekly/aa020805a.htm
Ömür Ölmez
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

birkaç deneme yaptım inceledim verdiğiniz sayfayı ama olmadı maalesef çok teşekkür ederim ilgilendiğiniz için
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DLL Formu Panelde Göstermek

Mesaj gönderen mrmarman »

@Okann aynı soruyu Delphidunyasi.NET adresinde de @redbix olarak yazmışsın, orada da cevapladım ama buradan da yazayım arşivde bulunsun.

Merhaba.
@Okann yazdı:Burada dll formu panel üzerine alabilecek bir örnek var fakat yukarıdaki gibi esnek bir yöntem olması gerekiyor bunu yukarıdaki örneğe nasıl uyarlayabiliriz.
- Amacınız şu ise:
1. DLL içindeki formu kendi Application'unuzdaki Panel'de yer alacak şekilde Create etmek.
2. Bu formu sanki sizin Application'da create edilmişcesine tüm form özellikleriyle kullanmak.

- Bu amaç için cevabım aşağıdadır.

- Sizin için oluşturduğum örnek proje kaynak kodları ile birlikte bu mesajın ekindedir. Ancak, forumun dosya boyutu kısıtı nedeniyle build edilmiş DLL ve EXE dosyaları içerikten çıkartılmıştır. Önce DLL'yi derleyip oluşturun. Sonra bu DLL dosyasını Application klasörüne kopyalayıp, ondan sonra Application derleyip çalıştırın.

DLL içeriği ( USES'a Windows eklemeyi unutmayınız.)
Not: YeniForm'un bir fonksiyon olduğunun altını çiziyorum. Bu şekilde istediğiniz Application'da bu pointer yardımı ile direkt atama yapabilirsiniz.

Kod: Tümünü seç

function YeniForm( sahip: HWND): Pointer; stdcall;
var
  Form: TForm1;
begin
  Form := TForm1.CreateParented( sahip );
  Form.Show;
  Result := Pointer(Form);
end;

exports
  YeniForm;
Application içeriği ve Kontroller
Esneklik tabirine uyacak mı bilmiyorum ama, anladığım kadarıyla formu bir FORM değişkene alıp onunla yönetmek istiyorsun şeklinde yorumladım. Aşağıda öyle verdim.

Kod: Tümünü seç

var
  Form1: TForm1;

function YeniForm( sahip: HWND): Pointer; stdcall;
          external 'DLL_icindeFormVar.dll';

implementation

{$R *.dfm}

Var
  xForm_Cagrilan : TForm;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if NOT Assigned( xForm_Cagrilan ) then
  begin
    xForm_Cagrilan := TForm( YeniForm( Panel1.Handle ) );
  end;
  Application.ProcessMessages;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  xForm_Cagrilan.WindowState := wsMaximized;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  xForm_Cagrilan.Left := xForm_Cagrilan.Left + 10;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
  xForm_Cagrilan.Left := xForm_Cagrilan.Left - 10;
end;

end.
Resim

Başarılar.
Dosya ekleri
DLL_Form_App.rar
DLL_Form ve Kullanan Application örnek projeler ve Kaynak kodları
(194.09 KiB) 105 kere indirildi
Resim
Resim ....Resim
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

hocam teşekkür ederim. verdiğiniz örneği inceledim. esneklik derken tam olarak şunu demek istedim. diyelim ki projemde 50 tane dll dosyam var. her dll dosyamda kendim oluşturduğum formlar var. bu formların üzerinde editler db controller vs yani bir form üzerinde olabilecek her şeyi var zaten. geri kalan tek şeyde exe deki ana form üzerinde bulunan panele istediğim dll dosyasındaki formu çağırıp panel üzerine bu dll formu yerleştirmek kalıyor. yani formu sizin yaptığınız gibi çalışma zamanında create etmek değilde zaten var olan dll formu exeye çağırıp panel üzerine yerleştirmek istiyorum. çağırcağımız dll dosyları çok olursa diye düşünerek çağırılacak formun özelliğini exede bir procedure yardımı ile örneğin;

procedure cagirilacak_form_ozelligi;
begin
cagirilan_form.position := poDefault;
cagirilan_form.BorderStyle := bsNone;
cagirilan_form.Top := 0;
cagirilan_form.Left := 0;
cagirilan_form).ClientWidth := anapanel.Width;
cagirilan_formClientHeight := anapanel.Height;
cagirilan_form.Show;
end;


gibi bir procedurü kulanıp her çağırılan forma bu özellikleri verip görüntülemek istiyorum. ilk mesajımda formupanelde göster örneği varya ona uyarlamayı istiyorum.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

çok uğraş verdim sizlere ilginizi eksik etmediğiniz için çok teşekkür ederim
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

mrmarman hocam ben konu üzerinde biraz çalıştım ve aşağıdaki yöntemi uyguladım istediğim gibi çalışıyor. tek eksiğim her butonun altına bu kodu yazmaktansa bunu bir procedure haline getirmek. Yani 10 tane dll formum varsa 10 tane butonun altına o kodu yazarsam kod kirliliği olur çok fazla kod olur. bu konuda yardım edebilirmisiniz. saygılar.


exe

unit unMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TfrmMain = class(TForm)
pnlClient: TPanel;
pnlBottom: TPanel;
btnShow: TButton;
btnClose: TButton;
lblFormName: TLabel;
procedure btnShowClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

function ShowDLLForm(ParentForm: HWND): Pointer; stdcall; external 'DLLForm.dll';
procedure DestroyForm; stdcall; external 'DLLForm.dll';
procedure ProcessFormMessages; stdcall; external 'DLLForm.dll';
function FormShowing: Boolean; stdcall; external 'DLLForm.dll';

var
frmMain: TfrmMain;
NewForm: TForm;

implementation

{$R *.dfm}

procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
DestroyForm;
lblFormName.Caption := '';
end;

procedure TfrmMain.btnShowClick(Sender: TObject);
begin
try
NewForm := TForm(ShowDLLForm(pnlClient.Handle) );
NewForm.BorderStyle := bsNone;
NewForm.Position := poDefault;
NewForm.ClientHeight := pnlClient.Height;
NewForm.ClientWidth := pnlClient.Width;
NewForm.Left := 0;
NewForm.Top := 0;
lblFormName.Caption := 'Açık olan pencere: ' + NewForm.Caption;
try
repeat
ProcessFormMessages;
until
(not FormShowing);
finally
DestroyForm;
end;
except
on E: Exception do
begin
ShowMessage(E.ClassName + ' : ' + E.Message);
end;
end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DestroyForm;
Halt;
end;

end.



DLL

library DLLForm;

uses
SysUtils,
Classes,
Forms,
Windows,
unDLLForm in 'unDLLForm.pas' {frmDLL};

{$R *.res}

function ShowDLLForm(ParentForm: HWND): Pointer; stdcall;
begin
if frmDLL = nil then
begin
frmDLL := TfrmDLL.CreateParented(ParentForm);
end;
frmDLL.Show;
Result := Pointer(frmDLL);
end;

procedure DestroyForm; stdcall; export;
begin
frmDLL.Free;
frmDLL := nil;
end;

procedure ProcessFormMessages; stdcall; export;
begin
Application.ProcessMessages;
end;

function FormShowing: Boolean; stdcall; export;
begin
if frmDLL <> nil then
Result := frmDLL.Showing
else
Result := False;
end;

exports
ShowDLLForm, DestroyForm, ProcessFormMessages, FormShowing;

begin

end.



PROJE LİNKİ:


http://dosya.co/docv4okg2oqb/OMS_DLL.rar.html
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: DLL Formu Panelde Göstermek

Mesaj gönderen G.Arkas »

Kod: Tümünü seç

procedure TForm1.DllFormCagir;
begin
try
NewForm := TForm(ShowDLLForm(pnlClient.Handle) );
NewForm.BorderStyle := bsNone;
NewForm.Position := poDefault;
NewForm.ClientHeight := pnlClient.Height;
NewForm.ClientWidth := pnlClient.Width;
NewForm.Left := 0;
NewForm.Top := 0;
lblFormName.Caption := 'Açık olan pencere: ' + NewForm.Caption;
try
repeat
ProcessFormMessages;
until
(not FormShowing);
finally
DestroyForm;
end;
except
on E: Exception do
begin
ShowMessage(E.ClassName + ' : ' + E.Message);
end;
end;
end;
procedure e parametre vererek label caption form widht,height gibi ayarları oluşturabilirsin.
Resim
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: DLL Formu Panelde Göstermek

Mesaj gönderen Okann »

G.Arkas yazdı:

Kod: Tümünü seç

procedure TForm1.DllFormCagir;
begin
try
NewForm := TForm(ShowDLLForm(pnlClient.Handle) );
NewForm.BorderStyle := bsNone;
NewForm.Position := poDefault;
NewForm.ClientHeight := pnlClient.Height;
NewForm.ClientWidth := pnlClient.Width;
NewForm.Left := 0;
NewForm.Top := 0;
lblFormName.Caption := 'Açık olan pencere: ' + NewForm.Caption;
try
repeat
ProcessFormMessages;
until
(not FormShowing);
finally
DestroyForm;
end;
except
on E: Exception do
begin
ShowMessage(E.ClassName + ' : ' + E.Message);
end;
end;
end;
procedure e parametre vererek label caption form widht,height gibi ayarları oluşturabilirsin.
ben bu örnekte zaten o ayarları oluşturdum.

NewForm := TForm(ShowDLLForm(pnlClient.Handle) ); bu alan sadece showdllform isimli dllyi çağırıyor.


şöyle düşünebiliriz. forum üzerinde 10 tane butonum var ve hepsi faklı dll dosyasındaki forumu çağıracak. demek istediğim budur.
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: DLL Formu Panelde Göstermek

Mesaj gönderen omurolmez »

Kod: Tümünü seç

type
  TData =record
  DllName :string;
  Width :integer;
  Height :integer;
  Caption :string;
  //vb diğerleri
  end;
const
  Formlar :array[0..9] of TData =((DllName:'dll1.dll'; Width:100; Height:100; {vb...}),  .... 
var
 gFormNo :integer =0;

procedure TForm1.FormCreate;
var
  AComponent :TComponent;
  i :integer;
begin
  for i:=0 to ComponentCount-1 do begin
    AComponent :=Components[i];
    if AComponent is TButton and ( Pos(TButton(AComponent).Name, 'Form')>0 ) then
      TButton(AComponent).Caption :=Formlar[AFormNo].Caption;
      TButton(AComponent).Tag :=gFormNo;
      TButton(AComponent).OnClick :=Form1ButtonlarClick;
      Inc(gFormNo);
  end;
end;

procedure TForm1.Form1ButtonlarClick(Sender :TObject);
var
  ASeciliForm :integr;
begin
  ASeciliForm :=TButton(Sender).Tag;
  //Şu anda Formlar[ASeciliForm] özelliklerini kullanarak dll inizi vs istediğiniz gibi oluşturabilirsiniz ...
end;
Ömür Ölmez
Cevapla