DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

TStringConvert = record


   ∧,,∧    そーーいえば
  ミ,, ゚Д゚彡   鍋の季節ですか。
   〃つ旦O
 ~ミ,,[ ̄ ̄ ̄.]
      ̄ ̄ ̄

さて、というわけで
TStringConvert = record を実装してみましたぞ。


type
 TStringConvert = record
  strict private
   FText: String;
   FToInt: Integer;
   FToIntExists: Boolean;
  procedure SetText(const Value: String);
  public
   property Text: String read FText write SetText;
   constructor Create(S: String);
   function CanToInt: Boolean;
   function ToInt: Integer;
 end;

{ TStringConvert }

constructor TStringConvert.Create(S: String);
begin
 SetText(S);
end;

procedure TStringConvert.SetText(const Value: String);
begin
 FText := Value;
 FToIntExists := False;
end;

function TStringConvert.CanToInt: Boolean;
begin
 if TryStrToInt(FText, FToInt) then
 begin
  Result := True;
  FToIntExists := True;
 end else
 begin
  Result := False;
  FToIntExists := False;
 end;
end;

function TStringConvert.ToInt: Integer;
begin
 if FToIntExists then
 begin
  Result := FToInt;
 end else
 begin
  Result := StrToInt(FText);
 end;
end;

Unit1.pasのimplementation部に貼り付けてみてもらってOK

Privateだと、同一ユニット内だと見え見えなので
strict privateを使ってみました。
これで、FTextは同一ユニット内の
ボタンイベント部分からでもみえません。

簡単だけど、上手に、キャッシュを使っているのがわかりますかい?
FToIntExistsがTrueの時にはToIntに値が確保されている、
つう仕組みです。

使ってみましょう。

procedure TForm1.Button1Click(Sender: TObject);
var
 sc: TStringConvert;
begin
 sc := TStringConvert.Create('123456');
 if sc.CanToInt then
 begin
  ShowMessage('FToIntが使われます:'+sc.Text);
  SpinEdit1.Value := sc.ToInt;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 sc: TStringConvert;
begin
 sc.Text := '123';
 if sc.CanToInt then
 begin
  ShowMessage('FToIntが使われます:'+sc.Text);
  SpinEdit1.Value := sc.ToInt;
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 sc: TStringConvert;
begin
 sc.Text := '321';
 ShowMessage('FToIntは使われません:'+sc.Text);
 SpinEdit1.Value := sc.ToInt;
end;

CanToIntを使った場合は内部でFToIntが使われるのですよ。
Button2Clickの実装なんて、なかなか書きやすくない?


さてさて、メソッドを持てるrecord型という部分でみてみますと
(進化したDelphiの言語機能をつかっている奴もそれほど多くはいますまい?)


コンストラクタCreateは特に呼ぶ必要がないようですね。
単なる1メソッドなのかしら。

上記の場合
 sc := TStringConvert.Create('123456');
というのは
 sc.Create('123456');
と、等価なのかな?
それとも入れ物が二つつくられてるのか?

うむむ?
要調査です ょぅ (y・д・)y ょぅ

recordの新機能はこちらで報告が多いのですね。
第一種臨界不測日記
今まで、TOBYさんとこ、TOBY SOFT Wikiしか更新チェックしてなかた!


    ∧,,∧    こっちを
    ミ゚Д゚,,彡  お気に入り登録
   φ  ⊂ミ    しとかんとな、、、
  [ ̄ ̄ ̄],,ミ ~
   ̄ ̄ ̄

スポンサーサイト

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

COMMENT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/103-90d9d0c9

TRACKBACK

PREV | PAGE-SELECT | NEXT

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