Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Программно создать событие OnClick на кнопке


Автор: mistrmax 5.4.2011, 16:59
Вы меня только сильно не бейте, если что не то скажу. Раздел ведь для новчиков...
Вообщем есть форма, на ней я программно создаю кнопки. Мне нужно одновременно присваивать каждой кнопке событие. События для каждой кнопки, одинаковые (Form2.Show), но так же нужно, чтобы по нажатию кнопки, в Form2 в Label1 менялся текст в соответствии с заданным пользователем параметром из INI файла (Ini читать умею если что). Для каждой кнопки свой текст и он меняется. Ну вот как то так. Собственно как программно создать такое событие OnClick на кнопке ?  smile 
Заранее спасибо.

Автор: ~FoX~ 5.4.2011, 17:21
Код

type
  TForm1 = class(TForm)
//.................
    procedure BOpenClick(Sender: TObject); //Описали клик
//.................
 private
    BOpen: TButton;  //кнопа
//..............  
    BOpen := TButton.Create(Self);
    BOpen.Parent := Self;
    BOpen.Height := 150;
    BOpen.Width := 150;
    BOpen.Caption := 'Button';
    BOpen.Hint := 'Button';
    BOpen.ShowHint := true;
    BOpen.OnClick := BOpenClick;  //<---------примерно так
    BOpen.Visible := true;

//...............................
procedure TForm1.BOpenClick(Sender: TObject);
begin
 Form2.Show; //Ну, а тут, обрабатываем наш клик
end;

Автор: mistrmax 5.4.2011, 17:54
Цитата(~FoX~ @ 5.4.2011,  17:21)
Код

type
  TForm1 = class(TForm)
//.................
    procedure BOpenClick(Sender: TObject); //Описали клик
//.................
 private
    BOpen: TButton;  //кнопа
//..............  
    BOpen := TButton.Create(Self);
    BOpen.Parent := Self;
    BOpen.Height := 150;
    BOpen.Width := 150;
    BOpen.Caption := 'Button';
    BOpen.Hint := 'Button';
    BOpen.ShowHint := true;
    BOpen.OnClick := BOpenClick;  //<---------примерно так
    BOpen.Visible := true;

//...............................
procedure TForm1.BOpenClick(Sender: TObject);
begin
 Form2.Show; //Ну, а тут, обрабатываем наш клик
end;

Это умеем уже, но спасибо, что откликнулись.
Хотелось бы что бы было что нибудь вроде:
Код

//.................
 procedure BOpenClick(text: string);
//.................
//.................
BOpen.OnClick := BOpenClick('любой текст, разный для каждой кнопки');
//.................
//.................

procedure TForm1.BOpenClick(text: string);
begin
 Form2.Label1.Caption:=Text;
 Form2.Show; 
 
end;


Но это естественно не работает. Читал что нужно как то использовать TNotifyEvent... Но как это сделать по аналогии в этом случае так и не разобрался.
Код


function MakeMethod(code,data:pointer):TMethod;
begin
  Result.Data := Data;
  Result.Code := Code;
end;
............................
Shape.OnClick:=TNotifyEvent(MakeMethod(@MyEvent,@MyEvent));


Автор: cat512 5.4.2011, 19:21
Что мешает в этом обработчике проверить условие на наличие необходимого объекта, например:
Код

procedure TForm1.BOpenClick(Sender: TObject);
begin
  if assigned(Sender)  and (Sender is TButton) then 
  begin
//Проверка по типу класса
    Sender as TButton then Caption := 'Button';
  end;
//Проверка по имени класса.
  if Assigned(Sender) and (LpowerCase(Senedr.ClassName) = 'tbutton') then 
    Caption := 'Button';
//Проверка по имени объекта(компонента)
  if Assigned(Sender) and Sender is TComponent 
    and (LowerCase((Sender as TComponent).name) = 'tbutton') then
      Caption := 'Button';
    
end;

Автор: mistrmax 5.4.2011, 20:58
cat512, по ходу вы либо не в ту тему написали, либо не поняли суть моей проблемы. 
Ну это уже неважно. Проблему я решил и без TNotifyEvent, используя свойство Tag каждой кнопки, хоть с точки зрения этики это как то и не очень выглядит. =)
Код


btn.Tag:=i; //при динамическом создании кнопки, i - счетчик кнопок.
btn.OnMouseDown:=ButtonREnter; //...
//...............

procedure TForm1.ButtonREnter(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
ini:TIniFile;
param:integer;
//...............
begin
  ini:=TiniFile.Create(ExtractFileDir(Application.ExeName)+'\opt.ini');
  param:= TButton(Sender).Tag;
  mes:=ini.ReadString('btn'+inttostr(param),'z','Error');
  showmessage(mes);
  //...............
end;
//...............

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)