【データ名】C2Delphi.txt C->Delphi 移行メモ 【制作者名】裏目小僧 【内容紹介】 私がCから移行する時に作ったメモです。 ミスがあってもゴメンナサイね(^^; C,Delphi 対応表 ___C_____ _delphi___ sizeof wk SizeOf(wk) バイト数:Cでは演算子だがDelphiでは関数 p=malloc(size) GetMem(p,size) 指定バイト数のメモリ確保 p=new aa; new(p); 動的変数の確保(DELPHIクラス型は下) free(p); Dispose(p); p=new xx(a,b) p=クラス名.xx(a,b) constructor xx で定義してある事 delete p p.Free クラスの場合の開放 &ptr @ptr 又は Addr(ptr) 変数のアドレスを得る 手続きの時に意味が違う int *temp temp:^Integer ポインタ変数の定義 *temp temp^ ポインタ変数の示す中身 this Self クラス自身を示すポインタ (int)dt Integer(dt) 型キャスト(Delphiでは構造体にキャスト可) / div 整数割算(実数の場合は同じ) NULL nil ヌルポインタ func(&a) func(var a) aが参照渡である= aで値を関数から返せる ~a not a ビット反転 !(論理式) not (論理型) 論理反転 & | ^ and or xor ビット毎の論理式 && || and or 論理式(DELPHIには論理型有の為) << >> shl shr = := 代入 == != < > <= = <> < > <= >= 比較 ++p Inc(p) pは数値かPCHAR.マニュアルにないが^DWORD可 a+=10; Inc(a,10); /* */ { } 挟んだ範囲をコメントにする // // //以降をコメントにする 0xff $ff 16進 Delphiに8進数はなし "abc" 'abc' 文字列 "abc\n" 'abc'#13#10 制御文字を文字列に入れる場合 'a' ord('a') 文字を数字として扱う場合 *p=0x20 p^:=chr($20) 数字で文字コードを表現したい場合 /= *= <<= >>= <対応なし> DELPHIでは代入演算子は := だけ <対応なし> 集合型への+-* 集合型の和と差と積はDelphiだけ in is そのクラスに属するならTrue as nilかクラスに属しなければ例外発生 ----------- 制御 ------------------------------ ___C_____ _delphi___ label: label label,1; var 定義が終わった後のbegin の前でlabel定義 begin lb:; 1:; delphiでは数字だけでもラベルに出来る goto label; goto label; return; exit; { 複数文; }; begin 複数文; end; if(flg) 文; if flg then 文 delphiでelse がある時は 文の後に ; 付けない else 文; else 文; switch(n){ case n of delphiの方が高機能,defaultタイプミスがない case 1: 1: 1,2,3:のように複数 1..3:のように範囲可 default: else delphiで複数文を書く時はbegin end; } end; do { ... reapeat begin ... }while(f) end until not f ; while(f) { while f do begin ...} ... end; break; continue; delphiもcもほぼ同じ ----------- 型 ------------------------------ ___C_____ _delphi___ int a; a:Smallint; 16bit long a; a:longint; 32bit unsigned int a; a:WORD ; 16bit unsigned long a; a:DWORD ; 32bit CでもwindowsならDWORD型が良い unsigned char a; a:Byte ; char a; a:Shortint; char a; a:AnsiChar; 文字として処理する時はこちらの型を使う char[10] a; a:array [0..9] of Char; int * a; a:^Smallint; (本来はtype節で PSmallintと定義して使うらしいが) double a; a:double; ----------- 構造体 -------------------------- ___C_____ _delphi___ type struct a{ a=record int x; x:Smallint; } end; union a{ a=record Pascalの方が柔軟な分面倒 case Integer of char x[2]; 0:(x:array[0..1]of Char); int y; 1:(y:Smallint); } end; ---------- 似てるが少し違う例 ------------ ___C_____ _delphi___ func(...) func(array of const) Pascalでは引数を渡す順番から...は不可能 void * Pointer 形無しポインタだが少し違う xx::xx(); constructer xx.dd() どちらもコンストラクタだが、Delphiでは事 前にゼロクリア済み。また参照呼び出して普 通の関数としても動作可 for(i=0;i<=n;i++)文; for i:=0 to n do 文 nが文中で変更された時に異なる --------Delphi のポインタ ---------- ポインタ変数については、事前に定義しておかなければならない。 type pWord=^Word; まずこうやってwordのポインタ型を定義しておいて var その後、 ip1 :pWord; ポインタ型の変数を定義する ip2 :^Word; でも、マニュアルにはないけど変数ならこう定義出来るみたい 注意:Pointer 型の変数には加算減算出来ない。PChar 型にすれば可能 関数ポインタ型の定義 (Cでのtypedef のように定義してから使う) type pfunc1=function:Double; これらは型の定義でありポインタの定義ではない pfunc2=procedure; pfunc3=procedure(a:Integer); pfunc4=procedure(a:Integer) of object; メソッド(クラス内)の場合 var f:pfunc1; ここがポインタの定義となる ------------------------------------------------------------------------------ Cとの違い注意 ●ラベル C: 文中にaa: abc:のように書けばそれがラベル定義になります。 Delphi: cと違い英字だけでなく数字もラベルに出来ますが、最初に使用する ラベルを全て定義しなければなりません。 手続,関数,メソッドに続いて procedure aa; var i:integer; label lab1,111; <---ここで全部定義する begin lab1:; <-文中では lab1:のようにする。 goto lab1:; 111:; end; ●return C: 手続きなら return ; 関数なら return 帰値; delphi: 手続きも関数も途中終了するのはexit;です。 関数の帰り値の場合は result:=帰値; とやります。 resultは暗黙のうちに定義される変数なので、代入だけでなく参照 も出来ます。 ● switch と Case C: default:というのがタイプミスしても単なるラベルになるという重大 な欠陥がありました。また、Breakを忘れると 次のcase n:を実行して しまう欠陥もあり注意しなければなりません。 Delphi 文1つづつしか指定出来ませんからbegin endで挟まないといけません が、セレクタとして複数や範囲を指定出来便利です。 ●with do C: 定数を並べると構造体のメンバを設定出来ました delphi: 構造体の設定をするには各メンバへの代入しかありません。それを緩和 してくれるのがwith xx do 文です。が、出来るだけ集中して使わないと どの構造体のメンバに代入してるのか判らなくので注意 xx.WndProc(var Msg: TMessage); とある引き数 Msgを参照するのに with Msg do case Msg of 文; とやりますが、caseの後のMsgは実際には Msg.Msg だったりする ●p++ C: p++; ポインタサイズに応じてINCされる delphi Inc(p) マニュアルにはPCHARの時だけ動作するとあるが、 P:DWORDでも期待通り動作するようだ。 ●配列について Cでは配列名はポインタと代入互換があり、配列名=配列の先頭番地というイメージ があります。int *p; と定義すれば p[3]のようにもアクセス出来ました。 しかしDelphiでは配列名はたんなる変数名の一種でニュアンスが違う為、最初は戸 惑います。会議室で教えて貰うまで判りませんでした。 ポインタからのデータを配列として扱いたい場合は、 type PPWordArry = ^TPWordArry; TPWordArry = Array[0..32767] Of PWord; var p :PChar q : PPWordArry; として、q:=PPWordArry(p); と代入すれば、q^[10]のように整数配列として使用 出来るようになります。 type PPWordArry = ^TPWordArry; TPWordArry = Array[0..32767] Of PWord; var p :PChar q : PPWordArry absolute p; とすれば、pとqは同じ変数位置を示すようになりますから、代入しなくとも 配列としてアクセス出来る事になります。 さらに type TPWordArry = Array[0..32767] Of PWord; var p :PChar q :^TPWordArry absolute p; とすればタイプ回数を減らせます。が、これは言語リファレンスにない使い方 ですから、将来も動くかどうかは不明。 delphiでの配列は範囲を指定します。 範囲はLOW-HIGHで取り出せます。オープン配列では0〜HIGHになります ------------------------------------------------------------------------------ C++との違い注意 ●メソッドのオーバーライドをする時は C: 親でvirtual宣言されていれば自動的に継承される Delphi:必ず override が必要(無ければ継承されてない)<結構ミスの元> ●virtual と dynamic と message C: 仮想メソッドはvirtual しかありません。 Delphi: virtual も dynamic でも動作は同じ virtual は高速だがメモリを少し食う dynamic は遅いが、virtualよりメモリ消費が少ない message は windowsメッセージの為のdynamic宣言 ●継承後の親呼び出し C: 親::callという形で遡って親を呼び出せます Delphi:Inherited call という形で直前の継承元を呼び出します ●多重継承 C: 親を2つ以上でも持てます Delphi: 親は常に1つです。幹はTObjectです。 Cのように多重継承の真似 をしたい場合はメンバーとして持つしかないです。 ●抽象メソッド C: virtual xx(,,,)=0; Delphi: xx(,,,);virtual;abstract; -------書籍---------------------------------------------------------------- 1,950 はじめてのDelphi 2,100 Delphiの奇跡 2,500 Delphiコンポーネントプログラム入門 古川正寿 著 アスキー +CDROM 2,600 Delphi入門 2,700 Delphi応用プログラミング 2,800 Delphiテクニックマスター集中講義 3,800 Delphi2.0Jコンポーネントセット 3,800 Delphiプログラミング技法Vol.2実践編 3,900 Delphiで発見高速で快適なデータベースシステム構築法 滝口信哉 著 オーム社 4,200 Delphi2プログラミング入門 Dan Osier他著 プレンティスホール出版/トッパン 4,900 Delphiプログラミング技法Vol.1入門編 5,800 Delphiデータベースプログラミング 5,800 Delphiプログラミング大全 5,800 ボーランド公式Delphiパーフェクトマニュアル Charles Calvert著 インプレス --円------------------------------------------------------------------------ -------SQLの書籍------------------------------------------------------------ 2,000 標準SQLプログラミング 原潔著 啓学出版 2,400 SQLを使ったパソコンDBシステム入門 番場宏次、大場好高 著 新紀元社 2,800 SQLテクニックQ&A 原潔 著 ソフトリサーチセンター 3,200 SQL入門 平尾隆行著 オーム社 90年10月 3,500 標準SQL―JIS/ANSI/ISO準拠 C.J.デイト著;トッパン --円------------------------------------------------------------------------