DELPHI 5から6への移行でソースコードのコンパイルエラーが発生する

このQ&Aのポイント
  • DELPHI 5でコンパイルできたソースコードが、DELPHI 6でコンパイルしようとするとエラーが発生します。
  • 移行の際に注意すべきポイントや英語版と日本語版の違いによるエラーの可能性について教えてください。
  • 他人からもらったソースコードの一部の情報から、エラーが発生する原因を特定することができないので、問題点の解決方法を教えてください。
回答を見る
  • ベストアンサー

DELPHI 5でコンパイルできたソースがDELPHI 6でコンパイルできない

DELPHI 5(英語版)でコンパイルできたソースが、DELPHI 6(personal、無償版、日本語版)でコンパイルをしようとするとエラーが出てコンパイルできません。一般的に、5から6へ移行する際に注意することがありますでしょうか?あるいは、英語版と日本語版で異なるという可能性はありますでしょうか? ソースの一部は以下の通りです。 ********** IMPLEMENTATION USES Windows, Messages, Dialogs, FileCtrl; CONST BUFLEN = 10240; FindSortMax = 1024; SHIFT_RECHTS = 1; (* Flags f・ Sondertasten *) SHIFT_LINKS = 2; (* Flags f・ Sondertasten *) CTRL = 4; (* Flags f・ Sondertasten *) ALT = 8; (* Flags f・ Sondertasten *) SCROLL = 16; (* Flags f・ Sondertasten *) NUM_LOCK = 32; (* Flags f・ Sondertasten *) CAPS_LOCK = 64; (* Flags f・ Sondertasten *) TYPE BufAr = ARRAY [1..BUFLEN] OF BYTE; TextFiles = RECORD open : BOOLEAN; Name : STRING[255]; buffer : ^BufAr; END; Zeichen = RECORD C : CHAR; A : BYTE; END; Screen = ARRAY [1..25] OF ARRAY [1..80] OF Zeichen; (* Entspricht der EGA/VGA Bildschirmstruktur *) VAR TF : ARRAY[1..MAXFILES] OF TextFiles; i : INTEGER; VGA : Screen ABSOLUTE $0B800; (* VGA-Screen-Adresse *) sommerzeit : BOOLEAN; stmp : STRING; FindSortNr : INTEGER; FindSortP : INTEGER; FindSortRecs: ARRAY[1..FindSortMax] OF ^TSearchRec; ActTextForeGround, ActTextBackGround : BYTE; ********** エラーは、「VGA : Screen ABSOLUTE $0B800; (* VGA-Screen-Adresse *)」の行にて、  [エラー] Alib.pas(605): 変数名が必要です と言うエラーが出ます。 他人からもらったソースの為、問題を簡略化して示すことができないのですが、もし上記の情報だけで何かしら問題点があるようでしたらお教えいただければ幸いです。

  • amu
  • お礼率51% (47/92)

質問者が選んだベストアンサー

  • ベストアンサー
  • caceres
  • ベストアンサー率43% (61/140)
回答No.1

D5のソースをそのままD6では通らないものはあります。 VCLのファイルが分割、移動、追加されたようですね。 定義を見るとなんだかDOSレベルかドライバのような記述に見えますが, USESに書いてあるD5のpasファイルに関連しそうな定義がどのような表記になっているのか探してはどうでしょう。 ABSOLUTE $0B800 を除いてコンパイルしてみてはどうでしょうか。 ABSOLUTE の記述が変わったのかもしれませんがコンパイルスイッチで 引っかかっているかもしれません。 またD6のHELPに何か載っているかもしれません。 私は何かあると困るので必ずVCLソース付きを購入していますが、このような場合はソースを確認しています。 また http://www.torry.net/ でVCLソースを落としてD5とD6の違いを見てみてはいかがでしょう。 なにか判るかもしれません。

amu
質問者

お礼

ABSOLUTE $0B800 を除いてコンパイルしたところ、ひとまずこのエラーは消えました。 ありがとうございました。

