Главная страница
    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.026 c
11-84046
sapsan
2002-09-25 18:55
2003.06.26
недопонял ответ в FAQ по вопросу о проблеме с Proxies.dcu


14-84569
Andrew.
2003-06-07 17:30
2003.06.26
SMTP и отправка писем из програмы.


4-84829
Akvilon
2003-04-24 18:34
2003.06.26
Возвращаясь к вопросу об уникальности окон


3-84041
KSergey
2003-05-30 14:59
2003.06.26
Программное создание источника DDBC для MS SQL. Решение.


14-84706
nick-from
2003-06-04 23:01
2003.06.26
Зачем убили мой вопрос про dbf?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский