(2015/01/01~)
2015/01/10

新年明けましておめでとうございます

…って、もう 10 日ですが (^^;A

こちらの雑談が滞ってますけれど、まぁこんな事もあります。


2015/01/12

過去の自分と今の自分

過去の雑談を読み返すと「なんちゅうコードを書いてるんだ」と思うことがある…いい意味と悪い意味とで。

"悪い意味" の方は単純にスキル不足な場合で「もう少し簡潔に書けるだろ?」というもの。"いい意味" の方は「どっからこの知識を引っ張り出してきたんだ?」というロストテクノロジー的なもの。常用しないので単に忘れているだけって場合もあるけれど、そうでないものもたまにある。

そういった意味では何でも備忘録的に書いておくというのは悪いことではないと再認識した。

Android x86 4.4-r2 リリース

正月早々にリリースされていた。Acer Aspire One with Android-x86 も更新してあるけれど Aspire One の場合、正直どこが変更になったのかさっぱり判らない…というか、RC2 の時点でほぼ不具合はなかったんだよなぁ。

EasyLINQ 1.41 リリース (Delphi Programming)

去年リリースされていた。XE6 に対応しているので、XE7 でも動作すると思われる。使い方の概要については過去の雑談を参照の事。

Delphi でのメソッドチェーン (Delphi Programming)

EasyLINQ の概要で書いた "メソッドチェーン" を説明していなかったので今更ながら補足。

Delphi だと高度なレコード型があるので簡単に試す事ができる。要は自身と同じ型を戻り値に設定したメソッドを用意すればいいのだ。

  { TChainSQL }
  TChainSQL = record
    SQL: string;
    function SELECT(aSELECT: string): TChainSQL;
    function FROM(aFROM: string): TChainSQL;
    function WHERE(aWHERE: string): TChainSQL;
    function GROUP_BY(aGROUP: string): TChainSQL;
    function ORDER_BY(aORDER: string): TChainSQL;
    function HAVING(aHAVING: string): TChainSQL;
    function UNION(aUNION: string): TChainSQL;
    procedure Init;
    function Term: string;
  end;

出落ちに近いが、このレコードの実装部はこうなる。

{ TChainSQL }

function TChainSQL.FROM(aFROM: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' FROM %s', [aFROM])
end;

function TChainSQL.GROUP_BY(aGROUP: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' GROUP BY %s', [aGROUP])
end;

function TChainSQL.HAVING(aHAVING: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' HAVING %s', [aHAVING])
end;

procedure TChainSQL.Init;
begin
  Self.SQL := '';
end;

function TChainSQL.ORDER_BY(aORDER: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' ORDER BY %s', [aORDER])
end;

function TChainSQL.SELECT(aSELECT: string): TChainSQL;
begin
  Result.SQL := Format('SELECT %s', [aSELECT])
end;

function TChainSQL.Term: string;
begin
  Result := Self.SQL + ';';
end;

function TChainSQL.UNION(aUNION: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' UNION %s', [aUNION])
end;

function TChainSQL.WHERE(aWHERE: string): TChainSQL;
begin
  Result.SQL := Self.SQL + Format(' WHERE %s', [aWHERE])
end;

すると、こんなコードが書けるようになる。

procedure TForm1.Button1Click(Sender: TObject);
var
  Dmy: string;
  SQL: TChainSQL;
begin
  Dmy := SQL.SELECT('*').FROM('TABLE_TEST').WHERE('CODE = 1').ORDER_BY('CODE').Term;
  ShowMessage(Dmy); // SELECT * FROM TABLE_TEST WHERE CODE = 1 ORDER BY CODE;
end;

コード補完も利く。複数のレコードを用意すれば「この文の後にこれは続かない」というのもやれない事はない。RTL だと TStringBuilder がメソッドチェーンに対応している (Append() / Insert() / Remove() 等)。


2015/01/13

Delphi の共用体 (Delphi Programming)

Delphi にも共用体はあります。ドキュメントのトピックは "レコードの可変部分" です。共用体を手っ取り早く理解するには、(System.)SysUtils にある LongRec 構造体を眺めてみるのがいいでしょう。

  LongRec = packed record
    case Integer of
      0: (Lo, Hi: Word);
      1: (Words: array [0..1of Word);
      2: (Bytes: array [0..3of Byte);
  end;

値を WORD でも Byte でもアクセスできるようになっています。ただ…

  TDWORDRec = 
    packed record
    case Byte of
      0: (Value: DWORD);
      1: (Lo, Hi: Word);
      2: (Words: array [0..1of Word);
      3: (Bytes: array [0..3of Byte);
    end;

何故こうなっていないのか理解に苦しみますが。ともあれ、共用体を使うと以下のようなアクセスが可能になります。

procedure TForm1.Button1Click(Sender: TObject);
var
  DWORDRec: TDWORDRec;
begin
  DWORDRec.Value := $11223344;

  ShowMessage(IntToHex(DWORDRec.Value, 4)); // DWORD

  ShowMessage(IntToHex(DWORDRec.Lo, 2)); // Lo-Word
  ShowMessage(IntToHex(DWORDRec.Hi, 2)); // Hi-Word

  ShowMessage(IntToHex(DWORDRec.Words[0], 2)); // LoWord
  ShowMessage(IntToHex(DWORDRec.Words[1], 2)); // Hi-Word

  ShowMessage(IntToHex(DWORDRec.Bytes[0], 1));
  ShowMessage(IntToHex(DWORDRec.Bytes[1], 1));
  ShowMessage(IntToHex(DWORDRec.Bytes[2], 1));
  ShowMessage(IntToHex(DWORDRec.Bytes[3], 1));
end;

これでも使い勝手がよくないので TBitFieldRec を書くハメになりました (^^;A

それはともかくとして、Delphi では共用体をもう一つの方法で実現できます。ポインタにしてキャスト?いえいえ、本当にもう一つの方法が用意されています。

procedure TForm1.Button2Click(Sender: TObject);
var
  Value: DWORD;
  Words: array [0..1of Word absolute Value;
  Bytes: array [0..3of Byte absolute Value;
begin
  Value := $11223344;

  ShowMessage(IntToHex(Value, 4)); // DWORD

  ShowMessage(IntToHex(Words[0], 2)); // LoWord
  ShowMessage(IntToHex(Words[1], 2)); // Hi-Word

  ShowMessage(IntToHex(Bytes[0], 1));
  ShowMessage(IntToHex(Bytes[1], 1));
  ShowMessage(IntToHex(Bytes[2], 1));
  ShowMessage(IntToHex(Bytes[3], 1));
end;

それがこの absolute 指令です。ドキュメントには "絶対アドレス" というトピックで掲載されています。

UNI 232C 通信 コンポーネント (Delphi Programming)

前回のデブキャンでも利用させて頂いた RS-232C コンポーネントがパワーアップしました。Android で試す前に Windows でデバッグする事ができるようになっています。大抵のシリアル USB 変換チップに対応!


2015/01/21

AV のアドレスからソースコードでのエラー位置を知る (Delphi Programming)

現在ではイロイロなデバッグツールがありますので今更感は拭えませんが、以前作った AV アドレスからソースコードのエラー位置を特定するツールです。どれだけの需要があるのかはわかりませんが、体裁を整えてアップしてみました。

DownLoad: GetAVPos

 

簡単な使い方はフォーラムの方に書いておきましたのでご一読ください。

一般的なデバッグ手法については、21th デベロッパーキャンプの細川さんのセッションを参考にしてください。


2015/01/22

IBLite (Delphi Programming)

XE7 に含まれる IBLite はモバイルだけではなく、Windows / OS X にも対応しているとの事です。

DB サイズが 100MB 以内という制限があるものの、ちょっと DB を使いたい時には便利そうですね。MyBASE と違い SQL が使えますし…。

IBLite の実体は C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE3 にあります。ToGo となっているのが IBLite です。恐らくライセンスファイルの違いで ToGo / IBLite が切り替わるのだと思われます。

See Also:

Windows 10

Windows 7 / 8.1 からの無償アップデートが予定されているとの事。また、Windows 10 では Xbox のソフトが動作する模様。

See Also:


 BACK   古いのを読む   新しいのを読む