ABC isimli str. değişk. ShowMessage(Fonks('ABC')) ile erişim

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
iqprog

ABC isimli str. değişk. ShowMessage(Fonks('ABC')) ile erişim

Mesaj gönderen iqprog »

Şimdi ABC isminde string tipinde bir değişkenim var. Ben onun değerini mesela ekrana yazdırmak istiyorum ama öyle bir fonksiyon olmalı ki değişkenin adını parametre olarak almalı ve değerini bana döndürmeli.

...........
var
ABC: string;
begin
ABC := 'deneme';
ShowMessage(Fonksiyon('ABC')); // dediğimde ekrana deneme yazacak
end;

bu fonksiyon ne ola ki?



Not : Sakın ola ShowMessage(ABC) yaz işini görür demeyin. Ben ihtiyacım olan fonksiyonu tarif etmek için böyle bir anlatıma girdim.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bunu hangi işlevi yerine getirmek için soruyorsun. Zira başka bir teknik önerme niyetindeyim.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
iqprog

Mesaj gönderen iqprog »

programımda bi kaç tane ayar değişkeni var. bir de ayarlar tablom var. bu ayar değişkenlerimi tek tek ayarlar tablosunda aramak yerine ayar tablosunda bir kere döneyim ve o gitsin ilgili değişkenleri set etsin.

bu arada çözümü buldum addr ve ptr fonksiyonları işimi gördü.

ama daha basit bir fikri olan varsa daha iyi olur tabi.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Benim önerim TAyarlar isminde bir sınıf oluşturman ve buna gerekli özellikleri tanımlaman gerekmektedir. Mesela bir Form sınıfında Left özelliğine bir değer atandığı zaman gerekli kodlar otomatik çalışarak ekranda o koordinata yerleşmektedir. Bunu yapan kodlar da bu sınıf içinde tanımlanmıştır.

Kod: Tümünü seç

type
TAyarlar=class
private
  ADeger:Integer;
  function OkuDeger:Integer;
  procedure YazDeger(const D:Integer);
published
  Deger:Integer read OkuDeger write YazDeger;
//değişik tanımalama biçimlerine örnek olması açısından örnek özellikler
  Deger2:Integer read OkuDeger write ADeger;
  Deger3:Integer read ADeger write YazDeger;
  Deger4:Integer read ADeger write ADeger;
//görüldüğü gibi bir özellik değişkene de okuma yazma yapabilmektedir.
end;
.
.
.
function TAyarlar.OkuDeger:Integer;
begin
  Result:=ADeger;
  ShowMessage('Değer okundu');
{i:=Ayar.Deger; gibi bir kodla Deger özelliği okunmaya çalışıldığında bu fonksiyon çalışır}
end;

procedure TAyarlar.YazDeger(const D:Integer);
begin
  ADeger:=D;
  ShowMessage('Değer yazıldı');
{Ayar.Deger:=5; gibi bir kodla Deger özelliğine atama yapıldığında bu prosedür çalışır.}
end;
Bu sınıfı örnek olarak kullanmaya çalışırsak:

Kod: Tümünü seç

var Ayarlar:TAyarlar; i:Integer;
begin
  Ayarlar:=TAyarlar.Create;
  try
    Ayarlar.Deger:=5;{<-Ayarlar.YazDeger(5); ile aynı anlama gelir ve ADeger değeri 5 olduktan sonra ekrana "Değer yazıldı" mesajı gelir}
    .
    .
    .
    i:=Ayarlar.Deger;{<-i:=Ayarlar.OkuDeger; ile aynı anlamdadır ve "Değer okundu" mesajından sonra ADeger içindeki değer okunup i değişkenine atanır}
  finally
    Ayarlar.Free;
  end;
end;
Bu basit bir örnek ama derin bir konu olduğu için konu üzerinde ancak çalışarak ve örnek yaparak daha kapsamlı bilgiler elde edebilirsin. Muhakkak forumda bu konulardan bahsedilmiştir ve bulduğum bir bağlantıyı da incelemen için veriyorum. Bu tür nesneye dayalı programlama ile çok güçlü, esnek ve kolay müdahele edilebilir programlar yazabilirsin ilgilenmeni şiddetle tavsiye ederim. Kolay gelsin.

viewtopic.php?t=663
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
iqprog

Mesaj gönderen iqprog »

dostum sağol ama ben tamamen başka bir şeyden bahsediyorum. nesne olayını öğrendiğimde yıl 1995di. Ben delphiyi 1 versiyonundan beri kullanıyorum. bu nesneyle alakalı bir şey değil.

aslında sorum çok basit biraz daha sadece yazayım dedim ama daha sadesi yok. ilk metnimi bir daha okursan iyi olur.

yine de emeğin için çok sağol.

zaten ben çözdüm olayı. eğer soruyu anladıysan cevabı için de addr ve ptr komutlarına bak.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

SetPropValue, GetPropValue ile sorunun çözülebiliyor ama. Hem çözümü buradan paylaşıcağını umuyorum :wink: . İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
iqprog

Mesaj gönderen iqprog »

setpropvalue ve getpropvalue bir nesnesinin özelliğinin değerini yazmak ve okumak içindir. Biz ise bir değişkenin değerini okuyup yazacağız.

