ABC isimli str. değişk. ShowMessage(Fonks('ABC')) ile erişim
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
ABC isimli str. değişk. ShowMessage(Fonks('ABC')) ile erişim
Ş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.
...........
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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.
bu arada çözümü buldum addr ve ptr fonksiyonları işimi gördü.
ama daha basit bir fikri olan varsa daha iyi olur tabi.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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.
Bu sınıfı örnek olarak kullanmaya çalışırsak: 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
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;
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;
viewtopic.php?t=663
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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.
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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.
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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,
Bu iki alana sahip tablo ile bazı kayıtlar girelimgibi liste uzayabilir. Yukarıda örnek yazdığım sınıfı gerekli özelliklerle donatırsak. şimdi ise direk veritabanından gerekli özellikleri okuyan bir fonksiyon yazalım.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. 
Kod: Tümünü seç
Ozellik
---------
OzellikAdi String
Ozellik String
Kod: Tümünü seç
OzellikAdi Ozellik
----------- ---------
Deger 5
Renk 0
Baslik Deneme
Yukseklik 120
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; . . .
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.

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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. buradan örnek bir kayıtlardan özellik okuma ve yazma kodunu çıkaracak olursak gibi bir kodla da herhalde istediklerin gerçekleşir.
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;
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.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .