dinamik const kullanımı hakkında yardım
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- adelphiforumz
- Üye
- Mesajlar: 602
- Kayıt: 01 Nis 2008 05:38
- Konum: İstanbul
dinamik const kullanımı hakkında yardım
S.A.
Dinamik olarak Const tanımlaması kullanabilirmiyim
örneğin bir unit içerisinde
tüm const tanımlamamalrımı yapıp bu yapılan tanımlamalara dinamik olarak erişmek istiyorum
mesala
Const
f1 = 'Test 1'
f2 = 'Test 2'
f3 = 'Test 3'
...
procedure pr_Const(prm:?????)
begin
Showmessage(prm)
//
end;
procedure (.....)
begin
pr_Const(f1); // dediğimde procedure f1 ile ilgili mesajı karşıma getirsin şeklinde
end;
gibi birşeyler yapabilirmiyim
Dinamik olarak Const tanımlaması kullanabilirmiyim
örneğin bir unit içerisinde
tüm const tanımlamamalrımı yapıp bu yapılan tanımlamalara dinamik olarak erişmek istiyorum
mesala
Const
f1 = 'Test 1'
f2 = 'Test 2'
f3 = 'Test 3'
...
procedure pr_Const(prm:?????)
begin
Showmessage(prm)
//
end;
procedure (.....)
begin
pr_Const(f1); // dediğimde procedure f1 ile ilgili mesajı karşıma getirsin şeklinde
end;
gibi birşeyler yapabilirmiyim
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Re: dinamik const kullanımı hakkında yardım
Sanırım bunun birden fazla yolu var.
İlk aklıma gelen RTTI(Run-time type information) kullanmak.
Yada şöyle birşey işinizi görmez mi?
İlk aklıma gelen RTTI(Run-time type information) kullanmak.
Yada şöyle birşey işinizi görmez mi?
Kod: Tümünü seç
procedure pr_Const(prm: Variant);
begin
Showmessage(VarToStr(prm));
end;
There's no place like 127.0.0.1
- adelphiforumz
- Üye
- Mesajlar: 602
- Kayıt: 01 Nis 2008 05:38
- Konum: İstanbul
Re: dinamik const kullanımı hakkında yardım
SimaWB pr_Const çağırırken göndermem gereken string değer
asıl problem burda çıkıyor. aşağıda yapmak istediğimi örneklemeye çalıştım
pr_const gelen prmDil e göre hangi unitteki mesajı alacağını gelen string ifadeden anlamalı
bunun başka yöntemleri resource ile yapılabiliyormulş araştırdığım kadarı ile fakat böue birşey yapabilirsem
bemin kullanışım için daha uygun olacak
teşekkürler
asıl problem burda çıkıyor. aşağıda yapmak istediğimi örneklemeye çalıştım
pr_const gelen prmDil e göre hangi unitteki mesajı alacağını gelen string ifadeden anlamalı
bunun başka yöntemleri resource ile yapılabiliyormulş araştırdığım kadarı ile fakat böue birşey yapabilirsem
bemin kullanışım için daha uygun olacak
teşekkürler
Kod: Tümünü seç
unit Unit_TR;
interface
Const
M1 = 'Mesaj 1';
M2 = 'Mesaj 2';
implementation
end.
Kod: Tümünü seç
unit Unit_ENG;
interface
Const
M1 = 'Message Line 1';
M2 = 'Message Line 2';
implementation
end.
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
uses
Unit_TR, Unit_ENG;
{$R *.dfm}
procedure pr_Const(PrmDil:String; prm : Variant);
begin
if PrmDil = 'TR' then
Showmessage(Unit_TR.Prm); //prm için nasıl birşey yapmam gerekiyor asıl sorun burda zatem
if PrmDil = 'ENG' then
Showmessage(Unit_ENG.Prm);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
pr_Const('TR', 'M1');
end;
end.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Re: dinamik const kullanımı hakkında yardım
ini dosyası kullanabilirsiniz, dosyalarda aynı bölüm ve anahtar isimleri olur, dosya isimleri farklı olur, dil seçimine göre ilgili ini dosyasından okuma yaparsınız
kodları derleyip denemedim, kontrol edersiniz.
kullanımı,
Kod: Tümünü seç
//lang_tr.ini
[MESAJLAR]
M1="Mesaj 1"
M2="Mesaj 2"
Kod: Tümünü seç
//lang_en.ini
[MESAJLAR]
M1="Message Line 1"
M2="Message Line 2"
Kod: Tümünü seç
//cokludil.pas
unit cokludil;
system, windows, ...., IniFiles;
interface
procedure DilDosyasiAc(dil:string);
procedure DilDosyasiKapat;
function DegeriOku(bolum,anahtar:string):string;
var
dilDosyasi:TIniFile;
implementation
procedure DilDosyasiAc(dil:string);
var
path:string;
begin
path:=extractfilepath(application.exename)+'/lang/lang_';
if fileexists(path+dil+'.ini') then
begin
dilDosyasi:=TIniFile.create(path+dil+'.ini');
end;
end;
procedure DilDosyasiKapat;
begin
if assigned(dilDosyasi) then
dildosyasi.free;
end;
function DegeriOku(bolum,anahtar:string):string;
begin
result:='';
if assigned(dilDosyasi) then
result:=dilDosyasi.readString(bolum,anahtar,'');
end;
end.
kullanımı,
Kod: Tümünü seç
uses cokludil;
...
DilDosyasiAc('en');
showMessage(DegeriOku('MESAJLAR','M1');
DilDosyasiKapat;
DilDosyasiAc('tr');
showMessage(DegeriOku('MESAJLAR','M1');
DilDosyasiKapat;
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...
Re: dinamik const kullanımı hakkında yardım
PrmDil neden string? byte yap yada "set" yap TDilSeti = (dil_TR, dil_ENG.....); gibi
sadece resource bakarsan sana karmaşık gelir, ResourceString olarak araştır, stringleri exe içinde tutmaya yarar, constant yapmaktan kullanım açısından çokta büyük fark yok. bunun yerine unicorn64 ün dediği gibi ini kullan, her formcreat'e TDilSeti içinden seçilmiş dil e göre if yerine case kullanarak iniden okut ve değişkenlere al.
Her form içinde sadece kendisi içinde kullanılacak değişkenler, (const değil, pi sayısı gibi sabit kullanacaksan ve içindeki değeri en az bir dahi değiştireceksen var kullan) tanımla ve bunlar formun default değerleri "aç", "kapa" vs gibi olsun, ini den okunamazsa ekrana boş yazmasın default değer yazsın. default değer kullanımını şöyle yapabilirsin
var str_Ok : string[15] = 'Tamam';// boyutu 15 olan string değer tanımlar ve içine 'Tamam' ı ekler
kolay gele
sadece resource bakarsan sana karmaşık gelir, ResourceString olarak araştır, stringleri exe içinde tutmaya yarar, constant yapmaktan kullanım açısından çokta büyük fark yok. bunun yerine unicorn64 ün dediği gibi ini kullan, her formcreat'e TDilSeti içinden seçilmiş dil e göre if yerine case kullanarak iniden okut ve değişkenlere al.
Her form içinde sadece kendisi içinde kullanılacak değişkenler, (const değil, pi sayısı gibi sabit kullanacaksan ve içindeki değeri en az bir dahi değiştireceksen var kullan) tanımla ve bunlar formun default değerleri "aç", "kapa" vs gibi olsun, ini den okunamazsa ekrana boş yazmasın default değer yazsın. default değer kullanımını şöyle yapabilirsin
var str_Ok : string[15] = 'Tamam';// boyutu 15 olan string değer tanımlar ve içine 'Tamam' ı ekler
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
- adelphiforumz
- Üye
- Mesajlar: 602
- Kayıt: 01 Nis 2008 05:38
- Konum: İstanbul
Re: dinamik const kullanımı hakkında yardım
S.A.
öncelikle fikirleriniz ve yardımlarınız için teşekkür ederim.
Fakat sanırım ben yapmak istediğimi eksik ifade ettim.
1. kullanacağım dosyaların exe ile birlikte ayrıca yüklenmesini istemiyorum (dll. ini vs.)
2. Elimde yaklaşık 400'ün üzerinde unit ve form mevcut her unit içerisine bunları tektek dil uniti olarak her seferinde eklemek istemiyorum
3. Her unitin içerisinde deklerasyonu olan bir DataModul zaten var amacım bu DataModule içerisinde bir procedure oluşturup
bu procedure her unit içerisinden ulaşıp parametresinede string bir deger göndermek ve
bu procedure içerisinde o an aktif olan dil hangisi ise 1 satır if diyerek ilgili tüm dil dosyalarını tek bir noktadan kontrol etmek.
yani 2. yazdığım mesajda örneklemeye çalıştığım gibi
herkese iyi çalışmalar
öncelikle fikirleriniz ve yardımlarınız için teşekkür ederim.
Fakat sanırım ben yapmak istediğimi eksik ifade ettim.
1. kullanacağım dosyaların exe ile birlikte ayrıca yüklenmesini istemiyorum (dll. ini vs.)
2. Elimde yaklaşık 400'ün üzerinde unit ve form mevcut her unit içerisine bunları tektek dil uniti olarak her seferinde eklemek istemiyorum
3. Her unitin içerisinde deklerasyonu olan bir DataModul zaten var amacım bu DataModule içerisinde bir procedure oluşturup
bu procedure her unit içerisinden ulaşıp parametresinede string bir deger göndermek ve
bu procedure içerisinde o an aktif olan dil hangisi ise 1 satır if diyerek ilgili tüm dil dosyalarını tek bir noktadan kontrol etmek.
yani 2. yazdığım mesajda örneklemeye çalıştığım gibi
herkese iyi çalışmalar
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Re: dinamik const kullanımı hakkında yardım
ini dosyalarına dışardan müdahale edilebilir diyorsan zaten başka kapı kalmıyor. "if" yapmak basit gibi görünebilir ama bir süre sonra iş çığrından da çıkabilir.
en uygun öneri resourcestring olsa gerek....
en uygun öneri resourcestring olsa gerek....
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Re: dinamik const kullanımı hakkında yardım
Yani illede böyle kullanmak istiyorsan pchar(pointer char) tanımlama ile kullanabilirsin.
Kod: Tümünü seç
Const
f1 = 'Test 1'
f2 = 'Test 2'
f3 = 'Test 3'
procedure pr_Const(prm: pchar)
begin
Showmessage(prm);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//böyle çağırabilirsin pr_Const(pchar(f1)); veya aşşağıdaki gibi
pr_Const(f1);
end;
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...
http://www.tcct.us
Re: dinamik const kullanımı hakkında yardım
Kod: Tümünü seç
procedure ChangeConst(const Constant; var Value; Size: Integer);
begin
Move((@Value)^, (@Constant)^, Size);
end;
// How to use ChangeConst: (Sample)
const
TestStrConst: string = 'This is a text sample';
TestInteger: Integer = 4367;
var
NewString: string;
NewInteger: Integer;
begin
// String Demo:
ShowMessage('Before ChangeStringConst (TestStrConst): ' + TestStrConst);
NewString := 'New Value';
ChangeConst(TestStrConst, NewString, SizeOf(string));
ShowMessage('After ChangeStringConst (TestStrConst): ' + TestStrConst);
// Integer Demo:
ShowMessage('Before ChangeStringConst (TestInteger): ' + IntToStr(TestInteger));
NewInteger := 93534;
ChangeConst(TestInteger, NewInteger, SizeOf(Integer));
ShowMessage('After ChangeStringConst (TestInteger): ' + IntToStr(TestInteger));
end;
Re: dinamik const kullanımı hakkında yardım
constant değerini değiştirmek için Move kullanmak kesinlikle yapılmamalıdır.
Böyle deyince, doğal olarak "sen kimsin ki" sorusu ortaya çıkıyor. Yapılmaması gerektiğini ben söylemiyorum (Aslında Torry de desteklemez böyle şeyleri, nasıl olmuş da sitesine koymuş hayret).
(Zamanında c programcıları böyle şeylerde uzmanlaşmış, ancak bu yöntemler taşıdığı olumsuzluklar yüzünden terkedilmiş durumda).
--
Sorunuz için üç önerim:
* resourcestring kullanmak ve ayrı dll lere paketlemek (biliyorum, istemediğinizi belirtmişsiniz ama en yaygın ve verimli yöntem budur. Bu sayede programınızı değiştirmeden yeni dil ekleyebilir veya var olanı güncelleyebilirsiniz)
* Ayrı resource dosyaları (.rc) ve şartlı derleme kullanmak ($IFDEF DIL_TRK $RES '..\diller\trk.res' gibi)
* Delphi 'de zaten var olan çoklu dil desteğini kullanmak (ki bu durumda Delphi ikinci maddeyi otomatik ve kolay yapmanızı sağlıyor. Aslında aynı kapıya çıkar)
Böyle deyince, doğal olarak "sen kimsin ki" sorusu ortaya çıkıyor. Yapılmaması gerektiğini ben söylemiyorum (Aslında Torry de desteklemez böyle şeyleri, nasıl olmuş da sitesine koymuş hayret).
(Zamanında c programcıları böyle şeylerde uzmanlaşmış, ancak bu yöntemler taşıdığı olumsuzluklar yüzünden terkedilmiş durumda).
--
Sorunuz için üç önerim:
* resourcestring kullanmak ve ayrı dll lere paketlemek (biliyorum, istemediğinizi belirtmişsiniz ama en yaygın ve verimli yöntem budur. Bu sayede programınızı değiştirmeden yeni dil ekleyebilir veya var olanı güncelleyebilirsiniz)
* Ayrı resource dosyaları (.rc) ve şartlı derleme kullanmak ($IFDEF DIL_TRK $RES '..\diller\trk.res' gibi)
* Delphi 'de zaten var olan çoklu dil desteğini kullanmak (ki bu durumda Delphi ikinci maddeyi otomatik ve kolay yapmanızı sağlıyor. Aslında aynı kapıya çıkar)
Ömür Ölmez
Re: dinamik const kullanımı hakkında yardım
Merhaba.
- Konu için biraz zaman geçmiş ama sonuçsuz gibi gördüm ve de ilgimi çekti.
- Şimdi soruyu maddeleyelim.
1. UNIT'lerin her biri diğerinden bağımsız olacak
2. Aynı Const ifadelerini paylaşması gerekiyor. Çünkü aynı ortak ad ile çağrılmak isteniyor. Amaç sıra kaymasın ve/veya terminoloji birliği.
- Bu durumda (arkadaşlarımın çözümlerini tercih ederdim ancak sizin talebiniz de değerli)
- Sizin yapıya da sadık kalarak önerim ARRAY kullanmak bana rasyonel bir çözüm gibi geldi.
Örnek :
Kullanım Şekli aşağıdaki şekildedir.
TR Unit
EN Unit
Rafa kaldırılmış bir sorunsal ise umarım çözüm olur. Başarılar.
- Konu için biraz zaman geçmiş ama sonuçsuz gibi gördüm ve de ilgimi çekti.
- Şimdi soruyu maddeleyelim.
1. UNIT'lerin her biri diğerinden bağımsız olacak
2. Aynı Const ifadelerini paylaşması gerekiyor. Çünkü aynı ortak ad ile çağrılmak isteniyor. Amaç sıra kaymasın ve/veya terminoloji birliği.
- Bu durumda (arkadaşlarımın çözümlerini tercih ederdim ancak sizin talebiniz de değerli)
- Sizin yapıya da sadık kalarak önerim ARRAY kullanmak bana rasyonel bir çözüm gibi geldi.
Örnek :
Kullanım Şekli aşağıdaki şekildedir.
Kod: Tümünü seç
uses Unit_TR, Unit_EN;
{$R *.dfm}
procedure pr_Const(PrmDil:String; idx: Integer);
begin
if PrmDil = 'TR' then
Showmessage( M_TR[idx] ); //prm için nasıl birşey yapmam gerekiyor asıl sorun burda zatem
if PrmDil = 'EN' then
Showmessage( M_EN[idx] );
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
pr_Const('EN', 1);
end;
Kod: Tümünü seç
unit Unit_TR;
interface
Const
M_TR : Array [0..2] of String =
( ''
, 'Mesaj 1'
, 'Mesaj 2'
);
implementation
end.
Kod: Tümünü seç
unit Unit_EN;
interface
Const
M_EN : Array [0..2] of String =
( ''
, 'Message Line 1'
, 'Message Line 2'
);
implementation
end.