main menü görünen eleman yoksa gizlensin

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

main menü görünen eleman yoksa gizlensin

Mesaj gönderen mustafasoy »

for i := 0 to ComponentCount-1 do
begin
if ( Components is TMenuItem ) AND ( TMenuItem( Components ).Tag=modulid)
then
begin
TMenuItem( Components ).Visible :=true;
end;
end;


selam dostlar , takıldığım bir konuda fikir rica ediyor olacağım
yukarıdaki şekilde web panelden kullanıcının yetkisini açıyorum ve program açıldığında mainmenulerin tag bilgilerine göre
mainmenü elemanlarını gizliyor yada açıyorum ancak ilgili mainmenude hiçbir modül yetkisi yoksa o main menü hiç görünmeden gizlensin istiyorum

aaa bbb ccc
a1 b1 c1
a2 b2 c2

a1 ve a2 nin visible false ise aaa menüsü görünmemeli
mainmenu.items.count=0 diyemiyorum çünkü eleman sayısı 0 dan büyük bu durumda görünen eleman sayısı 0 ise demen gerekir sanırım
takıldım kaldım, nasıl bir yok izlemek gerekir
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen brs »

Selam, Aklıma iki yöntem geliyor,

1. Programa kullanıcı adı ve şifre ile giriş yapıyorsa o anda yetkisine göre neleri göstermek istiyorsan Visible :=true; yapabilirsin.
2. Kullanıcı kaydet, sil gibi durumlarda yine databasedeki yetkisine göre işlem devam edebilir...

Örnek:

Kod: Tümünü seç

procedure TForm3.Button1Click(Sender: TObject);
begin
  with Form1.Userler do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select * From User Where KULLANICI=:KADI and ONAYLI=:ONAY');
    ParamByName('KADI').Value := (Form1.Edit1.Text);
    ParamByName('ONAY').AsString := 'Evet';
    Prepared := True;
    Open;
    if Not IsEmpty then
    begin
      Application.MessageBox('Giriş yetkisi var', 'var',
        MB_Ok or MB_ICONQUESTION);
    end
    else
    begin
      Application.MessageBox('Giriş yetkisi yok!', 'yok',
        MB_Ok or MB_ICONQUESTION);
    end;
  end;
end;
Kolay gelsin...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen xozcanx »

Merhaba;
Aklıma gelen yöntemi söyleyeyim belki farklı fikirler verebilir size, menü başlıklarına AAA,BBB,CCC 100,200,300 şeklinde Tağ belirleyin bunlarında alt menülerine ise 101,102,103...115 - 201,202,203...213 - 301,302...308 şeklinde devam ettirin.
yukarıdaki döngüyü 101-199 arası yaparken a değişkenini her kontrolde 1 artırın döngü sonunda eğer a değeri Sıfır ise AAA menüsünü Visible yapabilirsiniz.

Kolay gelsin..
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen thelvaci »

Ben de kodunuz da bir iyileştirme önereceğim. TMenu parametresi alan ve kendi içinde reqursive(özyinelemeli) dönebilen bir metodunuz olur ise daha şık olacaktır. Bu sayede ilgili metoda istediğiniz an bir TMainMenu istediğiniz an bir TPopupMenu instance'ı geçebilirsiniz. Ayrıca; alt alt'a eleman içeren durumlarda da düzgün çalışacaktır bu sayede.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen mustafasoy »

Selam , aklıma gelen yöntem bu oldu aslında ama daha kısa pratik bir fikir öğrenebilirim diye yazmak istedim
Su anda uygulama kullanılıyor ama kullanicilar tikliyorum birşey gelmiyor sorularından biktim, gizliyim kurtulalım dedim yorumlar için tesekkurler

xozcanx yazdı:Merhaba;
Aklıma gelen yöntemi söyleyeyim belki farklı fikirler verebilir size, menü başlıklarına AAA,BBB,CCC 100,200,300 şeklinde Tağ belirleyin bunlarında alt menülerine ise 101,102,103...115 - 201,202,203...213 - 301,302...308 şeklinde devam ettirin.
yukarıdaki döngüyü 101-199 arası yaparken a değişkenini her kontrolde 1 artırın döngü sonunda eğer a değeri Sıfır ise AAA menüsünü Visible yapabilirsiniz.

Kolay gelsin..
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen SimaWB »

Aklıma gelen ilk çözüm:

Kod: Tümünü seç

function CheckVisibility(MI: TMenuItem): Boolean;
var i: integer;
begin
  Result := False;
  for i := 0 to MI.Count-1 do
    if MI.Items[i].Visible then
    begin
      Result := True;
      Break;
    end;
end;

procedure TFormTest.Button1Click(Sender: TObject);
var MI: TMenuItem;
begin
  for MI in MainMenu1.Items do
    MI.Visible := CheckVisibilty(MI);
end;
Soruda verilen örneğe göre bu şekilde bir çözüm işinizi görür. Ama alt menu'lerde de aynı kontrolün yapılması gerekiyorsa Sn. thelvaci'nın dediği gibi recursive bir fonksiyon yazılmalı.
There's no place like 127.0.0.1
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: main menü görünen eleman yoksa gizlensin

Mesaj gönderen mustafasoy »

sevgili simaweb verdiğin function işime yaradı , teşekkür ederim
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Cevapla