DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

そこで!クラスヘルパーー♪ーー(ドラえもん風)

さーって、少しネタ的に戻ってクラス型(?)ライブラリについてです。

命名から変だと思いますか?

黙っててください。



          || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
          || KYは         ∧,,∧ テスト出ますよ
          || クウキ嫁の略 \ ミ゚Д゚,,ミ
          ||________⊂ ⊂ ,,ミ
  ∧,,∧    ∧,,,∧    ∧,,∧    ...| ̄ ̄ ̄ ̄|
  ミ  ∧,,∧ ミ   ∧,,∧ ミ  ∧,,∧. |教授  .│
~(_ミ  ∧,,∧ __ミ  ∧,,∧__ミ   ∧,,∧ ̄ ̄ ̄
  ~(_ミ  ∧,,∧__.ミ  ∧,,∧__ミ ∧,,∧  はい、教授。
    ~( ,,ミ   ,,ミ~(,,,,ミ  ,,ミ~(_ミ   ,,ミ
      ~(___ノ  ~(___ノ   ~(___ノ


さて、何回か前のwith TClass.Create do
ここから、また、続きまして、
with Create do begin ... end
この構文を使ってライブラリを構築しようぜという試みです。

単純なprocedure やfunction ではなくクラス上のメソッドとして実装していきましょう。
そして、それを実装していくときに、クラスメソッドだけじゃなくて
普通のメソッドとして実装したとしても
一時変数なんていらないから、withでくくっちまえよ!こんちくしょーー、って企画立案です。


あたまをひねってみると(ひねらなくても、通りすがりさんに指摘されるように)
生成したインスタンスそのものを何かに投げ込みたい場合があります。

つまり、
var StrList: TStringList;
begin
 StrList := TStringList.Create; try
 StrList.Text;
 MyFunction(StrList);

 finally StrList.Free; end;
end;
こうしたい場面がある、ということですな。

よくあると思います、実際。

だから、with構文は使えない!、そう思ってますね!
そこの!


     ∧,,∧ アナタ
    ミ,,゚Д゚ミ  
   ⊂   ○m
    ミ、,, ミ,   ビシッ!!
     .しヾJ



それでも、with TStringList.Create do try ですよ!

Let's TRY っす!





         try と TRY をつなげてみた,,,,

  ∧,,∧l||l   ツマンナすぎるギャグ
  ミ,,  彡  書いてて
 ミ   ∪   ほんとに寒くなった....
 ミ~,, ミ
  ∪ ∪ 

 冬で寒いから、こういうの、、ヤメとこ、、、




気を取り直して生きましょう。

従来のやり方の例として、こんなのを書いてみました。

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Clear;
 Memo1.Lines.Add('ABC');
 Memo1.Lines.Add('DEF');
 Memo1.Lines.Add('GHI');
end;

procedure ShowMessageStrList(List: TStrings);
begin
 ShowMessage(
  'First:'+List.Strings[0] + #10 +
  'Last:'+List.Strings[List.Count-1]);
end;

procedure TForm1.Button8Click(Sender: TObject);
var StrList: TStringList;
begin
 StrList := TStringList.Create; try
 StrList.Text := Memo1.Text;
 ShowMessageStrList(StrList);
 finally StrList.Free; end;
end;

メッセージの出力結果は、最初と最後の行を表示するから
当然こうなりますよね。
  First:ABC
  Last:GHI

これを、with Create do で行うマジックです。

type
 TTarget = TStringList;
 TReturnInstance = class helper for TTarget
  function Instance: TTarget;
 end;

function TReturnInstance.Instance: TTarget;
begin
 Result := Self;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
 with TStringList.Create do try
 Text := Memo1.Text;
 ShowMessageStrList(Instance);
 finally Free; end;
end;

どう?


これで同じように動きますよ。D2006以降。


ここ見て簡単にコピペでできちゃったよ!
Delphi 7以降の言語およびコンパイラの新機能

TStringListにInstanceっていうメソッドが追加されています。
継承もしてないしキャストもしなくてよいのは、クラスヘルパーのおかげです。
※TTargetを使っているのは、コピペしやすいようにしているだけです。

なんだか、これ書きやすくない?

Button8とButton9のイベントハンドラの実装を見比べてみてください。



自分でライブラリを作る場合はクラスヘルパーに頼らずに
普通にInstanceメソッドを実装しておく。これはよいでしょう。

そして、他人のライブラリを使う場合
それがVCLで提供されているTStringListでも
クラスヘルパーを記述する。

そういう準備をしておけば
with Create do の記述で使うことに何の問題もない。ってわけですよ。


また、あなたのコーディングスタイルを変えてしまいましたね。


    ∧,,∧   フォーフォッ
  (V)ミ,,゚д゚彡(V)   フォッ
   ヽミ  ミノ  フォッ 
  @ミヨ|Eミ     フォー
    ∪''∪  
  バルタン 


そしてDelphi言語で書きやすく。

※個人的にはDelphiPascal言語って呼ぼうと思います。
スポンサーサイト

| 未分類 | 23:46 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/106-b6c9bd85

TRACKBACK

PREV | PAGE-SELECT | NEXT

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