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ç