On〜と始まるイベント等に、オブジェクトインスペクタを使用せずにイベントをアサインするプログラムの書き方ってどうするんでしょうか?
例えば、TForm1のOnKeyUpに、DoSomethingというイベントをアサインする方法なのですが、
procedure DoSomething(Sender: TObject);
OnKeyup := DoSomething;
では、コンパイラエラーです。
すみませんが、教えていただけますでしょうか?
procedure TForm1.DoSomething(var Key: Word; Shift: TShiftState);
OnKeyup := DoSomething;
では、どうですか?
>procedure TForm1.DoSomething(var Key: Word; Shift: TShiftState);
訂正です。
procedure TForm1.DoSomething(Sender: TObject; var Key: Word; Shift: TShiftState);
igyさん。
すみません、私が書いたコードは適当にサンプルで書きました。
実際は下記のようなコードになります。
尚、書き忘れていましたがDLLのプログラムを作成しています。
procedure ErrorHandle(Sender : TObject);
begin
Error Handling
end;
Prt.OnPrinterError := ここにどうアサインするか?
OnPrinterError(Sender : TObject)は、Prt内の
property OnPrinterError:TNotifyEvent になります。
情報不足ですみませんでした。
イベントにも様々な型があり、
procedure DoSomething(Sender: TObject) は、
OnKeyUp のパラメータリストとは異なるので利用できません。
型を調べるには、
OnKeyUpのあたりにカーソルを置いて F1 キーでヘルプを
表示させてみれば分かります。
>procedure ErrorHandle(Sender : TObject);
オブジェクトで無いからではないでしょうか。
コレはやり方があった気がするけど
ちょっと忘れました。実験して調べてみます。
私は この方法しか分かりません。
@ や ^ を駆使して、出来たような気もするんですが、
今は思いつかない・・・。
procedure NonObjHandlerProc( paramators)
begin
Handling;
end;
を利用するには
どこかのクラスのメンバーに
type
//オブジェクトじゃない 関数型か手続き型の宣言をし
TNonObjectHandler = procedure( ***);
//それをクラス内部から呼び出すようにする
TSomeClass
private
FNonObjectHandler = TNonObjectHandler;
public
略
end;
constructor TSomeClass.Create()
begin
//オブジェクトじゃないハンドラのアサイン
FNonObjectHandler= TNonObjectHandler(NonObjHandlerProc);
end;
procedure TSomeClass.ObjectOfSomeEventHandler( paramators)
begin
//オブジェクトじゃないハンドラを呼び出す
FNonObjectHandler( parametors)
end;
オブジェクトであるハンドラは、オブジェクトであるハンドラにアサイン
Ptr.OnPainterError:= ObjectOfSomeEventHandler;
Ptr.OnPainterErrorの of object を外すという荒業も
考えられますが・・・。やったことは無いですね。
継承して of objectを外して しまうのはアリなのかな・・・。
む さん
ありがとうございます。
非常に難しいそうですが、頑張ってみます。
難しいことはないですよ。
イベントは、メソッドポインタを一つ設定・取得できるプロパティーです。
だから、たんに型を合わせたメソッド・関数などを代入するだけ。
ツイート | ![]() |