PopupMenu ile yapılan işlemlerede refresh olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Aşağıdaki şekilde bir ürünün durumunu kontrol etmek istiyorum, PopupMenu kullanıyorum ilk aşamada doğru çalışıyor sonrasında tüm butonlar pasif halde kalıyor. Sıralama yaparken sıralama için aktif/pasif nasıl yapabilirim ? şimdiden teşekkür ederim, iyi çalışmalar.

Kod: Tümünü seç

procedure TForm2.GarantiSresindeSevk1Click(Sender: TObject);
var
i : Integer;
NewItem:TMenuItem;
begin

with Sender as TMenuItem do
  begin
    case Tag of
    0: if (dbedit29.Text='1')
    then begin

    Qr_Update_Servis_Tipi.SQL.Clear;
    Qr_Update_Servis_Tipi.Close;
    Qr_Update_Servis_Tipi.SQL.text:='UPDATE TEKNIKILK ';
    Qr_Update_Servis_Tipi.SQL.Add('SET DURUMU= 2 ');
    Qr_Update_Servis_Tipi.SQL.Add('WHERE ID='''+dbedit28.Text+'''');
    Qr_Update_Servis_Tipi.ExecSQL;

    Tb_Servis.Close;
    Tb_Servis.Open;

    PopupMenu1.Items[0].Enabled:=false;
//PopupMenu1.Items[1].Enabled:=false;
PopupMenu1.Items[2].Enabled:=false;
PopupMenu1.Items[3].Enabled:=false;
PopupMenu1.Items[4].Enabled:=false;
PopupMenu1.Items[5].Enabled:=false;
PopupMenu1.Items[6].Enabled:=false;

procedure TForm2. OnayBekliyor1Click (Sender: TObject);
var
var
i : Integer;
NewItem:TMenuItem;
begin

with Sender as TMenuItem do
  begin
    case Tag of
    0: if (dbedit29.Text='1')
    then begin

    Qr_Update_Servis_Tipi.SQL.Clear;
    Qr_Update_Servis_Tipi.Close;
    Qr_Update_Servis_Tipi.SQL.text:='UPDATE TEKNIKILK ';
    Qr_Update_Servis_Tipi.SQL.Add('SET DURUMU= 2 ');
    Qr_Update_Servis_Tipi.SQL.Add('WHERE ID='''+dbedit28.Text+'''');
    Qr_Update_Servis_Tipi.ExecSQL;

    Tb_Servis.Close;
    Tb_Servis.Open;

    PopupMenu1.Items[0].Enabled:=false;
//PopupMenu1.Items[1].Enabled:=false;
PopupMenu1.Items[2].Enabled:=false;
PopupMenu1.Items[3].Enabled:=false;
PopupMenu1.Items[4].Enabled:=false;
PopupMenu1.Items[5].Enabled:=false;
PopupMenu1.Items[6].Enabled:=false;

http://dosya.co/rue68fhdcxow/Adsız.bmp.html
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen ertank »

Merhaba,

Yapmak istediğiniz tam anlaşılmıyor. Örnek koda bakıldığı zaman Garanti süresinde sevk ve Onay bekliyor için tamamen aynı işlemi yapıyor. Popup menu içinden 1 numaralı indeks dışında hepsini pasif hale getiriyor.

1- Popup menüde en üstteki seçenek tıklandığı zaman bir altındaki seçenek aktif olsun. Örneğin; "Onarılıyor" tıklandığı zaman hepsi pasif olsun. "Garanti Süresinde Sevk" aktif olsun. Yapmak istediğiniz böyle birşey mi?
2- Yoksa Database içindeki durum bilgisine göre ekrandaki seçeneklerden uygun olanını mı aktif etmek istiyorsunuz?
3- Son olarak kullandığınız Delphi sürümünü bildirebilir misiniz?
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Evet 1.kısımda anlattığınız gibi sıralama öyle olsun istiyorum, Delhi 7 kullanıyorum.
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 115
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen yhackup »

Ürünler bir listede listelenmiş durumda mı ?
Çaylak Delphici :D

Yakup ULUTAŞ
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Database içinde de olabilir popupmenünün içinde manuel de olabilir. Her 2 şekilde de olabilir.
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 115
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen yhackup »

eğer doğru anladıysam benzer bir durumu bu şekilde yapıyorum
procedure TForm4.DBGrid1CellClick(Column: TColumn);
begin
if (MyTable1.FieldByName('brans').AsString = 'Trafik') Then PopupActionBar1.Items[0].Visible := True
else PopupActionBar1.Items[0].Visible := False;
end;
Çaylak Delphici :D

Yakup ULUTAŞ
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen ertank »

denizfatihi yazdı:Merhaba,

Aşağıdaki şekilde bir ürünün durumunu kontrol etmek istiyorum, PopupMenu kullanıyorum ilk aşamada doğru çalışıyor sonrasında tüm butonlar pasif halde kalıyor. Sıralama yaparken sıralama için aktif/pasif nasıl yapabilirim ? şimdiden teşekkür ederim, iyi çalışmalar.

Kod: Tümünü seç

procedure TForm2.GarantiSresindeSevk1Click(Sender: TObject);
var
i : Integer;
NewItem:TMenuItem;
begin

with Sender as TMenuItem do
  begin
    case Tag of
    0: if (dbedit29.Text='1')
    then begin

    Qr_Update_Servis_Tipi.SQL.Clear;
    Qr_Update_Servis_Tipi.Close;
    Qr_Update_Servis_Tipi.SQL.text:='UPDATE TEKNIKILK ';
    Qr_Update_Servis_Tipi.SQL.Add('SET DURUMU= 2 ');
    Qr_Update_Servis_Tipi.SQL.Add('WHERE ID='''+dbedit28.Text+'''');
    Qr_Update_Servis_Tipi.ExecSQL;

    Tb_Servis.Close;
    Tb_Servis.Open;

    PopupMenu1.Items[0].Enabled:=false;
//PopupMenu1.Items[1].Enabled:=false;
PopupMenu1.Items[2].Enabled:=false;
PopupMenu1.Items[3].Enabled:=false;
PopupMenu1.Items[4].Enabled:=false;
PopupMenu1.Items[5].Enabled:=false;
PopupMenu1.Items[6].Enabled:=false;

procedure TForm2. OnayBekliyor1Click (Sender: TObject);
var
var
i : Integer;
NewItem:TMenuItem;
begin

with Sender as TMenuItem do
  begin
    case Tag of
    0: if (dbedit29.Text='1')
    then begin

    Qr_Update_Servis_Tipi.SQL.Clear;
    Qr_Update_Servis_Tipi.Close;
    Qr_Update_Servis_Tipi.SQL.text:='UPDATE TEKNIKILK ';
    Qr_Update_Servis_Tipi.SQL.Add('SET DURUMU= 2 ');
    Qr_Update_Servis_Tipi.SQL.Add('WHERE ID='''+dbedit28.Text+'''');
    Qr_Update_Servis_Tipi.ExecSQL;

    Tb_Servis.Close;
    Tb_Servis.Open;

    PopupMenu1.Items[0].Enabled:=false;
//PopupMenu1.Items[1].Enabled:=false;
PopupMenu1.Items[2].Enabled:=false;
PopupMenu1.Items[3].Enabled:=false;
PopupMenu1.Items[4].Enabled:=false;
PopupMenu1.Items[5].Enabled:=false;
PopupMenu1.Items[6].Enabled:=false;

http://dosya.co/rue68fhdcxow/Adsız.bmp.html
Öncelikle Qr_Update_Servis_Tipi nesnesinin SQL cümlesini sürekli güncellemeye gerek yok. Parametre tanımlayıp sadece parametre değiştirerek istediğinizi elde edebilirsiniz. Delphi içinde tasarım esnasında Qr_Update_Servis_Tipi.SQL içine aşağıdaki ifadeleri yazın.

Kod: Tümünü seç

UPDATE TEKNIKILK
SET DURUMU= 2
WHERE ID=:ID
Daha sonra güncelleme gereken yerde aşağıdaki gibi bir kod yazabilirsiniz.

Kod: Tümünü seç

        Qr_Update_Servis_Tipi.Close();
        Qr_Update_Servis_Tipi.Params[0].AsString := dbedit28.Text;
        Qr_Update_Servis_Tipi.Open();
Aynı şekilde Tb_Servis nesnesini kapatıp açmak yerine Refresh() prosedürünü aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

        Tb_Servis.Refresh();
PopupMenu kontrolüne gelince. Birçok farklı yöntem ile yapılabilir. İlk aklıma gelen yöntemi örnek veriyorum:
1- Öncelikle Menü nesnelerinin TAG özelliklerine sırası ile numaralandırma yapılır.
2- Tüm Menü nesnelerinin tıklamaları aynı prosedüre yönlendirilir. Ayrı ayrı tıklama prosedürleri olmaz.
3- Tıklama gerçekleştiği zaman tıklanan menü nesnesi TAG özelliğinden okunarak TAG+1 olan nesne dışındakiler pasif yapılır.
4- Esas database işlemleri gerçekleştirilir.

Ekte bunu gerçekleştiren örnek uygulama mevcuttur. Uygulama Delphi 10.1 ile oluşturulduğu için açılışta bazı hata uyarılar verebilir. Unit içindeki kod aşağıdaki gibidir.

Kod: Tümünü seç

unit Unit15;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.Menus;

type
  TForm15 = class(TForm)
    PopupMenu1: TPopupMenu;
    Onarlyor1: TMenuItem;
    GarantiSresindeSevk1: TMenuItem;
    OnayBekliyor1: TMenuItem;
    ParaBekliyor1: TMenuItem;
    FiyatBekliyor1: TMenuItem;
    HurdayaAyrld1: TMenuItem;
    eslimEdildi1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure eslimEdildi1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ResetPopupMenu(const Menu: TPopupMenu);
  public
    { Public declarations }
  end;

var
  Form15: TForm15;

implementation

{$R *.dfm}

procedure TForm15.ResetPopupMenu(const Menu: TPopupMenu);
var
  i: Integer;
begin
  for i := 1 to Menu.Items.Count-1 do
  begin
    if i = 0 then
      Menu.Items[i].Enabled := True
    else
      Menu.Items[i].Enabled := False;

    Menu.Items[i].Tag := i;
  end;
end;

procedure TForm15.eslimEdildi1Click(Sender: TObject);

  procedure DisablePopupMenus(const Menu: TPopupMenu);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
      Menu.Items[i].Enabled := False;
  end;

  procedure SetEnabled(const Menu: TPopupMenu; const Index: Integer);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
    begin
      if i = Index + 1 then
        Menu.Items[i].Enabled := True
      else
        Menu.Items[i].Enabled := False;
    end;
  end;


var
  Item: TMenuItem;
begin
  Item := TMenuItem(Sender);
  ResetPopupMenu(PopupMenu1);
  SetEnabled(PopupMenu1, Item.Tag);

  case Item.Tag of
    0: begin
//      if (dbedit29.Text='1') then
//      begin
//        Qr_Update_Servis_Tipi.Close();
//        Qr_Update_Servis_Tipi.Params[0].AsString := dbedit28.Text;
//        Qr_Update_Servis_Tipi.Open();
//
//        Tb_Servis.Refresh();
//      end;
    end;
  end;
end;

procedure TForm15.FormCreate(Sender: TObject);
begin
  ResetPopupMenu(PopupMenu1);
  
//  Qr_Update_Servis_Tipi.Close();
//  Qr_Update_Servis_Tipi.SQL.Clear();
//  Qr_Update_Servis_Tipi.SQL.Add('UPDATE TEKNIKILK');
//  Qr_Update_Servis_Tipi.SQL.Add('SET DURUMU= 2');
//  Qr_Update_Servis_Tipi.SQL.Add('WHERE ID=:ID');
end;

end.
Dosya ekleri
popupmenu.rar
(57.01 KiB) 136 kere indirildi
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Örnekte, aşağıdaki kısımda hata veriyor delphi7 kullanıyorum ek bir şey mi yapma lazım ?

Kod: Tümünü seç

uses
  Vcl.Forms,
  Unit15 in 'Unit15.pas' {Form15};
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen ertank »

Mesajı gönderirken yazmıştım Delphi 7 ile tam uyumlu olmayacaktır.

1- Ancak örnek prosedür ve fonksiyonları Delphi 7 ile açılan yeni bir uygulama içine kopyalayarak çalışır hale gelecektir.

2- Bunun dışında Delphi 7 içindeki Unit isimlerini eşleştirmeniz halinde de örnek uygulamanın çalışması gerekli. Örnek uygulama içindeki uses kısmlarını aşağıdaki gibi yazarak deneyin.

Project Source görünümü içinde (hata veren yerde) aşağıdaki gibi bir değişiklik yapın

Kod: Tümünü seç

uses
  Forms,
  Unit15 in 'Unit15.pas' {Form15};
Unit15 içindeki uses kısmını aşağıdaki şekilde değiştirerek deneyin.

Kod: Tümünü seç

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  Menus;
Delphi 7 kullanmayalı oldukça uzun zaman oldu. Tüm dönüşümü doğru yapamamış olabilirim.
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Cevap için sayın ertank ve sayın yhackup çok teşekkür ederim.
En kısa zamanda projeme uyarlayıp son halini ekleyeceğim.

iyi çalışmalar,
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Ek olarak birşey soracağım, şimdi projeme eklediğim zaman Onarılıyor aşamasında sorun yok ama 2.aşama olan Garanti süresinde sevk aktif oluyor yanlız 3.aşamaya geçmiyor sürekli 2.aşamada kalıyor. Ek birşey mi yapmak lazım ?

iyi çalışmalar,
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen ertank »

denizfatihi yazdı:Merhaba,

Ek olarak birşey soracağım, şimdi projeme eklediğim zaman Onarılıyor aşamasında sorun yok ama 2.aşama olan Garanti süresinde sevk aktif oluyor yanlız 3.aşamaya geçmiyor sürekli 2.aşamada kalıyor. Ek birşey mi yapmak lazım ?

iyi çalışmalar,
Hangi kodu kullandığınızı ya da ortak farklı bir kod mu kullandığınızı bilmiyoruz. Mevcut kodu paylaşabilir misiniz?
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Merhaba,

Sizin gönderdiğiniz kodu kullandım yalnız döngüye girmeyip işlem yapmayınca aşağıdaki gibi yaptım.

Kod: Tümünü seç

procedure TForm15.eslimEdildi1Click(Sender: TObject);

  procedure DisablePopupMenus(const Menu: TPopupMenu);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
      Menu.Items[i].Enabled := False;
  end;



  procedure SetEnabled(const Menu: TPopupMenu; const Index: Integer);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
    begin
      if i = Index + 1 then
        Menu.Items[i].Enabled := True
      else
        Menu.Items[i].Enabled := False;
    end;
  end;


var
  Item: TMenuItem;
begin
  Item := TMenuItem(Sender);
  ResetPopupMenu(PopupMenu1);
  SetEnabled(PopupMenu1, Item.Tag);

  case Item.Tag of
    0: begin
//      if (dbedit29.Text='1') then
//      begin
//        Qr_Update_Servis_Tipi.Close();
//        Qr_Update_Servis_Tipi.Params[0].AsString := dbedit28.Text;
//        Qr_Update_Servis_Tipi.Open();
//
//        Tb_Servis.Refresh();
//      end;
    end;
  end;

2. Döngüye girsin diye 


procedure TForm2.GarantiSresindeSevk1Click(Sender: TObject);

procedure DisablePopupMenus(const Menu: TPopupMenu);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
      Menu.Items[i].Enabled := False;
  end;

  procedure SetEnabled(const Menu: TPopupMenu; const Index: Integer);
  var
    i: Integer;
  begin
    for i := 0 to Menu.Items.Count-1 do
    begin
      if i = Index + 1 then
        Menu.Items[i].Enabled := True
      else
        Menu.Items[i].Enabled := False;
    end;
  end;

var
  Item: TMenuItem;
begin
  Item := TMenuItem(Sender);
  ResetPopupMenu(PopupMenu);
  SetEnabled(PopupMenu, Item.Tag);

  case Item.Tag of
    1: //begin
//      if (dbedit29.Text='1') then
//      begin
//        Qr_Update_Servis_Tipi.Close();
//        Qr_Update_Servis_Tipi.Params[0].AsString := dbedit28.Text;
//        Qr_Update_Servis_Tipi.Open();
//
//        Tb_Servis.Refresh();
//      end;
    end;
  end;
 end;
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen ertank »

Merhaba, Her bir popup menü seçeneği ayrı bir prosedürü göstermesin. Hepsi aynı prosedürü kullansın.

Popup menüyü çift tıklayarak tümünü seçip Object Inspector içinde Events bölümünde OnClick kısmını yine çift tıklarsanız hepsi aynı prosedürü kullanmış olur.
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: PopupMenu ile yapılan işlemlerede refresh olayı

Mesaj gönderen denizfatihi »

Çok teşekkür ederim tekrardan.
Cevapla