Kullanıcı yetki ayarları için function yazma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
eyalin
Üye
Mesajlar: 126
Kayıt: 09 May 2005 08:08

Kullanıcı yetki ayarları için function yazma

Mesaj gönderen eyalin »

Arkadaşlar merhaba.herkese kolay gelsin.Şöyle bir sıkıntım var ve çözemiyorum.login formumda bir query çalışıyor user ve pass ı kontrol ediyor ve aynı zamanda user tablomda yetkitipi diye bi alan var oraya bakıyor.yapmak istediğim user ve pass doğru ise(user ve pass kontrolu vs. çalışıyor.)bu query den dönen yetkitipi değerini yazmaya çalıştığım function da kullanmak fakat ordinal type required diye bi uyarı alıyorum.
function şu;

Kod: Tümünü seç

function secureuser(tip:string):boolean;  //normal kullanıcı
begin
tip:= dm1.ADOQuery1.Fields.Fields[5].Value;
case tip OF
USER:
  BEGIN
  frmmusteriliste.gridmusteri.Items.Items[1].Visible:=false;
  frmmusteriliste.gridmusteri.Items.Items[2].Visible:=false;
  END;
END;
yani eğer yetki tipi user ise şu alanları kapat,yetkitipi admin ise şu alanları kapat diye çalışacak hayırlısı ile.Yardım edenlere ve etmeyenlere şimdiden teşekkürler.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

Kod: Tümünü seç

function secureuser(tip:string):boolean;  //normal kullanıcı 
begin 
tip:= dm1.ADOQuery1.Fields.Fields[5].Value; 
case tip OF 
USER: 
  BEGIN 
  frmmusteriliste.gridmusteri.Items.Items[1].Visible:=false; 
  frmmusteriliste.gridmusteri.Items.Items[2].Visible:=false; 
  END; 
END;
bu kodda tip değeri bir string değer gibi görünüyor, o nedenle kodu aşağıdaki gibi düzenleyin.

Kod: Tümünü seç

function secureuser(tip:string):boolean;  //normal kullanıcı 
begin 
tip:= dm1.ADOQuery1.Fields.Fields[5].Value; 
case tip OF 
'USER': 
  BEGIN 
  frmmusteriliste.gridmusteri.Items.Items[1].Visible:=false; 
  frmmusteriliste.gridmusteri.Items.Items[2].Visible:=false; 
  END; 
END;
case komutundan sonra USER ifadesi string olduğu için tırnaklar içine aldım sadece :)
kolay gelsin.
eyalin
Üye
Mesajlar: 126
Kayıt: 09 May 2005 08:08

Mesaj gönderen eyalin »

Sevgili nitro arkadaşım cvp için teşekkürler ama öylede denemiştim.

Kod: Tümünü seç

case tip of
satırında ordinal type required demeye devam ediyor. hatta 'user' i "user" şeklinde bile denedim :D .Maalesef çözemedim hala durum aynı
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Case karşılaştırmasını sadece ordinal değerler (byte, short, int, dword vs) için kullanabilirsiniz. Aldığınız hata tip değişkeninin string olmasından kaynaklı.

Size tavsiyem hem veri tabanınızı, hem de kodunuzu biraz değiştirmeniz. Örneğin:

type TUserType = (utAdmin, utUser, utGuest);

Bunların değeri sırayla 0, 1 ve 2'dir. Veri tabanına bu şekilde kullanıcı tipini kaydedecek olursanız hem case'de sorun yaşamazsınız, hem de ileride yeni kullanıcı tipi ekleyeceğiniz zaman daha rahat edersiniz. Case'de kullanımı ise şöyle olacak:

Kod: Tümünü seç

TUserType Tip;
//Fields[5] artık integer olacak, buna dikkat edin
Tip := TUserType(dm1.ADOQuery1.Fields.Fields[5].Value);
case Tip of
  utAdmin:
  begin
    //Admin için verilecek haklar
  end;
  utUser:
  begin
  //User için verilecek haklar
  end;
  ...
end;
Veri tabanına ayrıca bir tablo daha açıp bunların string karşılığını da yazabilirsiniz. Yani basit bir tablo düşünün:

Kod: Tümünü seç

UserType         Description
0                     Yönetici
1                     Normal Kullanıcı
2                     Misafir Kullanıcı
Son bir not daha: Tavsiyem mümkün olduğu kadar string karşılaştırması yapmamanızdır. Mümkün olduğu kadar integer üzerinden karşılaştırma yapın. Bu programın daha hızlı çalışmasını sağlar.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

yavaşlık göze alınıp, case yerine if kullanılabilir. böylece direk string ibare kullanılmış olur.
eyalin
Üye
Mesajlar: 126
Kayıt: 09 May 2005 08:08

Mesaj gönderen eyalin »

Opt2000 yazdı:Selam,

Case karşılaştırmasını sadece ordinal değerler (byte, short, int, dword vs) için kullanabilirsiniz. Aldığınız hata tip değişkeninin string olmasından kaynaklı.

Size tavsiyem hem veri tabanınızı, hem de kodunuzu biraz değiştirmeniz. Örneğin:

type TUserType = (utAdmin, utUser, utGuest);

