popup menu tarzı form kullanmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

Standart popup menu yerine form kullanabilirmiyim,bu konuda arama yapmama ragmen bir örnek bulamadım.
bu tarz bir resimli popup menu nasıl kullanabiliriz.
http://hizliresim.com/5ok0nz
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

bkz. bu link


Resim
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Hazır bir örnek proje hazırladım. Verdiğin resmi parçalayarak PhotoShop ile farklılaştırdım...

Proje kaynak kodu, Bitmap'ler vs. hepsi bu linktedir.

Resim

Kaynak Kod içeriğine göz atmak isteyenler için de aşağıdaki gibi...

Kod: Tümünü seç

{$R RES\RES.RES}

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Sayac : Integer;
begin
  PopupMenu1.OwnerDraw := True;

  For Sayac := 0 to PopupMenu1.Items.Count-1 do begin
    With PopupMenu1.Items[Sayac] do begin
      If Caption <> '-' then
      begin
        OnDrawItem    := MenuItemDrawItem;
        OnMeasureItem := MenuItemMeasureItem;
      end;
    end;
  end;
end;

procedure TForm1.MenuItemDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
  strMenuBasligi : string;
  Bitmap         : TBitmap;
  ResStream      : TResourceStream;
begin
// Menu Item'leri ayırt etmek için içindeki metni kullanıcaz...
   strMenuBasligi := TMenuItem(sender).Caption;
// Kenar boşluklarında çerçeve görünecek. Seçili ise Sarı, değilse standart gri
   if Selected
     then ACanvas.Brush.Color := clYellow
     else ACanvas.Brush.Color := clBtnFace;
   ACanvas.FillRect(ARect);

  Bitmap := TBitmap.Create;
  try
// Şimdi başlıığa göre özel resim getirilecek...
    if strMenuBasligi = '&0' then
    begin
      ResStream  := TResourceStream.Create(HInstance, 'M00', RT_RCDATA);
      Bitmap.LoadFromStream(ResStream);
      ResStream.Free;
    end else
    if strMenuBasligi = '&1' then
    begin
      if Selected then ResStream  := TResourceStream.Create(HInstance, 'M1a',  RT_RCDATA)
                  else ResStream  := TResourceStream.Create(HInstance, 'M1b', RT_RCDATA);
      Bitmap.LoadFromStream(ResStream);
      ResStream.Free;
    end else
    if strMenuBasligi = '&2' then
    begin
      if Selected then ResStream  := TResourceStream.Create(HInstance, 'M2a',  RT_RCDATA)
                  else ResStream  := TResourceStream.Create(HInstance, 'M2b', RT_RCDATA);
      Bitmap.LoadFromStream(ResStream);
      ResStream.Free;
    end else
    if strMenuBasligi = '&3' then
    begin
      if Selected then ResStream  := TResourceStream.Create(HInstance, 'M3a',  RT_RCDATA)
                  else ResStream  := TResourceStream.Create(HInstance, 'M3b', RT_RCDATA);
      Bitmap.LoadFromStream(ResStream);
      ResStream.Free;
    end;

 // Dilersen biraz içeri daraltıp kenarlarında çerçeve görünmesini sağlamak için
  //InflateRect(ARect, -2, -2) ;
    ACanvas.Draw(ARect.Left+4, ARect.Top+4, Bitmap) ;
  finally
    Bitmap.Free;
  end;
end;

procedure TForm1.MenuItemMeasureItem( Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer) ;
begin
// Menü yüksekliği burada boyutlandırılacak...
  Width  := 300; // Resimden daha geniş
  Height := 64;  // Resimden daha yüksek
end;
Kaynak Menü Image Tekleri
Resim

Resim

Resim

Resim

Resim

Resim

Resim
Resim
Resim ....Resim
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mustafasoy »

mrmarman hocam eline,emeğine sağlık
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

Çok teşekkürler mrmarman hocam, peki alt menü ekledim subitem'e tıklayınca 'N01' Menü Image bitmap resmini nasıl degiştirebilirim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Aynı şekilde yapacaksınız. Eklediğiniz altmenünün de ondrawitem ve onmeasureitem eventlerini benzer döngü ile aynı procedure bağkamanız kafi.

Kod: Tümünü seç

PopupMenu1.Items.Count-1
değil de items[menu_index].items.count-1

gibi olacak. Siz menünün yine adına veya başlığına göre ilgili resmi (seçili olma durumunu gözeterek) atayacaksınız.
Resim
Resim ....Resim
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

mrmarman abi teşşekür ederim ama subiteme resim ekliyorum problem yok , fakat benim anlatmak istedigim

altmenüye tklanınca ana menü resminin degişmesini istiyorum.

http://hizliresim.com/g48vD0
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Sihrini çalıştır.

O başlığı (caption) sub item ile değiştirmen yeterli. Şöyle düşün, her itemde aynı başlık yazıyor olsaydı hepsinde aynı resim / image görünecekti.

Bilmem anlatabildim mi?
Resim
Resim ....Resim
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

abi valla anlamadım geceden beri kafam şişti valla bir örnek verebilirmisin teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Subitemin on click olayında subitemin caption değerini ana itemin caption değerine eşitle.
Resim
Resim ....Resim
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

abi rica etsem bir örnek verebilirmisin inan kafam durdu.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Bence çık biraz hava al mesajları ve verdiğim örneği anlamaya çalış.

Daha ne diyebilirim. Kopyala / yapıştır yaparak öğrenemezsin. Kavrayarak ilerlemelisin.

Tekrarvediyorum dikkatlice oku;

SORU: Resimler neye göre menuitemlerde beliriyor?
Cevap: Caption ne ise ona göre.

Soru: Bir menüitemin resmini nasıl dinamik olarak değiştirebilirsin?
CEVAP: Caption text içeriğini değiştirmen yeterli. Ek bir işlem yapmana gerek yok.

İstersen şunu dene, tüm menü itemlerin Caption içeriğini '0' yap ve programı çalıştır. Hepsinde aynı resmi göreceksin.

Bundan başka tüyo nasış verebilirim anlamadım.
Resim
Resim ....Resim
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

haklısın abi biraz hava alsam iyi olacak teşekkürler.
reyhan
Üye
Mesajlar: 25
Kayıt: 24 Kas 2014 10:46

Re: popup menu tarzı form kullanmak

Mesaj gönderen reyhan »

hata alıyorum abi subitem click
Canvas does not allow drawing hatası, derlemede problem olmuyor ama altmenüye tıklayınca bu taha çıkıyor.

kod

Kod: Tümünü seç

procedure TForm1.N41Click(Sender: TObject);
var
  strMenuBasligi : string;
  Bitmap         : TBitmap;
  ResStream      : TResourceStream;
  ACanvas: TCanvas;
  ARect: TRect;
begin
  strMenuBasligi := TMenuItem(sender).Caption;
  Bitmap := TBitmap.Create;
  ACanvas := TCanvas.Create;
  try
    if strMenuBasligi = '&4' then
    begin
      ResStream  := TResourceStream.Create(HInstance, 'M2aa', RT_RCDATA);
      Bitmap.LoadFromStream(ResStream);
      ResStream.Free;
    end;
    ACanvas.Draw(ARect.Left, ARect.Top, Bitmap);
  finally
    Bitmap.Free;

  end;

  end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: popup menu tarzı form kullanmak

Mesaj gönderen mrmarman »

Bu örneği de veriyorum. Anlamaya çalış lütfen.

Aşağıdaki procedure, vereceğin POPUPMENU hangisi ise onun en alt menu başlıklarına kadar Event Tanımlamasını recursive dediğimiz iç içe döngü kurarak yapar.

Kaynak kodları ile projenin linki için buradan indirebilirsin.

Bahsettiğim Caption değerini aktarma işi için de örnek ekledim.

Kod: Tümünü seç

procedure TForm1.N22Click(Sender: TObject);
begin
  TMenuItem(Sender).Parent.Caption := TMenuItem(Sender).Caption;
end;
Bu dinamik yapılı halidir. Bu örnekteki N22Click eventini hangi SUBItem'e ilişkilendirirsen, o subitem tıklandığında onun ana itemini caption değeri bununki ile değişecek, dolayısı ile resim de onunla aynısı olacak.

Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  EventAtamasiYap( PopupMenu1 );
end;
Procedure:

Kod: Tümünü seç

Procedure TForm1.EventAtamasiYap( PopUpMenu :TPopUpMenu );
  Procedure AltMenuItem( aMenuItem:TMenuItem );
  Var
    Sayac : Integer;
  begin
    With aMenuItem do
    begin
      If Caption <> '-' then
      begin
        OnDrawItem    := MenuItemDrawItem;
        OnMeasureItem := MenuItemMeasureItem;
      end;
      if aMenuItem.Count > 0 then
      begin
        For Sayac := 0 to aMenuItem.Count-1
        do AltMenuItem( aMenuItem.Items[Sayac] );
      end;
    end;
  end;
Var
  iSayac : Integer;
begin
  PopupMenu.OwnerDraw := True;
  For iSayac := 0 to PopupMenu.Items.Count-1
    do AltMenuItem( PopUpMenu.Items[iSayac] );
end;
Resim
Resim ....Resim
Cevapla