関連するQ&A

  • Delphiでの条件分岐について

    すいません。ちょっとわからないので、質問させて頂きます。 Delphiで下記のようにIntegerの配列を宣言したとします。 var hoge : array [1..5] of integer; この配列の全ての要素のうち、ひとつでも「1」(いち)と言う値であれば、 配列の全てを「0」(ぜろ)にすると言う条件分岐(if)を作りたいのです。 どのようにして作ればいいでしょうか? 一つずつ下記(途中までですが)のように書けば出来そうですが、配列の数が 増えた場合に大変面倒な事になりそうなので、何か良い知恵があれば よろしくお願い致します。 if( (hoge[0]=1) or (hoge[1]=1)・・・・){ //配列全てに0を代入 }

  • Delphiの定数とローカル変数の初期化

    Embarcadero RAD Studio 2010 Architect Trialというお試し版を使っています。 constを使って定義した定数をローカル変数の初期化の際に以下のようになります。 [DCC エラー] Test.pas(39): E2026 定数式が必要です これでは、定数を1箇所で定義しても定数が使えず即値なので、 プログラム作成やメンテナンスに困ると思うのですが、 昔、Delphiを使っていたのですが忘れてしまって、どうしていたか思い出せませんでした。 皆さんは定数をどのように定義して、どのように使っているのでしょうか? //■定義 unit DEFUnit; interface // 定数・変数 const DAT1 :Integer = 10; const DAT2 :Integer = 20; const DAT3 :Integer = 30; implementation // なし end. //■利用 unit TestUnit; interface uses DEFUnit; var data : Array [0..2, 0..1] of Integer = ( // 先手駒 (DAT1, 1), (DAT2, 2), (DA3T, 3) ); implementation end.

  • VB2010 コンパイルエラー

    VB6からVB2010への移行を行うにあたり、 VB6→VB2008→VB2010 のコンバートを行いました。 が、以下のソースがコンバートされてコンパイルエラーになってしまいます。 エラー内容: 型 'System.Windows.Forms.Cursor' の値を 'Integer' に変換できません。 ---(1)元のソース------------------ Dim lSv_Mouse As Long 'マウスポインタ状態の保存 lSv_Mouse = Screen.MousePointer (中略) 'マウスポインタ状態の復元 Screen.MousePointer = lSv_Mouse ---------------------------------- ---(2)コンバート後のソース--------- Dim lSv_Mouse As Integer 'マウスポインタ状態の保存 lSv_Mouse = System.Windows.Forms.Cursor.Current (中略) 'マウスポインタ状態の復元 System.Windows.Forms.Cursor.Current = lSv_Mouse ---------------------------------- 何か良い方法は無いでしょうか?

  • fortran sqrtコンパイルエラー

    プログラムを書き直していて以下の様なエラーが出てしまいます。 以前sqrt関数を書いたときは以下の様なエラーは出てこなかったのですが、最近やたらFunctionのエラーがよく出ます。コンパイルに問題があるのでしょうか?自分のコンパイルを調べるにはどうしたらわかるのでしょうか?よろしくお願いします。 In file init.f90:52 rf = sqrt((nx-5)**2+(ny-5)**2+(nz-5)**2) 1 Error: Type of argument 'x' in call to 'sqrt' at (1) should be REAL(4), not INTEGER(4) In file init.f90:52 rf = sqrt((nx-5)**2+(ny-5)**2+(nz-5)**2) 1 Error: Function 'sqrt' at (1) has no implicit type

  • DelphiのInputQueryで整数値を入力させたい

    DelphiのInputQueryで整数値を入力させたい のですが、 var Val: Integer; begin Val := 1; InputQuery('個数入力', '個数(1~49):', Val, 1, 49, 1); end; とすると、3番目の引数の型が合っていないとのコンパイルエラーが出ます。 ヘルプでは以下のように書いてあるのですが、何か宣言が必要なのでしょうか? 一番下の例を使いたいのですが… Delphi の構文: function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; function InputQuery(const ACaption, APrompt: WideString; var Value: WideString): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: string): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: Double, Min: Double = Low(Integer); Max: Double = High(Integer); Decimals: Integer = 1): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: Integer, Min: Integer = Low(Integer); Max: Integer = High(Integer); Increment: Integer = 1): Boolean; overload;

  • Delphiで論理積の足し算?

    Delphiでa=17を 0x0Fで論理積したものにb=2を足したいのですが [DCC エラー] SDIMAIN.pas(92): E2015 この型には指定した演算子は使えません となります。Integer型の論理積や足し算をしてInteger型に代入する方法はありますか? procedure TSDIAppForm.Button1Click(Sender: TObject); var a, b, c : Integer; begin a := 17; b := 2; c := (a and #$0F) + b; //c := a + b; ShowMessage(Format('c=%6d', [c])); end;

  • Delphi デバッグ方法

    Delphi6Proを使用しています。 実行時のみ発生するエラーなのですが、 例外が発生するとログファイルに出力する様に組んであります。 (ApplicationEvents1Exceptionでトラップ) コンパイル後のプログラムを実行すると 「'' is not a valid integer value」が出力されています。 これだけでは直接原因しか判らず、変数や場所の特定ができません。 推測するとどうもStringgridの値をstrtointで数値変換している当たりが怪しそうなのですが、該当箇所が多数あり全てにとラップを仕掛けるのは大変効率が悪く困っています。 何か良い方法をご存じでしたら宜しくお願い致します。

  • DelphiからHDDを直接読みたいのですが・・

    最終的には数テラの容量があるハードディスクドライブを,Delphi6からWin32APIのSetFilePointerで位置付けて,ReadFileでセクタを直接読み取りたいと思っていますが,現在,125GB辺りでエラーが発生し,以降がのセクタが読めません。(DelphiXEでも同じエラーとなります)  参考にできる日本語のサンプルも乏しく困り果てています。  どなたか,お教えください。  m(_ _)m  よろしくお願いいたします。 【動作環境】 OS:Windows7 (32) professional 言語: Delphi6(personal) 及びDelphi XE メモリ:2GB 対象ドライブ:USB外付けHDD 250GB(1論理ドライブWindows7でフォーマット) 名称:\\.\PHYSICALDRIVE1 CylindersLo : 30401 CylindersHi : 0 TracksPerCylinder : 255 SectorsPerTrack : 63 BytesPerSector: 512 【問題点】 セクタ0からセクタ245127535までは読める様なのですが,1セクタ進めて245127536セクタを読み込もうとすると,SetFilePointerはエラーなしで通過するも,ReadFileでエラーとなってしまいます。 エラーが起きた時のSetFilePointerとReadFileに与えたパラメータは次の通りです。 Stsector : 245,127,536 real ofset: 125,505,298,432 p_hi: 58 p_lo: 951,246,848 p_hiの戻り値: 58 【プログラムのソース】 var DHandle : Thandle; // ハンドル drv_cnt : integer; // 接続ドライブ数 drvname : String; // 扱おうとするドライブの名称 sectorSize: integer; // セクタのサイズ SectorNum : word; // セクタ番号 Max_num : word; // 読み込もうとするバイト数 buf : array[0..4095*2] of byte; // 読み取りデータの格納域 STsector : int64; // 読み込み開始のセクタ番号 //----------------------------------------------------------- function getSector:boolean; // ダイレクト読み取り var dwRet : integer; // Seekのリターンコード dwSize : DWORD; // 読み取ったバイト数 iRet : Boolean; // Readのリターンコード real_ofs : int64; // 読み込もうとする位置(先頭からのバイト数) p_lo : integer; // SetFilePointerで使用するseek相対位置の下位32bit p_hi : integer; // 上位32bit begin result := false; SectorNum := 1; //一度に読むセクタ数 Max_num := SectorNum * SECTORSIZE; // 一度に読むバイト数 // ハンドルの取得 DHandle:=CreateFile(PChar(drvname),GENERIC_READ or GENERIC_WRITE, 0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0 ); if DHandle = INVALID_HANDLE_VALUE then begin // Openエラー処理 showmessage('open device エラー'); exit; end else begin // real_ofs := STsector * SECTORSIZE; // seek位置をバイト単位で取得 p_hi := real_ofs div 2147483648; // 上位32bitを計算 p_lo := real_ofs mod 2147483648; // 下位32bitを計算 dwRet:= SetFilePointer(DHandle, p_lo, @p_hi, FILE_BEGIN ); // seek if dwRet <> -1 then begin // 1セクタ分をbuf[]へ読み込み iRet := ReadFile(DHandle,buf,Max_num,dwSize,nil); if iRet = False then begin // Readエラー処理 showmessage('Read device エラー'); CloseHandle(DHandle); exit; end // dump_Buf; 読み取ったバッファの16進ダンプルーチン呼び出し end else begin // seekエラー処理 showmessage('Seek エラー'); CloseHandle(DHandle); exit; end; end; CloseHandle(DHandle); result := true; end; ※申し訳ありません,先頭の空白がGooによって自動的に削除されてしまうようです。

  • コンパイル出来ません……

    全くの初心者で何も分からない状態なのですが、プログラミングを勉強したいと思い、「LSI-C試食版」をダウンロードして、解説ページを見つつ打ってみたのですが、エラーになってしまいコンパイル出来ません(汗) LSIの設定もちゃんとやったつもりなのですが……。 エラーメッセージは 「illegal character syntax error near 'end of file'」 と出ます。 因みにWindowsMeです。 もしかしたら、とてもバカバカしい質問をしているのかもしれませんが、原因が分かる方、全くの初心者でも理解できる様に教えて下さい。 宜しくお願い致します。

  • ユニックス上のソースがウィンだとコンパイルできません

    [lex.h] http://kari.to/upload/source/2737.xxx [lex.cpp] http://v.isp.2ch.net/up/270f0a944e6e.htm [perser2.cpp] http://v.isp.2ch.net/up/93d829742fc7.htm これらのファイルを  g++ parser2.cpp lex.cpp -o parser2 としてやる事でユニックス上ではコンパイルできたのですが、同じファイルらを使ってもウィンドウズ上のMinGWでは parser2.cpp:329: `main' must return `int' lex.cpp: In member function `TToken* TLex::getConstant()': lex.cpp:60: warning: passing `double' for argument 2 of ` TToken::TToken(TTokenID, int, double, int, char*, int)' というエラーが出ました。どのようにすればウィンドウズ上でもコンパイルできるのでしょうか。 また、  g++ parser2.cpp lex.cpp -o parser2 のような二つのソースファイルから一つの実行ファイルを作っているようですが、このような方法について教えていただけないでしょうか。 宜しくお願い致します。

専門家に質問してみよう