Bunların değeri sırayla 0, 1 ve 2'dir. Veri tabanına bu şekilde kullanıcı tipini kaydedecek olursanız hem case'de sorun yaşamazsınız, hem de ileride yeni kullanıcı tipi ekleyeceğiniz zaman daha rahat edersiniz. Case'de kullanımı ise şöyle olacak:

Kod: Tümünü seç

TUserType Tip;
//Fields[5] artık integer olacak, buna dikkat edin
Tip := TUserType(dm1.ADOQuery1.Fields.Fields[5].Value);
case Tip of
  utAdmin:
  begin
    //Admin için verilecek haklar
  end;
  utUser:
  begin
  //User için verilecek haklar
  end;
  ...
end;
Veri tabanına ayrıca bir tablo daha açıp bunların string karşılığını da yazabilirsiniz. Yani basit bir tablo düşünün:

Kod: Tümünü seç

UserType         Description
0                     Yönetici
1                     Normal Kullanıcı
2                     Misafir Kullanıcı
Son bir not daha: Tavsiyem mümkün olduğu kadar string karşılaştırması yapmamanızdır. Mümkün olduğu kadar integer üzerinden karşılaştırma yapın. Bu programın daha hızlı çalışmasını sağlar.

Kolay gelsin,
Bahadır Alkaç
Bahadır arkadaşım çok sağol ellerin dert görmesin.Ne yapalım bu forumdan çok şey öğreniyoruz ve insanların başını ağrıtıyoruz ama ne yapalım :D.Bu arada nitro sana da çok teşekkürler
eyalin
Üye
Mesajlar: 126
Kayıt: 09 May 2005 08:08

Mesaj gönderen eyalin »

Çıldırmak üzereyim.

Kod: Tümünü seç

type usertype=(utsadmin,utadmin,utuser);
function secureuser(tip:integer):usertype;
begin
Tip := UserType(dm1.ADOQuery1.Fields.Fields[5].Value);
case tip OF
utadmin:
  BEGIN
  frmmusteriliste.gridmusteri.Items.Items[1].Visible:=false;
  frmmusteriliste.gridmusteri.Items.Items[2].Visible:=false;
  END;
END;
şeklinde deniyorum bu kodu.

Kod: Tümünü seç

Tip := UserType(dm1.ADOQuery1.Fields.Fields[5].Value);
satırında incompetible types 'integer' and 'usertype' hatası meydana geliyor.Yardımcı olabilecek arkadaşlar varsa çok sevinirim.
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Kod: Tümünü seç

type usertype=(utsadmin,utadmin,utuser); 
Bu tanımlamayı unitin en üstünde (uses satırından sonra) yapman yeterli olur. Böylece bu form ve bu formu kullanan bütün unitlerde bu veri tipine ulaşabilirsin.

Kodundaki problem yaptığımız işlemin tam olarak ne olduğunu anlamamandan kaynaklanıyor.

Yukarıdaki tanımlama ile biz aslında yeni bir veri tipi tanımladık. Yani programlarında kullandığın integer ile usertype arasında bir fark yok. Bu yüzden de şöyle bir satır elbette hata verecektir:

Kod: Tümünü seç

var
  tip:integer;
begin
  tip = usertype(...);
end;
Burada dikkat edersen usertype tipinde bir değişkeni, integer tipinde bir değişkene atamaya çalışıyorsun. Bu da compiler tarafından hata olarak algılanıyor (Gerçi tip olarak uyumlular, ama compiler "bu madem usertype sen niye integer'a atıyorsun, diye haklı olarak seni uyarıyor).

Kodu şu şekilde değiştirirsen sorun kalmayacaktır.

Kod: Tümünü seç

function secureuser(tip:usertype):usertype;
begin
//dm1.ADOQuery1.Fields.Fields[5] integer olmalı ve usertype'ın desteklediği aralıklarda olmalı (Bu örnekte 0, 1, 2)!!!
Tip := UserType(dm1.ADOQuery1.Fields.Fields[5].Value);
case tip OF
  utadmin:
    BEGIN
      frmmusteriliste.gridmusteri.Items.Items[1].Visible:=false;
      frmmusteriliste.gridmusteri.Items.Items[2].Visible:=false;
    END;
END; 
Dikkat ederseniz, tip değişkeninin tipi usertype!

@nitro
Haklısınız, yavaşlık gözönüne alınarak string karşılaştırılması da kullanabiliriz, ama buradaki tek sorun aslında yavaşlık değil. Üstelik bu soruda ortaya bir yavaşlık çıkar mı, çıksa da günümüz işlemcileri ile bu tespit edilebilir mi bilmiyorum :) Örneğin string karşılaştırmalı programların farklı dillere çevrilmesi daha zor olur. Ayrıca kodda ileride yapılacak değişiklikler de sıkıntı yaratır. Üstelik integer tabanlı işlemler yapmak genel olarak daha fazla avantaj sağlar. Örneğin bitwise operasyonlar kullanılabilir. Tavsiyem, mümkün olduğu kadar string işlemlerinden kaçınmanızdır.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

eline sağlık bahadır hocam. yararlı tavsiyene uymak konusunda bundan sonra çaba göstereceğim. teşekkürler
Cevapla