Jak tu użyć Sender?

0

Problem:
Dynamicznie tworze 5 komponentów typu TPanel. Nazywam je a1,a2,a3,a4,a5. Chciałbym aby po kliknięciu na któryś z utworzonych paneli pojawiał się ShowMessage(); z nazwą komponentu np. "Kliknales a1".

Co zrobiłem:
Dodałem zdarzenie OnClick do tworzonych komponentów a w nim:

VAR
Panel  :  TPanel
...
IF Sender = Panel THEN ShowMessage(Panel.Name);

Ale to działa tylko gdy klikne na ten ostatnio utworzony (a5). Co zrobić, żeby zadziałało na wszystkie, gdy klikne na a1, a2 itp.

Pozdrowienia

0

funkcja powinna wygladac nastepujaco:

procedure TForm1.PanelClick(Sender: TObject);
begin
  if Sender is TPanel then
    ShowMessage(TPanel(Sender).Name);
end;

funkcje powinno sie podpaic pod OnClick kazdego panela.

if Sender is TPanel then

jest tylko formalnie, gdyz jezeli podepniemy funkcje tylko pod panel to Sender zawsze bedzie TPanel.

0

Racja aaa. Dzieki wielkie, to takie proste i logiczne :D

0

With TA1(Sender) Do
begin
form1.memo1.lines.add(sender.name);
end;

Jest jeszcze prosciej o iel wiesz ze na pewno masz typ TA1, jesli mogą być różne to lepiej poprzednim IFem

0

wszystko ładnie ale odpowiedzcie mi prosze jak odwołać sie do zdarzenia przypisanego komponentowi niewidocznemu na formie a dokładnie TShellChangeNotifier, tworzę takie 3 komponenty, przypisuję im w pętli zdarzenie "Klikam" i w tym momencie procedura "Klikam" jest wywołana gdy w obojętnie którym komponencie zdarzenie wystapi czyli
dla ShellChangeNotifier[1] jest Klikam
dla ShellChangeNotifier[2] jest Klikam
i dla ShellChangeNotifier[3] też jest Klikam a chcę rozróżnić te zdarzenia, że jeżeli wystąpi Klikam w [1] to robi co innego a jeżeli w [2] to co innego itd...

??

jeśli można to zrobić na Tagach to poproszę o rozwiązanie, nie potrafie sobie z tym poradzić a pewnie dla wtajemiczonego w temat programisty to minuta i będę znał odpowiedź

dziękuję

0

W pętli przypisz im też Tag'a równego indeksowi tablicy. A potem zrób:

If (Sender is TShellChangeNotifier) then
Case (Sender as TShellChangeNotifier).Tag of
1 :
2 :
3 :
end;

Oczywiście można rzutować na mniej szczegółowy typ, w zasadzie na taki który ma właściwość tag i jest najwyżej w hierarchii dziedziczenia, ale tak też będzie działać.

0

byłoby dobrze gdyby nie to że jak napiszę

procedure Klikam(Sender: TObject);

to pozniej przy

CN[i].OnChange:=Klikam;

kompilator pisze że brakuje parametrów (Parameter lists differ)

wspomóż

i co bobik, zamuliłeś i nie chcesz sie wykazać
a szkoda

0

Nie wiem jak inni ale ja tu nie piszę żeby się wykazać - więc sobie daruj. Dałem Ci kawe na ławe jak masz to zrobić, jak nie potrafisz tego wykorzystać ...

Wklej więcej kodu, generalnie moja odpowiedź jest taka że coś robisz źle skoro nie działa : )

Co to jest CN, domyślam się że tablica ale czego ? Poza tym jak chcesz podpiąć do czegoś procedure zadarzeniową, to muszisz pamiętać że musi być ona zdefiniowana jako procedura jakiegoś obiektu.

procedure Klikam(Sender: TObject) of object; <-- i być może tu właśnie tkwi przyczyna problemu.

0
b0bik napisał(a)

Nie wiem jak inni ale ja tu nie piszę żeby się wykazać - więc sobie daruj. Dałem Ci kawe na ławe jak masz to zrobić, jak nie potrafisz tego wykorzystać ...

Wklej więcej kodu, generalnie moja odpowiedź jest taka że coś robisz źle skoro nie działa : )

Co to jest CN, domyślam się że tablica ale czego ? Poza tym jak chcesz podpiąć do czegoś procedure zadarzeniową, to muszisz pamiętać że musi być ona zdefiniowana jako procedura jakiegoś obiektu.

procedure Klikam(Sender: TObject) of object; <-- i być może tu właśnie tkwi przyczyna problemu.

CN to TShellChangeNotifier z zakładki Sample w D7, komponent niewidoczny na formie, jest ich 9 ale zrobiłem tu 2 dla uproszczenia


procedure Aktualizacja(Sender: TObject);

var
CN: array[1..2] of TShellChangeNotifier;
Memo: array[1..2] of TMemo;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i:=1 to 2 do
  begin
  CN[i]:=TShellChangeNotifier.Create(Self);
  CN[i].OnChange:=Aktualizacja;   // !!!!!!!!!! TU JEST BŁĄD że "Parameter lists differ" !!!!!!!!!
  CN[i].WatchSubTree:=True;
  CN[i].Tag:=i;
  CN[i].NotifyFilters:=[nfFileNameChange, nfDirNameChange, nfAttributeChange, nfSizeChange, nfWriteChange];
  CN[i].Root:=IncludeTrailingBackslash(ExtractFileDir(ParamStr(0)))+'Brak';

  Memo[i]:=TMemo.Create(Self);
  Memo[i].Parent:=Form1;
  Memo[i].ReadOnly:=True;
  Memo[i].ScrollBars:=ssVertical;
  Memo[i].Height:=250;
  Memo[i].Width:=100;
  Memo[i].Left:=6;
  Memo[i].Top:=33;
  end;
