Procedure her yerden erişmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

S.A arkadaşlar kullanıcı yetkilendirme ile ilgi olarak aşağıdaki gibi bir procedure yazıp onshow yaptığım formun üzerideki actionları kullanıcı yekisine göre enable yada disable yapmak isityorum istediğimin %90 tmm ama aynı formu kapatıp açtığımda yani procedure 2 çalıştığında violation access hatası veriyor sanki create edilmemiş form için çalıştırılmış gibi bunu nasıl aşarım şimdiden herkese tşk.. procedure tek çalışmada sorun yok

procedure KullaniciYetkilendir(AForm: TForm; fKulID: Integer);
var
i, a: Integer;
Alan, Deger: string;
Sonuc: Boolean;
Yetki: SmallInt;
begin

With DMQ_1.qryUserItem do
begin
Close;
ParamByName('fuserid').AsInteger := fKulID;
Open;
end;

alan := 'menuadi';

//yetkiye göre true yapıyoz
try
try
for i := 0 to AForm.ComponentCount - 1 do
begin
if AForm.components is TAction then
begin
Deger := TAction(AForm.components).Name;
Sonuc := DMQ_1.qryUserItem.Locate(Alan, Deger,[]);
Yetki := DMQ_1.qryUserItem.FieldByName('ac').AsInteger;
if (Sonuc = True) and (Yetki = 1) then
TAction(AForm.components).Enabled := True;
//else TAction(AForm.components).Enabled := False;

end;//if TAction
end;//if component count
except
on E : Exception do
ShowMessage(' Kullanıcı yetkileri kontrol edilirken hata oluştu! HATA KODU : '+
E.ClassName+'&'+E.Message);
end;//
finally
DMQ_1.qryUserItem.Close;
end;

end;


kullanıımı
her formun onshow una
KullaniciYetkilendir(frmMenu, DM.qryKulKontuserid.AsInteger);

KullaniciYetkilendir(frmCariler, DM.qryKulKontuserid.AsInteger);

KullaniciYetkilendir(frmStoklar, DM.qryKulKontuserid.AsInteger);

vs...
gibi
coderserdar
Üye
Mesajlar: 16
Kayıt: 25 Nis 2011 04:04

Re: Procedure her yerden erişmek

Mesaj gönderen coderserdar »

yeni bir unit oluşturun
birden çok formda kullanacağınız bütün metotları buraya taşıyın
metotları kullanacağınız formlarda bu uniti kullanın
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Re: Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

cevabın için tşk ama yeni bir unit oluşturmak işimi görmüyor hata yine alıyorum
coderserdar
Üye
Mesajlar: 16
Kayıt: 25 Nis 2011 04:04

Re: Procedure her yerden erişmek

Mesaj gönderen coderserdar »

aslında şu şekilde bir çözüm geliyor aklıma
bu yetki sorgusu bir sefer çalıştırılır ilk uygulama açıldığında
buradaki değer bir genel değişkene atılır uygulama dosyasında
her formun onshow metodunda
switch case ile kontroller yapılıp
yetkisi varsa enable disable olayları yapılabilir
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Re: Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

actionları tarayacaksa component.count metodundan kurtulamıyoz dolayısılya her form için aynı procedure tekrar yazcaz yada tek procedurle ayrı formlardaki componentleri nasıl tarayacaz onu bulamadım işte :)
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Re: Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

arkadaşlar yapmak istediğim ekteki bu örnek bunu çalışır hale getirirsek işim görüleçek
Dosya ekleri
Projects.zip
arkadaşlar yapmak istediğim bu örnek bunu çalışır hale getirirsek işim görüleçek
(60.46 KiB) 80 kere indirildi
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Re: Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

S.A Arkadaşlar herkese tşk ederim ilgilendiğiniz içi özelliklede trex994 ve coder serdara ama ben sorunu şu şekilde çözdüm başka arkadaşlara yardımcı olur diye yayınlıyorum..
elzembilgi
Üye
Mesajlar: 20
Kayıt: 13 Tem 2008 06:32

Re: Procedure her yerden erişmek

Mesaj gönderen elzembilgi »

procedure KullaniciYetkilendir(AForm: TForm; fKulID: Integer);
var
i: Integer;
fAction: TAction;
fActName: String;
begin
With DMQ_1.qryUserItem do
begin
Close;
ParamByName('fuserid').AsInteger := fKulID;
Open;
end;

//yetkiye göre true yapıyoz
try
DMQ_1.qryUserItem.First;
try
while not DMQ_1.qryUserItem.Eof do
begin
if DMQ_1.qryUserItem.FieldByName('ac').AsInteger = 1 then
begin //yetkisi yoksa true yap
fActName := DMQ_1.qryUserItem.FieldByName('menuadi').AsString;
if Assigned(TAction(AForm.FindComponent(fActName))) then
TAction(AForm.FindComponent(fActName)).Enabled := True;
end else begin //yetkisi yoksa false yap
fActName := DMQ_1.qryUserItem.FieldByName('menuadi').AsString;
if Assigned(TAction(AForm.FindComponent(fActName))) then
TAction(AForm.FindComponent(fActName)).Enabled := False;
end;

DMQ_1.qryUserItem.Next;
end;//while sonu
except
on E : Exception do
ShowMessage(' Kullanıcı yetkileri kontrol edilirken hata oluştu! HATA KODU : '+
E.ClassName+'&'+E.Message);
end;
finally
DMQ_1.qryUserItem.Close;
//FreeAndNil(fAction);
end;

end;


İşin püf noktası kullanımıda imiş procedure birinci aform parametresine form ismi değilde self dememiz gerekiyormuş ilk yazdımğım kodda bu şekilde çalışıyor
kullanımı
KullaniciYetkilendir(Self, DM.qryKulKontuserid.AsInteger);
gibi
Cevapla