DLL içindeki değişkenleri baska forma aktarma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

Merhabalar
hazırladığım dll dosyasında formlara girilen bilgileri ana forma nasıl gönderip görüntüleyebilirim ?

LOGIN.DLL DEN kulanıcı adını şifresini yazıp onay aldıktan sonra kullanıcı bilgilerini ana forma almasını istiyorum
mesela isim tel adres vs


Örnek
form1 içindeki isim değişkenini form2 deki isim2 değişkenine aktarmak form2.isim2:=form1.isim bu rahatlıkla yapılabiliyor veya tam tersi
ama benim istediğim login.dll yi form1 den çağırıp kullanıcı adı ve şifresini girdikten sonra dll yi serbest bırakırken kullanıcının diğer bilgilerini
mesela adını datadan alıp form1.isim değişkenine aktarsın ?
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen Lord_Ares »

Değişkenlerinizi Global değişken olarak tanımlayıp, ilgili formlarıda uses ile tanıtırsanız. Tanıttığınız herhangi bir formdaki global değişkenlerin tümünü çağırabilirsiniz. Dll çağırdığınız aşamada ilgili formdaki global değişkene değerleri alın daha sonra Dll serbest bırakın. Fikrimi sorarsanız Dll kullanıp böyle bişey yapmanız gereksiz olmuş.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

dll üzerinden anaforma veri gönderemedim.
değeri alamadım bir örnek kod vermeniz mümkün mü aceba? dll den ana forma veri çekme?

DLL kullanıp böyle bir şey yapmanız gereksiz olmuş dediniz. tavsiyeniz ne ?

NOT:200 ze yakın form var ve 4 farklı programın ortak kullandıkları modulleri her bir bölüme eklemektense bir defa modulleri derleyip hazırlamak daha mantıklı geldi.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen Lord_Ares »

4 farklı programın ortak kullandıkları
Böyle bir konu varsa , evet dll kullanmanız iyi olmuş. Ben tek bir proje için demiştim.
Anladığım kadarıyla, login.dll dosyasındaki prosedür veya fonksiyonunuz şifrenin doğru olup olmadığını kontrol ediyor doğruysa size bir değer döndürüyor olması gerekir. Sizde bu değerleri diğer formlarda kullanmak istiyorsunuz.

Örnek login dll deki topla adında fonksiyonunuz.;

Kod: Tümünü seç

library login_dll;
uses
sysutils,classes;

Function Topla(x,y):integer; export;
begin
topla:=x+y;
end;

Exports
     topla


begin
end.
DLL deki topla fonksiyonunuz size bir bilgi döndürüyor. Bu bilgiyi formlarınızda kullanmak için ilgili formda
Function topla(x,y:integer):integer;far;external 'login_dll.dll';/// login dll kullanabilmek için tanımladınız..

Ana Formunuzdaki edit içeriside bu bilgiyi aşağıdaki gibi kullanabiliyorsunuz..
edit1.text:= InttoStr(topla(2,10));

Peki problem nerde anlayamadım ? Siz kullanıcı adı şifre bilgilerini veritabanından alıp gösterecekseniz ozamanda DLL dosyasınızdaki fonksiyonunuzu veya değer döndüren prosedürünüzü veritabanından bilgileri çekip göndericek şekilde yazarsanız istediğiniz olacaktır.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

problem şu biraz karışık.
örnek veriyorum
formlar1.dll 18 tane form var

xxxxxx.res dosyası mesela asagıdaki gibi

Kod: Tümünü seç

Library MENULER;
uses
  Forms,
  logi in 'logi.pas' {LOGINGIRISI},
  AYAR1 in '..\AYARLAR\AYAR1.pas' {AYARLAR};
  ........
{$R *.res}

procedure kuldenetle;export;
begin
LOGINGIRISI:=TLOGINGIRISI.Create(LOGINGIRISI);
LOGINGIRISI.ShowModal;
LOGINGIRISI.Close;
LOGINGIRISI.Free;
end;
....
....
EXPORTS KULDENETLE,.....  ....... , .........;
.......
begin
end.
derleyince menuler.dll yi oluşturduk. bu tamam
--------

ana programa gecip logın menüyü çalıştırdık

kodları

Kod: Tümünü seç

....
....
....

 procedure KULDENETLE;external 'DLLAPP\MENULER.dll';
 Function GETIR:integer;far;external 'DLLAPP\MENULER.dll'; (bu foksiyonda login girişi formunda)

 procedure TANAFORM.loginlerkontrol(Sender: TObject);
begin
KULDENETLE;
xxxx1.CAPTION:= InttoStr(GETIR);
end;
....
...
sorun burda işte, şimdi kuldenetle yi çalıştırıyoruz login menusunu açıyor, id ve parola onayı aldı ve logingirişini kapattı
benim sorunum, mantık hatası yapıyor olmam, aklım karıştı. login girişi yapılıyorken kullanıcı kimlikkodunu GETIR function Aktardım
olmadı bir yere yükleyip burdan ana forma aktarmam lazım
umarım anatabilmişimdir.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

Kısaca dll içine gömülü formlardan ana programa değer göndermek veya almak itiyorum bunu bir ini dosyası ilede yapmak mümkün ama benim istediğim
ini dosyası kullanmadan yapmak
varsa bir örnekte ekliyebilirseniz çok daha iyi olur
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen Lord_Ares »

Eğer yanlış anlamadıysam ,
Ana formunun en üstünde implementation üstünde var diye bir tanımlama vardır , oraya birtane tutulan bilgi:integer diye değişken tanımla.

Kod: Tümünü seç

procedure TANAFORM.loginlerkontrol(Sender: TObject);
begin
KULDENETLE;
TUTULAN_BILGI:= GETIR;
end;
Dersen getir fonksiyonundan dönen değer ana formdaki tutulan bilgiye aktarılır ve form kapatılana kadar bu bilgi orada sabit kalır. Böylece anaformda ne zaman istersen çağırır o bilgiye ulaşırsın.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen ertank »

MiskinComez yazdı:problem şu biraz karışık.
örnek veriyorum
formlar1.dll 18 tane form var

xxxxxx.res dosyası mesela asagıdaki gibi

Kod: Tümünü seç

Library MENULER;
uses
  Forms,
  logi in 'logi.pas' {LOGINGIRISI},
  AYAR1 in '..\AYARLAR\AYAR1.pas' {AYARLAR};
  ........
{$R *.res}

procedure kuldenetle;export;
begin
LOGINGIRISI:=TLOGINGIRISI.Create(LOGINGIRISI);
LOGINGIRISI.ShowModal;
LOGINGIRISI.Close;
LOGINGIRISI.Free;
end;
....
....
EXPORTS KULDENETLE,.....  ....... , .........;
.......
begin
end.
derleyince menuler.dll yi oluşturduk. bu tamam
--------

ana programa gecip logın menüyü çalıştırdık

kodları

Kod: Tümünü seç

....
....
....

 procedure KULDENETLE;external 'DLLAPP\MENULER.dll';
 Function GETIR:integer;far;external 'DLLAPP\MENULER.dll'; (bu foksiyonda login girişi formunda)

 procedure TANAFORM.loginlerkontrol(Sender: TObject);
begin
KULDENETLE;
xxxx1.CAPTION:= InttoStr(GETIR);
end;
....
...
sorun burda işte, şimdi kuldenetle yi çalıştırıyoruz login menusunu açıyor, id ve parola onayı aldı ve logingirişini kapattı
benim sorunum, mantık hatası yapıyor olmam, aklım karıştı. login girişi yapılıyorken kullanıcı kimlikkodunu GETIR function Aktardım
olmadı bir yere yükleyip burdan ana forma aktarmam lazım
umarım anatabilmişimdir.
Merhaba,

DLL içindeki prosedür tanımını değiştirerek istediğinizi elte etmeniz mümkün olabilir. Aşağıdaki örnek DLL Delphi ile hazırlanmış ve DLL Delphi uygulaması tarafından kullanılıyor varsayımı ile verilmiştir.

Kod: Tümünü seç

procedure KulDenetle(out Kullanici, Sifre: string; out LoggedIn: Boolean);export;
begin
  LOGINGIRISI:=TLOGINGIRISI.Create(LOGINGIRISI);
  LOGINGIRISI.ShowModal();
  Kullanici := LOGINGIRISI.EditKullanici.Text;
  Sifre := LOGINGIRISI.EditSifre.Text;
//  LOGINGIRISI.Close();  // ShowModal() kapandığı zaman zaten formun Close() olmuş olması gerekir. Dolayısıyla bu satıra gerek olmaması lazım.
  LOGINGIRISI.Free();
end;
Bunun dışında kullanıcının kullanıcı adı ve şifre girip login formunu kapattığını anlamak adına aşağıdaki gibi bir yöntem izlemenizde fayda olabilir:
TLoginGirisi formu içinde tamam butonuna basıldığı zaman ModalResult := True kodu kullanılır. İptal veya Kapat butonuna basıldığı zaman ModalResult := mrCancel kodu kullanılır.

Kod: Tümünü seç

