型について

解決


前忠  2006-05-29 01:15:44  No: 21882  IP: 192.*.*.*

以下のような型をよく見るのですが、それぞれの型はどういった時に使用するのか教えて頂けませんか?
HWNDはウィンドウハンドルを取得する時によく見るのですが、意味を理解せずに使用しています。
これを機に型の意味を理解したいと思いますので、ご教授お願いします。

・HWND
・THandle
・DWORD

編集 削除
うい  2006-05-29 05:06:28  No: 21883  IP: 192.*.*.*

型については、Delphiのヘルプ(IDEからF1キーで表示)
に詳細に記載されていますので、一読してみてください。
THandleや、HWNDも それらの基本型(integerやword)の別名
というか再宣言に過ぎません。

HWNDは、APIを利用する場合に使う慣習があります。
DWORDも同様に APIで慣習として利用します。
THandleは、Delphi固有のものや、そのVCLで使う慣習があります。

型が利用するサイズ(利用するバイト数)が同じであれば、
どの型を使っても不具合が起こることはなく、
キャストして(別の型をかぶせて)利用できます。

MSDNやAPIリファレンス等のドキュメントに記載されている型が
Delphiでも、そのまま利用できたほうがよい でしょうから
基本型を再宣言してそのような型が用意されているのだと思います。

編集 削除
Type  2006-05-29 05:07:15  No: 21884  IP: 192.*.*.*

どれも 4 bytes の符号なし整数です。
「名前」が違うのは、コンパイル時にエラーを報告させる、「変数の意味」として、
『バグよけ』にいいと思います。

procedure TForm1.FormCreate(Sender: TObject);
var
  TypeHWND: HWND;
  TypeTHandle: THandle;
  TypeDWORD: DWORD;
begin
  Memo1.Lines.Add('HWND : ' + IntTostr(SizeOf(HWND)) + ' bytes');
  Memo1.Lines.Add('THandle : ' + IntTostr(SizeOf(THandle)) + ' bytes');
  Memo1.Lines.Add('DWORD : ' + IntTostr(SizeOf(DWORD)) + ' bytes');

  // マイナス値を代入する場合は、それぞれ符号なし整数なのでキャストする。
  // (こんな使い方は普通しませんが・・・)
  TypeHWND := HWND(-1);
  TypeTHandle := THandle(-1);
  TypeDWORD := DWORD(-1);

  TypeHWND := TypeTHandle;   // キャストしなくても代入可。
end;

編集 削除
Type  2006-05-29 05:14:02  No: 21885  IP: 192.*.*.*

あれっ、
>  TypeHWND := TypeTHandle;   // キャストしなくても代入可。
・・・と言うことで、
>「名前」が違うのは、コンパイル時にエラーを報告させる、
にはならんですね。単に「(人間への)意味」だけか・・。。
思い違いしてました。

編集 削除
そうですね  2006-05-29 05:28:12  No: 21886  IP: 192.*.*.*

整数型同士ならキャストの必要はありませんでしたね。
符号の有る無しで警告が出るぐらいですかね。

編集 削除
前忠  2006-05-29 22:07:36  No: 21887  IP: 192.*.*.*

みなさん返信ありがとうございます。

>MSDNやAPIリファレンス等のドキュメントに記載されている型が
>Delphiでも、そのまま利用できたほうがよい でしょうから
>基本型を再宣言してそのような型が用意されているのだと思います。
なるほど、DelphiではAPIの型と合わせて、以下のような型が用意されているのですね。
よく理解出来ました。ありがとうございました。

[Delphi]    [API]
HWND        HWND
THandle     HANDLE
DWORD       DWORD

編集 削除