Dll Form Bağlantıları Hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
supervisor
Üye
Mesajlar: 50
Kayıt: 07 Kas 2005 10:38
Konum: Turgutlu

Dll Form Bağlantıları Hakkında

Mesaj gönderen supervisor »

S.a.
1 DLL içinde 2 adet formum var.Bu iki dll formu normal programimda dinamik olarak calistirabiliyorum. Fakat örnek olarak Dll form2 de bulunan text icinde yazilanlari dll form1 deki text alanina alamadim.
basit olarak yani :oops:
Form2.buttonclik olayina Form1.edit1.text := Form2.edit1.text;
access violation hatasi verdi.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen aslangeri »

s.a.
dll içindeki prosedürde formları create ettinmi.
normal uygulamalarda (aksini yapmadığınız müddetçe) formlar otomatik create edilir.
ancak dll de formları kendiniz create etmelisiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
supervisor
Üye
Mesajlar: 50
Kayıt: 07 Kas 2005 10:38
Konum: Turgutlu

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen supervisor »

aslangeri yazdı:s.a.
dll içindeki prosedürde formları create ettinmi.
normal uygulamalarda (aksini yapmadığınız müddetçe) formlar otomatik create edilir.
ancak dll de formları kendiniz create etmelisiniz.
kolay gelsin.
@aslangeri dll formdada create işlemini yazmasam dahi otomatik kendi prodesure ekliyor.
Form1dll den Form2dll deki editlere komut olarak erişebiliyorum.Yani Formlar kodlama yaparken birbirini goruyor.Form2dlldeki edit içeriğini form1dll edit içine yada label içine aktaramıyorum. :shock: Formlar normal açılıyor yani. :?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen aslangeri »

.....Formlar kodlama yaparken birbirini goruyor...
kod yazarken (design time)formların biribirini görmesi ayrı bir şey.
run time sırasında fromların create edilmesi ayrı bir şey.
a.v. hatasını create edilmemiş (veya free edilmiş) bir bileşene erişmek istediğiniz zaman alırsınız.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
supervisor
Üye
Mesajlar: 50
Kayıt: 07 Kas 2005 10:38
Konum: Turgutlu

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen supervisor »

aslangeri yazdı:
.....Formlar kodlama yaparken birbirini goruyor...
kod yazarken (design time)formların biribirini görmesi ayrı bir şey.
run time sırasında fromların create edilmesi ayrı bir şey.
a.v. hatasını create edilmemiş (veya free edilmiş) bir bileşene erişmek istediğiniz zaman alırsınız.
kolay gelsin.
@aslangeri dll formlar normal açılıyor.Onlarda bir sorunum yok.Tek dll içindeki iki formun editleri
arasında bir bağlantı kuramadım. :alsana:
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen aslangeri »

s.a.
eğer sorun olmazsa dll in ve dll içindeki formların (hata olan yer/ler in) kodlarını gönderebilirmisiniz?
:D
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
supervisor
Üye
Mesajlar: 50
Kayıt: 07 Kas 2005 10:38
Konum: Turgutlu

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen supervisor »

aslangeri yazdı:s.a.
eğer sorun olmazsa dll in ve dll içindeki formların (hata olan yer/ler in) kodlarını gönderebilirmisiniz?
:D
a.s.
@aslangeri basit olarak yapmaya çalıştığım uygulama. Exe ve dll içinde. :cry:
:arrow: http://rapidshare.com/files/154523523/Proje.rar.html
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen akdatilla »

merhaba
biraz çalıştıktan sonra aşağıdaki şekilde sorunu çözdüm.
stsinyal prosedürüne bir parametre eklemem gerekti.
Ona dikkat et biraz.

TekDurum projesi dosyaları

Tekdurum.dpr dosyası:

Kod: Tümünü seç

library Tekdurum;

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

procedure stbaz;
var
form:tform1;
begin
form:=Tform1.create(nil);
form.showmodal;
end;
 procedure stsinyal(i:integer);
var
form:tform2;
begin
form:=Tform2.create(nil);
form.Tag:=i;
form.show;
end;
exports
stbaz,stsinyal;
{$R *.res}

begin
end.
unit1.pas:

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StBazE1: TEdit;
    StSinyal: TButton;
    procedure StSinyal2Click(Sender: TObject);
    procedure StSinyal3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses unit2;
procedure TForm1.StSinyal2Click(Sender: TObject);
var
  stsinyal: procedure(i:integer);
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary('Tekdurum.dll');
  try
  stsinyal:=GetProcAddress(DLLHandle, 'stsinyal');
    if Assigned(stsinyal) then
     stsinyal(integer(self))
    else
      MessageDlg('İşlem Gerçekleştirilemedi !!',
        mtInformation, [mbOk], 0);
  finally
    //FreeLibrary(DLLHandle);
  end;       // try..finally


end;

procedure TForm1.StSinyal3Click(Sender: TObject);
var
form:tform2;
begin
form:=Tform2.create(nil);
form.show;

end;

end.
unit2.pas:

Kod: Tümünü seç

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    StSinyalE1: TEdit;
    StSinyalB1: TButton;
    Label1: TLabel;
    procedure StSinyalB1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
uses unit1;
{$R *.dfm}

procedure TForm2.StSinyalB1Click(Sender: TObject);
Var
   f:TForm1;
begin
     f:=Ptr(Self.Tag);
     if f is TForm1 then
     StSinyalE1.Text := f.StBazE1.Text ;
end;

end.
exec projesi dosyaları

exec.dpr:

Kod: Tümünü seç

program Exec;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
unit1.pas:

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  stbaz: procedure;
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary('Tekdurum.dll');
  try
  stbaz:=GetProcAddress(DLLHandle, 'stbaz');
    if Assigned(stbaz) then
     stbaz
    else
      MessageDlg('The specified routine cannot be found.',
        mtInformation, [mbOk], 0);
  finally
    //FreeLibrary(DLLHandle);
  end;       // try..finally

end;

end.
Dosya ekleri
DllOrnek.rar
Dll kullanım örneği
(8.84 KiB) 155 kere indirildi
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen aslangeri »

s.a.
@akdatila, pusuya yatıp dosyaların gönderilmesinimi bekledin :D
hemen olaya müdahale etmişsin. :bravo:
@supervisor;
problem form1 i ve form2 yi create ettiğini sanman ancak sen form1 ve form2 yi değil o sınıftaki başka değişkenleri create ediyorsun.

Kod: Tümünü seç

procedure stbaz;
var
form:tform1;
begin
form:=Tform1.create(nil);
form.showmodal;
end;
 procedure stsinyal;
var
form:tform2;
begin
form:=Tform2.create(nil);
form.show;
end;
Burdaki kodlardada görüleceği üzere Form1 veya Form2 yi değil TForm1 ve TForm2 sınıfındaki iki farklı değişkeni create ediyorsun. ancak

Kod: Tümünü seç

StSinyalE1.Text := Form1.StBazE1.Text ;
satırında Form1 e erişmek istiyorsun.
dll projesindeki procedureleri şöyle değiştirdiğin zaman probleminin ortadan kalkması lazım.

Kod: Tümünü seç

procedure stbaz;
//var
//form:tform1;
begin
form1:=Tform1.create(nil);
form1.showmodal;
end;
 procedure stsinyal(i:integer);
//var
//form:tform2;
begin
form2:=Tform2.create(nil);
form2.Tag:=i;
form2.show;
end;
bu şekilde kullanmak belki başka problemlere neden olabilir(?) ama umarım ne demek istediğimi anlamışsındır.
ayrıca aşağıdaki link teki mesajlarda bu create konusunda bana olduğu gibi sanada yardımcı olabilir.
viewtopic.php?t=19387
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
supervisor
Üye
Mesajlar: 50
Kayıt: 07 Kas 2005 10:38
Konum: Turgutlu

Re: Dll Form Bağlantıları Hakkında

Mesaj gönderen supervisor »

@akdatila & @aslangeri yardımlarınız için teşekkürler.Parametre göndermedeki farkları inceledim.Tabi istediğim gibi çalışıyor ama ilerleyen zamanlarda bir sorunla karşı karşıya kalmamak için Form create makalenizi inceleyeceğim.Tekrar teşekkürler.
Cevapla