Runtime aşamasında buton oluşturmak ve basılan butonu okumak

Başlatan z, 14 Temmuz 2015, 15:33:24

z

Bugüne kadar hep tasarım aşamasında butonlarımı oluşturup programımı derliyordum.

Şimdi ise çalışan programda buton oluşturmam ve bu butona basıldığında kod koşturmam gerekiyor.

Yani kullanıcı programı calıstırıp butonlarla tasarım yapacak.

Bana en az iki buton oluşturma ve bunlara basıldığında basit bir şey yapacak kod örneği verebilirmisiniz?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

yaptım. oldu.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);  
    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Button1: TButton;
  Button2: TButton;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  //
  MessageDlg('buton1', mtWarning, [mbOK], 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //
  MessageDlg('buton2', mtWarning, [mbOK], 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1 := TButton.Create(form1);
  Button2 := TButton.Create(form1);

  Button1.Caption := 'buton1';

  Button2.Caption := 'buton2';

  Button1.Top := 10;
  Button1.left := 10;

  Button2.Top := 10;
  Button2.left := Button1.left + Button1.Width + 50;
  Button1.OnClick := Button1Click;
  Button2.OnClick := Button2Click;

  Button1.Parent := Form1;
  Button2.Parent := Form1;

end;

end.



en önemli kısım galiba şurası:

  Button1.Parent := Form1;
  Button2.Parent := Form1;

z

Peki ButtonClick procedurlerini programı yazma aşamasında hazırlamak zorundamıyız.

Yazacağım programı çalıştırdığımda istersem 2 buton oluştururum istersem 10 buton.
Kaç buton olacağı belli değil.

Bu sorunu nasıl aşacağım?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

1 tane olay yazılır. Hepsinin click olayi aynı olaya eşitlenir.
Hangi buton basildi? buna gore Olay içerisinde farklı işler yapılır.

Aşağıdaki şekilde denedim. çalıştı.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);
    procedure ButtonClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Button1: TButton;
  Button2: TButton;

implementation

{$R *.dfm}

procedure TForm1.ButtonClick(Sender: TObject);
begin
  //
  if Sender = Button1 then

    MessageDlg('buton1', mtWarning, [mbOK], 0);

  if Sender = Button2 then

    MessageDlg('buton2', mtWarning, [mbOK], 0);

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1 := TButton.Create(form1);
  Button2 := TButton.Create(form1);

  Button1.Caption := 'buton1';

  Button2.Caption := 'buton2';

  Button1.Top := 10;
  Button1.left := 10;

  Button2.Top := 10;
  Button2.left := Button1.left + Button1.Width + 50;
  Button1.OnClick := ButtonClick;
  Button2.OnClick := ButtonClick;

  Button1.Parent := Form1;
  Button2.Parent := Form1;

end;

end.

gkimirti

Örnek bir proje yaptım,
bir Buton  dizisi oluşturulup, runtime istenen adet kadar Create edilir, hepsine ortak BtnClick olay yordamı atanır, hangi butona tıklandığı butonların Tag özelliğinden öğrenilebilir.
Örnekte runtime create aşamasında Tag özelliğine sıra numarasını atadım.

Unit1.dfm dosyası
object Form1: TForm1
  Left = 0
  Top = 0
  ClientHeight = 393
  ClientWidth = 306
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 19
    Width = 177
    Height = 13
    Caption = 'Runtime olu'#351'turulacak Buton say'#305's'#305
  end
  object Button1: TButton
    Left = 224
    Top = 14
    Width = 75
    Height = 25
    Caption = 'Olu'#351'tur'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 224
    Top = 44
    Width = 75
    Height = 25
    Caption = 'Yoket'
    TabOrder = 1
    OnClick = Button2Click
  end
  object SpinEdit1: TSpinEdit
    Left = 185
    Top = 16
    Width = 33
    Height = 22
    MaxValue = 10
    MinValue = 1
    TabOrder = 2
    Value = 1
  end
end


Unit1.pas dosyası
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure BtnClick(Sender: TObject);
  end;

var
  Form1: TForm1;

  Btn : array of TButton;

implementation

{$R *.dfm}

procedure TForm1.BtnClick(Sender: TObject);
begin
  ShowMessage('Buton'+IntToStr(TButton(Sender).Tag)+' basıldı' );
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  ButonAdedi : Integer;
begin
  if SpinEdit1.Enabled then
  begin
    ButonAdedi := SpinEdit1.Value;
    SetLength(Btn,ButonAdedi);

    for i := 0 to ButonAdedi-1 do
    begin
      Btn[i] := TButton.Create(Self);
      Btn[i].Parent := Form1;
      Btn[i].Top := i*24+45;
      Btn[i].Left := 10;
      Btn[i].Width := 200;
      Btn[i].Caption := 'Buton'+IntToStr(i+1);
      Btn[i].Tag := i+1;
      Btn[i].OnClick := BtnClick;
    end;
  end;

  SpinEdit1.Enabled := False;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to Length(Btn)-1 do
    if Assigned(Btn[i]) then
      Btn[i].Free;
  SetLength(Btn,0);
  Btn := nil;
  SpinEdit1.Enabled := True;
end;

end.

t2

 Benim kod, bunun yanında çok uyduruk kaldı.

Çok sanatsal olmuş. Elinize sağlık.