Tabi paylaşırım çözümü. Örnek aşağıda. Yalnız benim istediğim şeyi yapmak için örneğin gelişmiş hali lazım. Onu yazmadım çünkü anlatması zor. Ama mantık şu değerini işleyeceğim değişkenlerin isimlerini ve bu değişkenlerin adreslerini bir diziye atıyorum. Sonra örneğin 'a' isimli değişkenin değerine erişmek için ilgili diziden 'a' değişkenin adresine bakıyorum ve aşağıdaki ptr komutu ile 'a' değişkeninin değerini işleyebiliyorum.

Örnek;
var
a : string;
adres : longint;
begin
a := 'deneme';
adres := LongInt(Addr(a));
ShowMessage(String(Ptr(adres)^));
end;

tabi burada iki dizi kullanmam gerekli ve istediğim değişkenlerin isimlerini ve adreslerini önceden bu dizilere atmam gerekli. daha kolayını bilen varsa sevinirim.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Zaten tekniği tamamen değiştirip nesne kullanıma geçilmesini önererek bunları (Set-Get-PropValue) verdim. Tam olarak ne yapmaya çalıştığınızı çözemedim ama benim anladığım belirli değişkenler var ve bunları veritabanına kayıt edip okuman gerekmekte olduğudur. Mesela şöyle bir tablo yapımız olsun,

Kod: Tümünü seç

Ozellik
---------
OzellikAdi String
Ozellik String
Bu iki alana sahip tablo ile bazı kayıtlar girelim

Kod: Tümünü seç

OzellikAdi Ozellik
----------- ---------
Deger      5
Renk       0
Baslik     Deneme
Yukseklik  120
gibi liste uzayabilir. Yukarıda örnek yazdığım sınıfı gerekli özelliklerle donatırsak.

Kod: Tümünü seç

type
TAyarlar=class
private
  .
  .
  .
published
  .
  .
  .
  Deger:Integer read OkuDeger write YazDeger;
  Renk:Integer read ARenk write YazRenk;
  Baslik:String read ABaslik write YazBaslik;
  .
  .
  .
end; . . .
şimdi ise direk veritabanından gerekli özellikleri okuyan bir fonksiyon yazalım.

Kod: Tümünü seç

uses TypInfo;
.
.
procedure AyarOku;
begin
  tblOzellik.First;
  while not tblOzellik.Eof do try
      SetPropValue(Ayarlar,tblOzellikOzellikAdi.AsString,tblOzellikOzellik.Value);
    except
      on E:Exception do begin
        ShowMessage(Format('%s değeri %s olarak uygulanmak isteniyor ama çıkan hata ->%s ', [tblOzellikOzellikAdi.AsString,tblOzellikOzellik.AsTring,E.Message]));
      end;
    end;
    tblOzellik.Next;
  end;
end;
.
.
.
initialization
  Ayarlar:=TAyarlar.Create;
finalization
  Ayarlar.Free;
end.
gibi bir kodla veritabanındaki özellik bilgileri direk bizim ayar nesnemize okunarak gerekli kodların çalıştırılmasını sağlar. Sorulan sorudan anladığıma göre böyle bir cevap yazdım. Soruyu yanlış anlamış olabilirim belki ama bu fakiri hor görme lütfen. :wink:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
iqprog

Mesaj gönderen iqprog »

tmm dostum senin dediğin gibi de oluyor. yeni bir type değil de forma ekleyerek denedim. her değişken için read ve write procedureler yazmak biraz dert ama bu method da iş görebilir.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

O zaman çok uğraşmaman için başka bir teknik geldi aklıma. Tabi tüm değerlerini tek bir string içinde tutabiliyorsan bu teknik işe yarayabilir. String olmayan değerlerde ise string dönüşüm fonksiyonlarıyla iş görebilirsin artık.

Kod: Tümünü seç

type
TAyarlar=class
private
  AOzellik:TStrings;
  function OkuOzellik (const OzellikAdi: string): string;
  procedure YazOzellik(const OzellikAdi, Deger: string);
public
  constructor Create;
  destructor Destroy; override;
  Ozellik[const OzellikAdi:String]:String read OkuOzellik write YazOzellik;
//bu özellik published olamaz.
published
  OzellikListesi:TStrings read AOzellik;//listeye direk erişim için
end; 

constructor TAyarlar.Create;
begin
  AOzellik:=TStringList.Create;
end;

destructor TAyarlar.Destroy; 
begin
  AOzellik.Free;
  inherited Destroy;
end;

function TAyarlar.OkuOzellik (const OzellikAdi: string): string;
begin
  Result:=AOzellik.Values[OzellikAdi];
end;

procedure TAyarlar.YazOzellik(const OzellikAdi, Deger: string);
begin
  AOzellik.Values[OzellikAdi]:=Deger;
  if SameText(OzellikAdi,'Renk') then Form.Color:=StrToInt(Deger)
  else if SameText(OzellikAdi,'Başlık') then Form.Caption:=Deger
  else //vs. vs.
  else ShowMessage(Format('%s özelliği tanımlanmamış.',[OzellikAdi]));
end;
buradan örnek bir kayıtlardan özellik okuma ve yazma kodunu çıkaracak olursak

Kod: Tümünü seç

procedure AyarOku;
begin
  tblOzellik.First;
  Ayarlar.OzellikListesi.Clear;
  while not tblOzellik.Eof do begin
    Ayarlar.Ozellik[tblOzellikOzellikAdi.AsString]:=tblOzellikOzellik.AsString;
    tblOzellik.Next;
  end;
end;

initialization
  Ayarlar:=TAyarlar.Create;
finalization
  Ayarlar.Free;
end.
gibi bir kodla da herhalde istediklerin gerçekleşir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla