DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

メソッドリストでけた。


    !      _____________
   ∧,,∧    /
  ミ,,゚Д゚彡 < でけた!
  ミ.,,O),,.ミ   \
 @ミ   ミ       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ∪''∪ 


時々、プログラムがうまくいくこともあれば、
猛烈にうまくいかないこともあります。

今日は、うまくいった話。

そして、いつかどこかで、Delphiユーザーの役に立つ内容。




ThinkPadキーカスタマイズソフトのところで、出ているように、

SetHotKeyToOS関数は、番号とキーを登録しなければいけません。
プログラム上からX番を指定したら
WMHOTKEYメッセージがきたときに、X番に対応したコードを動かすという
ことをするわけですが、
この番号がやっかいというか、何番、てなことを意識してプログラムを書きたくないです。

ということで、リスト化して
・あるキー、Aを登録
・キーAの時の動作を登録
・あるキー、Bを登録
・キーBの時の動作を登録
・あるキー、C登録
・キーCの時の動作を登録

と、やりたいな、と思って、TSetHotKeyクラスというものを作ってみました。
リスト化して
SetHotKey.RegistorHotKeyを繰り返すと、自動で番号を振ってくれるようにすると、
いいかな、と思いまして。
これで、UnregistorもSetHotKey.Free時にやれば、楽でしょう。

ところが、ここでやっかいな問題にきがつきました。
・キーAの時の動作を登録
ん?これって結構、メソッドリストな機能がいるんじゃないの?

そうですね。
いままで、WMHOTKEY内部で処理していた処理を、メソッドとして書き
それを、リスト化して管理する必要があるようでした。

そこが、面倒な気がしましたが、その面倒さを上手に処理すれば
逆に楽な気もします。

Delphiには標準でメソッドリストなんて用意されてません。.NETなら、イベントのデリゲートという
仕組みがあるようですが、いまのところ、私は詳しくしりません。
このようなガジェットソフトを、.NETで作り直すなんて選択も私にはないので
(.NETではDelphiネイティブの高速さにはかなわない)

ということで、メソッドリストを作ってみようと!
気合い入れてみたのですが、これがあっさりできてしまいました。

前から、様々な型に対するリストを
ジェネリクスなど使わずに(ジェネリックス?)
実現する方法を、私は作ってまして。

[Delfusa TemplateList]で検索してもらえると見えてくると思うのですが、
・ ClassList.inc.pas
  クラスリストの基本コード
  includeして使用する

・ RecordList.inc.pas
  レコードリストの基本コード
  includeして使用する

-◇RecordList.inc.pas
│├◆PointList.pas
│├◆RectList.pas
│-◇NumericList.inc.pas
││├◆IntegerList.pas
││└◆RealList.pas
│-◇CommonStringRecordList.inc.pas
││├◆StrinRecordList.pas
││└◆WideStringRecordList.pas
│└◆HogeList.pas
-◇ClassList.inc.pas
 ├◆StringClassList.pas
 └◆HogeClassList.pas

こんなものを作っているんですよね。
で、こいつの、RecordListに相乗りしてメソッドリストが実現できるというわけ。

unit MethodList;
interface
uses
Classes, //TList
 Types; //TPoint
type
 TProcedure = procedure of object;
 TRecord = TProcedure;
////////////////////////////////////////////////////////////
{$include RecordList.inc.pas}
////////////////////////////////////////////////////////////
 TMethodList = TRecordList;
implementation
function RecordEqual(const Value1, Value2: TRecord): Boolean; forward;
////////////////////////////////////////////////////////////
{$include RecordList.inc.pas}
////////////////////////////////////////////////////////////
//-------------------------------
//メソッドが一致するかどうか調べる関数
function SameMethod(const A, B: TMethod): Boolean;
begin
 if (A.Code = B.Code) and (A.Data = B.Data) then
  Result := True
 else
  Result := False;
end;
function RecordEqual(const Value1, Value2: TRecord): Boolean;
begin
 if SameMethod(TMethod(Value1), TMethod(Value2)) then
 begin
  Result := True;
 end else
 begin
  Result := False;
 end;
end;
initialization
finalization
end.

これで、
SetHotKeyクラスに、TMethodListを所有させて
それに、イベントのように作ったメソッドを、Addしていくと
順番通りに、メソッドが追加されていきます。

WMHotKey側が、こんな風に簡単に…
procedure TMainForm.WMHotKey(var Msg: TWMHotKey);
begin
SetHotKey.MethodList.Items[Msg.HotKey];
end;

これでメソッド実行が出来てしまいます。

なんぞや、応用がたくさんききそうな、メソッドリスト。
必要なら、お使いください。

…てっても、俺のライブラリを組み込まないと、なかなか使うのは難しそうですね。
ま。テンプレートリストを勉強にでも使ってください。

私も、レコードのポインタでのメモリ確保などは、2chで教えてもらって実装しました。

ということで、キーカスタマイズソフトは、さらに多くのキーを登録していくことも
容易になりました。

なかなか、ソースコード的には一般に見ないテクニックを作った美しいものになってきましたよ。
ソースの美しさから、機能美、にまでつながるといいんですけどね。
スポンサーサイト

| 未分類 | 23:30 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。