end;

procedure TForm1.Aktualizacja;
begin
if (Sender is TShellChangeNotifier) then
  Case (Sender as TShellChangeNotifier).Tag of
  1 : Memo[1].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  2 : Memo[2].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  end;
end;
0

Nie powinno być przypadkiem tak?

procedure Aktualizacja(Sender: TObject);

begin
if (Sender is TShellChangeNotifier) then
  Case (Sender as TShellChangeNotifier).Tag of
  1 : Memo[1].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  2 : Memo[2].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  end;
end;
0
sesef napisał(a)

Nie powinno być przypadkiem tak?

procedure Aktualizacja(Sender: TObject);

begin
if (Sender is TShellChangeNotifier) then
  Case (Sender as TShellChangeNotifier).Tag of
  1 : Memo[1].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  2 : Memo[2].Lines.Add(FormatDateTime('dd.mm', Date)+' /  '+FormatDateTime('t', Time));
  end;
end;

wstawiłem tak jak podałeś i NIC to nie zmienia, ten sam błąd

0

Zdebuguj ten kod, zobacz czy się w ogóle wywołuje. Sprawdź zawartość Sender`a (AddWatch w trybie debug)

0
Deti napisał(a)

Zdebuguj ten kod, zobacz czy się w ogóle wywołuje. Sprawdź zawartość Sender`a (AddWatch w trybie debug)

zrobiłbym to gdyby nie fakt że nie wiem o czym do mnie napisałeś, poszperam później za tym AddWatch'em

0

Ech... To ma być metoda obiektu, a więc nagłówek mniej więcej taki:

procedure TForm1.Aktualizacja(Sender: TObject);

A w deklaracji klasy TForm1 dopisujesz

procedure Aktualizacja(Sender: TObject);
0
brodny napisał(a)

Ech... To ma być metoda obiektu, a więc nagłówek mniej więcej taki:

procedure TForm1.Aktualizacja(Sender: TObject);

A w deklaracji klasy TForm1 dopisujesz

procedure Aktualizacja(Sender: TObject);

tak właśnie mam i cały czas ten sam błąd, Parameter lists differ (różnica w liście parametrów)

CN to TShellChangeNotifier z zakładki Sample

for i:=1 to 3 do
  begin
  CN[i]:=TShellChangeNotifier.Create(Self);
  CN[i].OnChange:=Aktualizacja;   // !!! BŁĄĄĄD
  CN[i].WatchSubTree:=True;
  CN[i].Tag:=i;
  end;

PEŁNA NAZWA BŁĘDU:
" Incompatible types: Parameter lists differ "

jak wcisne nawias za słowem Aktualizacja w tym kodzie to wyskakuje " Sender: TObject " jako ta minipomoc, wiemy o co chodzi, CodeInside, może trzeba coś w nawiasie wpisać?
CN[i].OnChange:=Aktualizacja(??);
chociaż wątpie

JESZCZE COŚ, DOPIERO ZAUWAŻYŁEM, że po napisaniu
CN[i].OnChange:=
i wciśnięciu CTRL+SPACJA wyskakuje CodeInside ale bez procedury Aktualizacja, nie ma jej tam to znaczy że coś innego jest nie tak !! Inne własne moje procedury widać a tej nie widać !! ?!?

pozdro dla Wro, zajebi.tego miasta

0

Pełna nazwa błędu po polsku: Lista parametrów się różni. Wstaw może to, co Delphi generuje automatycznie jak dodasz zdarzenie OnChange przez projektata formularzy. Niestety mam Turbo Delphi i nie mam tam TShellChangeNotifier.

0

Sprawdź sobie listę parametrów zdarzenia OnChange jak go wygenerujesz ręcznie (wstaw sobie komponent na formatke i w IO kliknij dwukrotnie przy OnChange z zakładce Events), może tam idzie nie tylko Sender - to raz. A dwa żeby było jasne procka Aktualizacja, albo musi być metodą jakiejś klasy np (TForm1), a jeśli ją deklarujesz "luzem" poza klasą, to musi to być procka z dopiskiem "of object".

0

okej, ściągnąłem sobie TShellChangeNotifier (mam nadzieję, że to to samo)

Name : TShellChangeNotifier Component (NonVisual)</li> Version : 1.50</li> Author : Oliver Killguss</li> Copyright : ©2002-2006 by Oliver Killguss</span> </li> </ul>

A w nim:

TShellChange = procedure of object;

0
procedure TForm1.Aktualizacja;
begin
if (Sender is TShellChangeNotifier) then
Case (Sender as TShellChangeNotifier).Tag of
1 : Memo[1].Lines.Add(FormatDateTime('dd.mm', Date));
2 : Memo[2].Lines.Add(FormatDateTime('dd.mm', Date));
3 : Memo[3].Lines.Add(FormatDateTime('dd.mm', Date));
end;
end;

okazuje się że nie trza sendera stosować ale teraz, jak ktoś wie to poproszę o wsparcie, bo kompilator pokazuje że Sender nie jest zadeklarowany w tej linijce
if (Sender is TShellChangeNotifier) then ....
jak inaczej można się odwołać żeby rozróżnić zdarzenia kilku CN'ów ?

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