procedure KulDenetle(out Kullanici, Sifre: string; out LoggedIn: Boolean); export;
begin
  LOGINGIRISI:=TLOGINGIRISI.Create(LOGINGIRISI);
  try  // Hafıza kaçağı olmaması için try..finally..end bloğu içine aldık
    if LOGINGIRISI.ShowModal() = mrOK then 
    begin
      Kullanici := LOGINGIRISI.EditKullanici.Text;
      Sifre := LOGINGIRISI.EditSifre.Text;
      LoggedIn := True;
    end
    else
    begin
      Kullanici := EmptyStr;
      Sifre := EmptyStr;
      LoggedIn := False;
    end;
  finally
    LOGINGIRISI.Free();
  end;
end;
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

beynim sulandı resmen vermiş olduğunuz iki seçeneği de yapmama rağmen olmadı.
dll yi calıştırınca reset çekiyor bilgisayar veya kitliyor.
sizden ricam karşılaştırmak için örnek bir tane hazırlayıp gönderebilirmisiniz nerede hata yaptığımı farketmem için
örnek adında dosya ek tedir

http://www.dosyaupload.com/4Gx0
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen ertank »

Gönderdiğiniz örnek içinde DLL projesi yok. Her ikisi de Win32 uygulaması. DLL projesini de paylaşabilir misiniz?
DLL projesi içinde LOGINGIRISI formu ve derlenebilmesi için gerekli diğer formlar da olmalı.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

aslında DLL projesi içinde sadece dll ye cevirmedim.
DLLFORMLAR Klasörünün altındaki DLLFORMLAR.RES dosyasını
açıp aşagıdaki kodlar yerine dll kodları yazıp derlemek mümkün

program testi için

Kod: Tümünü seç

program DLLFORMLAR;

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

{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
programda değişiklik yapıp sonucta calıştığını uygun görürseniz
dll ye cevirmek için program modunda bırakmıstım

dll modu için DLLFORMLAR Klasörünün altındaki DLLFORMLAR.RES dosyasının içine aşagıdaki kodları yazın

Kod: Tümünü seç

library DLLFORMLAR;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
procedure form1ac;export;
begin
form1:=Tform1.Create(form1);
form1.ShowModal;
form1.Free;
end;
procedure form2ac;export;
begin
form2:=Tform2.Create(form2);
form2.ShowModal;
form2.Free;
end;
EXPORTS form1ac,form2ac;

begin
end.
ana menuden yani cağırmaya calıştığım form1 ve form2 yi kodlarına ihtiyac varsa onlarıda ana form başlıgında vereyim
En son MiskinComez tarafından 30 Nis 2017 12:02 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

login girişi formuna ve diğer moduller ri ne yazıkkı atamıyorum koplike bir sistem olduğundan moduller karmaşık.
Benim sizden veya sizlerlerden ricam
dll formunun içindeki form1 içindeki edit1.text ana forma aktarsın veya ana formdan dll içindeki form1 deki herhangi bir edite atsın;
bu kadar.

karşılaştırma yapmak açısından
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

Destek verecek yok sanırım
MiskinComez
Üye
Mesajlar: 19
Kayıt: 29 Nis 2014 04:40

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen MiskinComez »

Böyle bir sorunla kimse karşılaşmamışmı.
Yapılamaz diyorsanızda en azından uğraşmam program modullerimi ona göre değiştiririm.

sorum : ana form dll dosyası içindeki formlara bilgi göndersin alsın :(
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: DLL içindeki değişkenleri baska forma aktarma

Mesaj gönderen ertank »

Merhaba,

Yapmak istediğiniz işlemin internette oldukça fazla örneği mevcut.

DLL içindeki farklı formlara bilgi göndermek ve almak için çok yüksek ihtimal ile DLL içinde de hafıza kullanımı gerçekleşecektir. En basit örnek Login formu içine girilen kullanıcı adı ve şifre bilgileri hafıza kullanan string türünde bilgilerdir. Bu bilgileri Ana uygulamaya gönderdiğiniz zaman DLL içinde hafıza kullanımı gerçekleşip, ana uygulama içinde bu hafıza boşaltılacaktır.

Böyle bir durumda hem DLL hemde Delphi uygulamasında ilk ünite olarak "ShareMem" (paylaşılan hafıza) kullanılmalıdır. Aksi halde en basit hata olarak hafıza kaçakları oluşur.

Basit olarak DLL içinde Login form olan ve farklı bir uygulamadan bu login form içindeki bilgileri okuyan ve kullanan örnek uygulama ve DLL proje kodlarını aşağıdaki bağlantıdan indirebilirsiniz.
dll_form_call.7z

NOT: Örnekler Delphi 10.2 Tokyo ile çalışır şekilde düzenlenmiştir. Ancak Delphi 7 ile büyük ölçüde uyumludur.
NOT2: DLL dosyası sadece Delphi uygulamasına özel hazırlanmıştır. .NET veya C/C++ ile kullanımı için özel ayarlar gerekmektedir.
Cevapla