dinamik const kullanımı hakkında yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

dinamik const kullanımı hakkında yardım

Mesaj gönderen adelphiforumz »

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
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
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen SimaWB »

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?

Kod: Tümünü seç

procedure pr_Const(prm: Variant);
begin
  Showmessage(VarToStr(prm));
end;
There's no place like 127.0.0.1
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen adelphiforumz »

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

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
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen unicorn64 »

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

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.
kodları derleyip denemedim, kontrol edersiniz.
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...

Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen freeman35 »

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
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 !!!
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen adelphiforumz »

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
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
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen ikutluay »

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....
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
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen quadr »

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
mahsuni
Üye
Mesajlar: 99
Kayıt: 21 Haz 2003 01:09
Konum: Ankara-Mamak

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen mahsuni »

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;
torry.net alınmıştır
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen omurolmez »

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)
Ömür Ölmez
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: dinamik const kullanımı hakkında yardım

Mesaj gönderen mrmarman »

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.

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;
TR Unit

Kod: Tümünü seç

unit Unit_TR;
interface
Const
  M_TR : Array [0..2] of String =
  (   ''
    , 'Mesaj 1'
    , 'Mesaj 2'
  );

implementation
end.
EN Unit

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.
Rafa kaldırılmış bir sorunsal ise umarım çözüm olur. Başarılar. :bravo:
Resim
Resim ....Resim
Cevapla