Obsługa komunikatów przez formę utworzoną dynamicznie

Obsługa komunikatów przez formę utworzoną dynamicznie
JD
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:16
0

Lazarus 2.0.10

Kopiuj

type
  TMojaClasa = class
  private
    procedure WmLButtonDown(var Msg : TMessage); message WM_LBUTTONDOWN;
  public
    function  MojaFunkcja(<parametry>): <typ_zwracany>;
  end;

var
  MojaForma : TForm;

implementation

procedure TMojaClasa.WmLButtonDown(var Msg : TMessage); 
begin
...
end;

function TMojaClasa.MojaFunkcja(<parametry>): <typ_zwracany>;
begin
  MojaForma := TForm.Create ...
end

po utworzeniu instancji MojaForma chciałbym przypisać jej procedurę obsługi w/w komunikatu
(aby reagowała ona na jego wystąpienie) tylko .... nie mam pojęcia jak to zrobić.

Proszę o pomoc

edytowany 1x, ostatnio: cerrato
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99987966)
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:24 minuty
  • Postów:1595
2

masakra tworzysz klasę (TMyClass), w której tworzysz formę, której chcesz przypisać procedurę z tej klasy (TMyClass) ... masło maślane.

Jeśli dobrze Cię zrozumiałem to masz swoją klasę TMyClass, w której coś się będzie działo. Gdy to się wydarzy to na MojaForma ma się coś zadziać samoistnie. Jeśli o to chodzi to prawdopodobnie chcesz zrobić swojego rodzaju eventa. Nie jestem pewien jak w lazarusie ale w Delphi robi się to poprzez procedure of object. Musisz zatem do swojej klasy TMyClass stworzyć property do którego przypiszesz fizycznie metodę z formatki lub na odwrót gdy coś się na formatce zdarzy to tworzysz property na formie i do niej przypisujesz procedurę z TMyClass Przykład dla formy:

Kopiuj
type
  TOnPlayChange = procedure(const pStart, pStop, pPlay: Int64) of object;

TMyClass = class(TForm)
strict private
        FOnPlayChange: TOnPlayChange;
public
        property OnPlayingChange: TOnPlayChange read fOnPlayChange write fOnPlayChange;
end;

Przy tworzeniu instancji formy robisz tak:

Kopiuj
varMyForm := TMyForm.Create(Self);
varMyForm.OnPlayingChange :=  OnCopyProcedure 

i wywołanie

Kopiuj
if assigned(FOnPlayChange) then
   FOnPlayChange(0,10,2);
edytowany 1x, ostatnio: woolfik
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Tuchów
  • Postów:12167
1

Jeśli chodzi o obsługę komunikatów, to schemat zastosowany przez Ciebie — @jw_developer — wykorzystuje się wtedy, gdy obsługa danego komunikatu nie jest zaimplementowana w klasie kontrolki. Załóżmy, że jest sobie komunikat LM_RECEIVEDATA (zmyślony) i chcesz dodać kod jego obsługi oraz zdarzenie z nim powiązane. Szablon dla tego wszystkiego wygląda tak:

Kopiuj
type
  TOnReceiveData = procedure(ASender: TObject; const AData: Integer) of object;

type
  TMyForm = class(TForm)
  private
    FOnReceiveData: TOnReceiveData;
  private
    procedure DoReceiveData(AData: Integer);
  protected
    procedure LMReceiveData(const AMessage: TLMessage); message LM_RECEIVEDATA;
  public
    property OnReceiveData: TOnReceiveData read FOnReceiveData write FOnReceiveData;
  end;

  procedure TMyForm.DoReceiveData(AData: Integer);
  begin
    if Assigned(FOnReceiveData) then
      FOnReceiveData(Self, AData);
  end;

  procedure TMyForm.LMReceiveData(const AMessage: TLMessage);
  begin
    DoReceiveData(AMessage.lParam);
  end;

W skrócie. LMReceiveData otrzymuje paczkę komunikatu i dane w niej zawarte wykorzystuje do dalszych operacji. W tym przypadku przekazuje liczbę zawartą w polu lParam do procedury wywołującej zdarzenie, czyli do DoReceiveData. Ta z kolei sprawdza czy zdarzenie jest w ogóle przypisane i jeśli tak, wywołuje je, przekazując własną referencję oraz dane w parametrach. I to wszystko.

Tak więc jeśli chodzi o obsługę własnego komunikatu lub takiego, którego obsługa w danej klasie nie istnieje, wykorzystuje się podany wyżej szablon. W Twoim przypadku, taki zabieg nie jest konieczny, dlatego że klasa formularza posiada już pełną obsługę komunikatu wciśnięcia lewego przycisku myszy, a także posiada zdarzenie wywoływane po otrzymaniu takiego komunikatu.

Implementacja obsługi zawarta jest w klasie bazowej (dokładnie w klasie TControl) pod postacią zdarzenia OnMouseDown, które oprócz dostarczenia informacji na temat tego, który przycisk został przyciśnięty, dorzuca także zestaw dodatkowych przycisków (takich jak Shift, Ctrl, Alt itd.) oraz współrzędne kursora. Tak więc jeśli chesz podłączyć własną metodę do klasy okna i przechwytywać kliknięcia, to zadeklaruj metodę zgodną parametrami z typem TMouseEvent i podłącz ją pod zdarzenie OnMouseDown, tuż po utworzeniu instancji klasy okna:

Kopiuj
type
  TMyForm = class(TForm)
  {..}
  end;

type
  TMainForm = class(TForm)
  private
    procedure HandleMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    procedure CreateMyForm();
  end;

  procedure TMainForm.CreateMyForm();
  var
    MyForm: TMyForm;
  begin
    MyForm := TMyForm.Create(Self);
    MyForm.OnMouseDown := @HandleMouseDown;
  end;

Pisane z palca, jakby co. ;)


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)