Self dla buttona

0

Chciałem aby zdarzenie Buttona (click) zwracało jakąś właściwość zawartą w tym butonie, jednak bez odwoływania się do nazwy egzemplarza tego buttona.

Więc napisałem:

procedure TForm1.Button11Click(Sender: TObject);
begin
  Edit1.Text:=Self.Caption;
end;

Ku mojemu zaskoczeniu procedura zwraca nazwę ale nie buttona tylko formatki (a więc zwraca string "Form1")
Co muszę zrobić aby Self reprezentowało Button który wywołuje zdarzenie a nie Formę.

5
Edit1.Text:=TButton(Sender).Caption;
0

TForm1.Button11Click
Spójrz dokładnie. Procedura Button11Click jest składową klasy TForm1. Jeżeli chcesz, żeby Self wskazywało na przycisk, na którym jest wykonywane, procedura musi być składową przycisku. To oznacza, że musisz stworzyć własną klasę przycisku, dziedziczącą po wbudowanym buttonie - i wtedy uczynić swój przycisk instancą tejże podklasy.

0
Brzydki Delfiarz napisał(a):

To oznacza, że musisz stworzyć własną klasę przycisku, dziedziczącą po wbudowanym buttonie - i wtedy uczynić swój przycisk instancą tejże podklasy.
Ale po co aż tak skoro bardziej odpowiednim rozwiązaniem jest takie jak zaprezentował kolega wyżej? Od tego przecież jest parametr Sender dzięki któremu wiemy co wywołało zdarzenie.

0

Czy wówczas jeśli utworzę wiele elementów klasy MyButton
:MyButton1,,,,,,MyButton9
to procedure MyButton1Click()...begin Self.Name end; zwróci "MyBytton1", a
procedure MyButton9Click() ...begin Self.Name end; zwróci "MyBytton9"

_13th_Dragon napisał(a):
Edit1.Text:=TButton(Sender).Caption;

Aha ,jeśli to rzeczywiście działa to dokładnie o to mi chodziło

Wielkie dzięki:))

0

Owszem, tylko że pamiętaj że możesz zrobić tak aby wszystkie na raz wywoływali jedną: procedure TForm1.Buttons_1_to_9_Click(Sender: TObject); - _13th_Dragon dzisiaj, 11:35

Byłoby pięknie to nie działa:( :

procedure TForm1.Buttons_1_to_7_Click(Sender: TObject);
begin
Edit1.Text:=Tbutton(Sender).Caption;
end;

[DCC Error] Unit1.pas(34): E2003 Undeclared identifier: 'Buttons_1_to_7_Click'

Jeśli TForm1.Buttons1Click(Sender: TObject); to owszem OK

0

Owszem, tylko że pamiętaj że możesz zrobić tak aby wszystkie na raz wywoływali jedną: procedure TForm1.Buttons_1_to_9_Click(Sender: TObject); - _13th_Dragon dzisiaj, 11:35

Byłoby pięknie tylko że to nie działa:( :

procedure TForm1.Buttons_1_to_7_Click(Sender: TObject);
begin
Edit1.Text:=Tbutton(Sender).Caption;
end;

[DCC Error] Unit1.pas(34): E2003 Undeclared identifier: 'Buttons_1_to_7_Click'

Jeśli TForm1.Buttons1Click(Sender: TObject); to owszem OK

0

Zmień nie tylko przy metodzie lecz jeszcze przy jej deklaracji w klasie oraz przy odwołaniu zdarzenia.

0
_13th_Dragon napisał(a):

Zmień nie tylko przy metodzie lecz jeszcze przy jej deklaracji w klasie oraz przy odwołaniu zdarzenia.

Przy próbie deklaracji tej zbiorczej procedury:
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure TForm1.Buttons_1_to_4_Click(Sender: TObject);
private
...........
..........

Wyskakuje okno Error z komunikatem:
Expexted'=' but '(' found.

1
  1. Zaznaczasz wszystkie 9 przycisków.
  2. Przechodzisz na Inspektora
  3. Przełączasz się na zakładkę zdarzenia
  4. W pustym polu za OnClick wpisujesz Buttons_1_to_4_Click
  5. Naciskasz Enter
  6. Analizujesz wygenerowny kod
0
_13th_Dragon napisał(a):

Zaznaczasz wszystkie 9 przycisków.

  1. Przechodzisz na Inspektora
  2. Przełączasz się na zakładkę zdarzenia
  3. W pustym polu za OnClick wpisujesz Buttons_1_to_4_Click
  4. Naciskasz Enter
  5. Analizujesz wygenerowny kod

Teraz rzeczywiście DZIAŁA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(To program musiał wygenerować zdarzenie i procedurę)

0
Sloso napisał(a):

... To program musiał wygenerować zdarzenie i procedurę ...
Nie nie musiał.
Wystarczy że wiesz co robisz, a jak nie wiesz no to ...

1
_13th_Dragon napisał(a):

Zaznaczasz wszystkie 9 przycisków.

  1. Przechodzisz na Inspektora
  2. Przełączasz się na zakładkę zdarzenia
  3. W pustym polu za OnClick wpisujesz Buttons_1_to_4_Click
  4. Naciskasz Enter
  5. Analizujesz wygenerowny kod
    Ewentualnie można napisać zdarzenie dla jednego buttona, a potem jak się zdecydujemy użyć tego samego eventu dla innego to mozna wybrać w Object Inspectorze zdarzenie już istniejące z listy rozwijanej. Ale widzę, że autor pytania ma problemy z obsługą IDE...

1 użytkowników online, w tym zalogowanych: 0, gości: 1