Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen cengaver »

Merhaba arkadaşlar, ( Forumda araştırdım fakat bulamadım, o nedenle sorma ihtiyacı hissediyorum )

Bir bileşen yazmak istiyorum, bu bileşen standart bir buton olacak fakat ekstradan TControl türünde seçtiğim bir nesneyi de kendisine bağlayacak.
Bu butona bastığımda o butonun hemen altında TControl'e atadığım bileşeni göstermek, bileşenden çıktığımda ise o bileşenin gizlenmesini sağlayacak.

Property olarak bir TControl'ü bileşene ekledim. Tıklandığında atadığım TControl'ü de gösteriyor fakat TControl'den çıktığımda TControl OnExit olayını tetiklemiyor,

Bu sorunu nasıl aşarım, nasıl çözerim?

Örnek teşkil etmesi açısından aşağıda kodları veriyorum;

Derdimi tam anlatamadım gibime geliyor o nedenle kaynak kodları da paylaşıyorum,

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, System.Classes,
  Vcl.Controls, Vcl.Forms,
  Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Label11: TLabel;
    Label12: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure aControlOnExitOlayi(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure Kontrolu_Goster(aControl: TControl; _Control: TControl);
var
  P : TPoint;
begin
  P := Point( aControl.Left
            , aControl.Top
            + aControl.Height
            );
  _Control.SetBounds( P.X
                    , P.Y
                    , _Control.Width
                    , _Control.Height
                    );
  //_Control.Visible := True;
  _Control.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Kontrolu_Goster(TControl(Sender), Panel1);
end;

procedure TForm1.aControlOnExitOlayi(Sender: TObject);
begin
  TControl(Sender).Hide;
end;

end.
Unit1.dfm dosyası

Kod: Tümünü seç

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 504
  ClientWidth = 852
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 18
    Top = 18
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Panel1: TPanel
    Left = 18
    Top = 61
    Width = 489
    Height = 86
    TabOrder = 1
    Visible = False
    OnExit = aControlOnExitOlayi
    object Label11: TLabel
      Left = 22
      Top = 16
      Width = 37
      Height = 13
      Caption = 'Label11'
    end
    object Label12: TLabel
      Left = 22
      Top = 44
      Width = 413
      Height = 13
      Caption = 
        'Bu panelin d'#305#351#305'na t'#305'kland'#305#287#305'nda VEYA ba'#351'ka bir nesneye ge'#231'ildi'#287'i' +
        'nde bu panel gizlenecek'
    end
  end
end
En son cengaver tarafından 01 Haz 2016 09:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen SimaWB »

cengaver yazdı:fakat TControl'den çıktığımda
Bundan kasıt nedir? TControl'den çıkış işlemi nasıl yapılıyor?
There's no place like 127.0.0.1
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen cengaver »

TControl.OnExit veya fare ile TControl dışında başka bir şeye tıklandığında gerçekleşmeli

NOT: Yukarıdaki PAS ve DFM içeriğini güncelledim
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen SimaWB »

Sizin amacınız bileşenin active(focus) özelliğini kaybettiğini(deactive) algılamak. Bunun için TScreen sınıfının OnActiveControlChange olayını kullanabilirsiniz.

Fakat burada TControl sınıfında sorun yaşayabilirsiniz. Biliyorsunuz TControl'den türetilen bileşenler 2 ana sınıftan oluşur: TGraphicControl or TWinControl. TGraphicControl'den türetilen bileşenlerin window handle'ı olmadığı için focus özelliği yoktur(Mesela TLabel) . Bu yüzden OnActiveControlChange'i kullandığınızda bazı bileşenlerin active-deactive olduğunu anlayamayabilirsiniz.

Size tavsiyem; button'a eklediğiniz özellik için TWinControl sınıfını kullanın ve TGraphicControl'den türetilen bileşenlerden feragat edin. (Belki TGraphicControl için de bir çözüm vardır ama astarı yüzünden pahalıya gelebilir :) )
There's no place like 127.0.0.1
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen cengaver »

Anladım, fakat bir sıkıntı var, ben bunu bir bileşen haline getirip aynı form üzerinde birden fazla nesne için kullanmak istiyorum. Bunu bir windows mesajını yakalar gibi yapmamın bir yolu var mı?
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen SimaWB »

cengaver yazdı:Anladım, fakat bir sıkıntı var, ben bunu bir bileşen haline getirip aynı form üzerinde birden fazla nesne için kullanmak istiyorum. Bunu bir windows mesajını yakalar gibi yapmamın bir yolu var mı?
:bravo:
Elbette var.
WM_ACTIVATE ve CM_SETACTIVECONTROL mesajlarını araştırmalısınız.
There's no place like 127.0.0.1
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Popup Control, DropDown Panel, Popup Panel, DrowpDown Control

Mesaj gönderen cengaver »

Bir popup, kendisi dışındaki başka bir yere tıklandığında bunu nasıl algılayor da kendisini ekrandan kaldırıyor? Bu olayı anlayabilsem olayı çözecem ama bi türlü beceremedim :(
Cevapla