Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизНе могу разобраться с компонентом на основе кнопки Найти похожие ветки
← →
Rinat (2003-06-16 14:04) [0]1 Создал коспонент на основе кнопки
unit Avtomat7;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TAvtomat7 = class(TWinControl)
private
FButton: TButton;
FNumber : TLabel;
protected
function GetOnButtonClick: TNotifyEvent;
procedure SetOnButtonClick(Value: TNotifyEvent);
procedure SetTextFNumber(Value:String);
function GetTextFNumber : String;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnButtonClick: TNotifyEvent read GetOnButtonClick write SetOnButtonClick;
property Number: String read GetTextFNumber write SetTextFNumber;
end;
procedure Register;
implementation
constructor TAvtomat7.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FButton := TButton.Create(Self);
FButton.Height := 270; //
FButton.Width := 80;
FButton.Parent := Self;
FNumber := TLabel.Create(Self);
FNumber.Parent := FButton;
FNumber.Width :=32;
FNumber.Height := 14;
FNumber.Caption:= "N";
FNumber.Left := FButton.Left + 5;
FNumber.Top := Fbutton.Top + 30;
end;
destructor TAvtomat7.Destroy;
begin
FButton.Free;
inherited Destroy;
end;
function TAvtomat7.GetTextFNumber: String;
begin
Result := FNumber.Caption;
end;
procedure TAvtomat7.SetTextFNumber(Value: String);
begin
FNumber.Caption := Value;
end;
function TAvtomat7.GetOnButtonClick : TNotifyEvent;
begin
Result := FButton.OnClick;
end;
procedure TAvtomat7.SetOnButtonClick(Value: TNotifyEvent);
begin
FButton.OnClick := Value;
end;
procedure Register;
begin
RegisterComponents("Samples", [TAvtomat7]);
end;
end.
2 Использую в приложении которое создает его копии динамически
procedure TFMain.BtnAddClick(Sender: TObject);
var
Avt : TAvtomat7;
begin
inc(num);
Avt:=TAvtomat7.Create(self);
Avt.Parent := SBMain;
Avt.OnButtonClick := AvtomatClick;
Avt.Left:=x;
Avt.Top:=y;
Avt.Name:="QF"+inttostr(num);
x:=x+Avt.Width;
end;
3 При нажатии на один из компонентов в приложении
procedure TFMain.AvtomatClick(Sender: TObject);
var
compname : string;
Avt : TAvtomat7;
begin
Avt:=TAvtomat7(Sender.Create);
compname := Avt.Name;
Showmessage(compname);
end;
Выдает ПУСТУЮ месагу , причем FMain.ActiveControl.Name
так же не помогает :-((
Помогите вытащить имя объекта созданного динамически плизззз!!!
← →
Юрий Федоров (2003-06-16 14:14) [1]>>Avt:=TAvtomat7(Sender.Create);
Что за бред ? Может без Create все таки ?
← →
Skier (2003-06-16 14:14) [2]procedure TFMain.AvtomatClick(Sender: TObject);
var
compname : string;
Avt : TAvtomat7;
begin
Avt:=TAvtomat7( Sender);
compname := Avt.Name;
Showmessage(compname);
end;
← →
Юрий Зотов (2003-06-16 14:14) [3]Вот эта строка очень странная и скорее всего ошибочная:
Avt := TAvtomat7(Sender.Create);
Поясните, что Вы хотели сделать.
← →
Rinat (2003-06-16 14:44) [4]1 Этот код я переработал с примера.
Там вместо моего компонента создается просто кнопка
я взял яAvt := TAvtomat7(Sender.Create);
отBt := TButton(Sender.Create);
, где все работает...
2 Попробывал сделатьAvt:=TAvtomat7(Sender);
,
не помогло, а впримере что использовал ничего не изменило,
как работало так и работает :-)
3
> Поясните, что Вы хотели сделать.
Я хотел чтобы при нажатии на динамически созданный объект, мне
передовалось его имя, чтобы дальше оперировать его свойствами.
← →
Юрий Федоров (2003-06-16 14:50) [5]Посмотри, что вернет Sender.ClassName в AvtomatClick.
Сдается мне, что "TButton"
← →
Skier (2003-06-16 14:52) [6]>Rinat (16.06.03 14:44)
Сделай небольшую проверку :
procedure TFMain.AvtomatClick(Sender: TObject);
begin
Showmessage(Sender.ClassName); //что получишь ?
end;
Мне кажется что TButton. Нет ?
← →
Юрий Федоров (2003-06-16 15:00) [7]>>Skier © (16.06.03 14:52)
:-)))
← →
Rinat (2003-06-16 15:46) [8]Ага, выдало именно это...
Может подскажете что это значит?
PS Это мой первый компонент :-)
← →
Skier (2003-06-16 15:51) [9]>Rinat © (16.06.03 15:46)
> Может подскажете что это значит?
А это значит что событие "возбуждает" не TAvtomat7,
а TButton (кстати для того чтобы понять это нужно перевести
слово Sender :) )
> PS Это мой первый компонент :-)
http://www.delphimaster.ru/articles/components_gauge.html
← →
Юрий Федоров (2003-06-16 15:52) [10]Это означает, что в качестве Sender у тебя выступает твоя кнопка FButton(которой ты не присвоил имя), а вовсе не твой компонент.
Я думаю, с событиями тебе нужно сделать наоборот :
В коде компонента
для FButton.OnClick присвоить свой приватный метод, в котором вызывать событие OnButtonClick, если оно присвоено (которое держать приватным полем в компоненте)
← →
Юрий Зотов (2003-06-16 16:00) [11]Это значит, что Sender"ом приходит объект класса TButton, а не TAutomat7 (то есть, событие возбуждает именно кнопка). Кроме того, никаких Create здесь не нужно.
Используйте конструкцию:
Avt := TAutomat7(TButton(Sender).Owner);
Это и будет ссылка на тот объект TAutomat7, чью кнопку нажали. С ней напрямую и работайте, даже Name Вам вряд ли потребуется (хотя никто не запрещает и использовать Avt.Name).
← →
Rinat (2003-06-16 16:12) [12]ОГРОМНОЕ ВАМ СПАСИБО!!!!!!!!!!
ВСЕ Заработало!!
А то я уже не знал что и думать :-)
Max Respect!
← →
Юрий Зотов (2003-06-16 16:35) [13]Но Вы все же прислушайтесь к совету
Юрий Федоров © (16.06.03 15:52)
Дело в том, что Вы же пишете КОМПОНЕНТ, а не программу. И, если уж писать его ПРАВИЛЬНО, то Sender"ом в обработчик события должен приходить САМ компонент, а не его внутренняя кнопка. А прямого доступа к этой кнопке снаружи вообще не должно быть.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.025 c