2013-08-14 10 views
5

Mam formularz z niektórych składników, które mają obsługi zdarzeń. Teraz chciałbym przenieść te procedury obsługi zdarzeń (te metody) do oddzielnej jednostki, która wciąż może przydzielać je do zdarzeń komponentu za pomocą Inspektora Obiektów w czasie projektowania.Jak utworzyć oddzielną jednostkę dla metod zdarzeń, które IDE pozwala mi przypisać do zdarzeń komponentu w czasie projektowania?

Czy można utworzyć oddzielną jednostkę tylko dla metod zdarzeń, aby Inspektor obiektów zezwolił na przypisanie ich w czasie projektowania?

Powiedzmy, jeśli chciałbym zrobić tę jednostkę z procedurą publicznego:

unit Unit2; 

interface 

procedure ButtonClick(Sender: TObject); 

implementation 

procedure ButtonClick(Sender: TObject); 
begin 
    // do something here 
end; 

end. 

Albo z klasą z opublikowanego sposobu jak ten:

unit Unit2; 

interface 

type 
    TMyClass = class 
    published 
    procedure ButtonClick(Sender: TObject); 
    end; 

var 
    MyClass: TMyClass; 

implementation 

{ TMyClass } 

procedure TMyClass.ButtonClick(Sender: TObject); 
begin 
    // do something here 
end; 

end. 

Jak zrobić oddzielną jednostkę do metod zdarzeń , które IDE pozwala mi przypisać do zdarzeń komponentowych w czasie projektowania? Jak na przykład:

enter image description here

+4

OK. Śmiało. Co powstrzymuje cię przed zrobieniem tego? –

+0

Nie mogę przypisać tego zdarzenia w Button w czasie projektowania. Czy masz jakiś przykład? – user2683734

+5

To wstyd, że to pytanie zostało wstrzymane, po pierwsze dlatego, że jest całkiem jasne, o co pyta PO, a po drugie, fakt, że uniemożliwiło to komukolwiek dostarczenie wyjaśnienia (co jest zrozumiałe dla początkującego), który wymaga więcej miejsca komentarz na to pozwala. – MartynA

Odpowiedz

4

Większość zdarzeń są wskaźniki metoda. Oznacza to, że wskazują na procedurę lub funkcję w klasie. Więc nie można po prostu dołączyć procedurę Unit2.ButtonClick do kontroli na zdarzenia Click przycisku, ale może napisać klasy, która implementuje obsługi zdarzeń, coś takiego:

type 
    TMainFormButtonEventHandler = class 
    procedure ButtonClick(Sender: TObject); 
    end; 

procedure TMainFormButtonEventHandler.ButtonClick(Sender: TObject); 
begin 
    ShowMessage('Clicked'); 
end; 

Teraz można tworzyć takie obiekt i link do zdarzenia:

handler := TMainFormButtonEventHandler.Create; 
Form1.Button1.OnClick := handler.ButtonClick; 

Nie sądzę, że jest to najlepsza struktura aplikacji. Nie używałbym elementów GUI formularza spoza jednostki formularza. Ale jeśli chcesz to zrobić, tak to się robi.

Jeśli szukasz separacji GUI i logiki, spójrz na działania. Nakładka (zawinięta w listę akcji) jest pierwszą warstwą między komponentem GUI, jak przycisk i kod akcji, który wykonuje.

Wygodne jest to, że można je również tworzyć w czasie projektowania i dołączać je do przycisku lub innego elementu sterującego. Zamiast pisać kod dla ButtonClick, piszesz kod dla ActionExecute (zdarzenie OnExecute akcji). Przycisk wie, że po kliknięciu powinien wykonać powiązane działanie.

+0

Przepraszam, jestem nowicjuszem w delphi .. ale gdzie umieścić ** handler: = TMainFormButtonEventHandler.Create; ** ** Form1.Button1.OnClick: = handler .ButtonClick; *** – user2683734

+0

To zależy. Gdzieś w kodzie inicjalizacji aplikacji, ale tak czy inaczej jest to rozwiązanie uruchomieniowe, a nie rozwiązanie oparte na czasie projektowania, o które prosiłeś.Myślę, że najbliższym rozwiązaniem w czasie projektowania jest użycie działań, tak jak to opisałem na dole mojej odpowiedzi, chociaż nie jest to rozwiązanie typu "drop-in" dla każdego zdarzenia – GolezTrol

+0

dziękuję za pomoc – user2683734

Powiązane problemy