DLL Formu Panelde Göstermek
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
DLL Formu Panelde Göstermek
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;
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;
Re: DLL Formu Panelde Göstermek
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 ?
(Ş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
Re: DLL Formu Panelde Göstermek
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.
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.
Re: DLL Formu Panelde Göstermek
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
http://delphi.about.com/library/weekly/aa020805a.htm
Ömür Ölmez
Re: DLL Formu Panelde Göstermek
birkaç deneme yaptım inceledim verdiğiniz sayfayı ama olmadı maalesef çok teşekkür ederim ilgilendiğiniz için
Re: DLL Formu Panelde Göstermek
@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.
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.
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.

Başarılar.
Merhaba.
- Amacınız şu ise:@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.
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;
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.

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
Re: DLL Formu Panelde Göstermek
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.
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.
Re: DLL Formu Panelde Göstermek
çok uğraş verdim sizlere ilginizi eksik etmediğiniz için çok teşekkür ederim
Re: DLL Formu Panelde Göstermek
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
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
Re: DLL Formu Panelde Göstermek
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;
Re: DLL Formu Panelde Göstermek
ben bu örnekte zaten o ayarları oluşturdum.G.Arkas yazdı:procedure e parametre vererek label caption form widht,height gibi ayarları oluşturabilirsin.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;
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.
Re: DLL Formu Panelde Göstermek
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