Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.184 c
1-84253
Gogol
2003-06-13 19:01
2003.06.26
Общая процедура OnChange на MyEdit: Array [0..n] of TEdit,


1-84413
qwerty2
2003-06-06 16:32
2003.06.26
Создание DCOM объекта в Win98


3-83970
Jaxtor
2003-05-29 16:30
2003.06.26
DBGridEh


1-84332
Andrey02
2003-06-15 22:59
2003.06.26
Правильное прерывание потоков


6-84507
grundik
2003-04-24 13:06
2003.06.26
Stream Socket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский