|
次は Delphiでつくったアプリケーションを移行してみます。ただ、このサイトで公開しているフリーソフトはレジストリ関係だったり、ウィンドウハンドル関係だったりと
Windows べったりなので以下のようなサンプルを作ってみました。このアプリケーションは SelectDirectory
でユーザーが選んだドライブ、フォルダにぶらさがるフォルダとファイルの一覧を TreeView、 ListView に出力するだけのものです。

■ Delphiでつくったサンプルアプリケーション
Kylix へ移行する前に次の修正を行います。まず、フォームの {$R
*.DFM} を {$R *.dfm} に、プロジェクトファイルの {$R *.RES} を {$R *.res} に書き換えます。Linux
ではファイル名の大文字小文字を区別するので大文字のままだとエラーになります。FTPなどで Linux側へアップロードする際は文字コードを EUC にして転送します。そしていよいよ Kylix でのプロジェクトオープン。いくつかプロパティ読み込みエラーが出ますがこれは
Delphi にあって Kylix に無いプロパティがあるせいです。全て無視してフォームを開くと、、当然ですが Delphi
でつくったそのまんまのフォームが表示されます。ただ、ImageList の内容は移行されませんでした。今回 Delphi
4 からの移行だったからかもしれません。

■ Kylix で開いてみた結果
続いてコンパイルですが、uses節に設定しているユニットの修正が必要です。プロジェクトファイルの Forms は
QFormsに変更です。フォームの uses は多いのでいったん削除して保存するといいです。
|
■ プロジェクトファイルの修正箇所 |
program Project1;
uses
QForms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
:
|
|
■ フォームファイルの修正箇所 |
unit Unit1;
interface
uses
SysUtils, QImgList, Classes, QActnList, QMenus,
QTypes, QComCtrls,QControls, QExtCtrls, QForms;
:
|
ここまで修正してコンパイルすると次は SelectDirectory 関数が無いとエラーが出ます。 Dlephi
では FileCtrlユニットにありましたが Kylix には FileCtrl ユニットがありません。 SelectDirectory関数の上で
[F1] を押すと Delphi と同じようにヘルプが表示され、その関数がどのユニットにあるかを調べることができます。 SelectDirectory
は QDialogs ユニットに移動したようです。 QDialogs を uses 節に追加し、再度コンパイル。。。今度は
OK です。

■ Kylix での実行結果
FindFirst FindNext などの関数は移植されているようです。ファイル操作は Windows と違う点が多いので注意が必要です(区切り文字の違いや読みとり権限の有無など)。
|
■ 今回実行したコード |
procedure TForm1.actInitializeExecute(Sender: TObject);
var
Rec : TSearchRec;
S : string;
Node : TTreeNode;
Item : TListItem;
begin
if SelectDirectory('ディレクトリ選択', '', S) then begin
if FindFirst(S + '*.*', faAnyFile, Rec) = 0 then begin
repeat
if (Rec.Attr and faDirectory) > 0 then begin
if (Rec.Name <> '.') and (Rec.Name <> '..') then begin
Node := TreeView1.Items.Add(nil, Rec.Name);
Node.ImageIndex := 0;
Node.SelectedIndex := 0;
end;
end else begin
Item := ListView1.Items.Add;
Item.Caption := Rec.Name;
Item.SubItems.Add(Format('%d', [Rec.Size]));
Item.SubItems.Add(DateTimeToStr(FileDateToDateTime(Rec.Time)));
Item.ImageIndex := 1;
end;
until FindNext(Rec) <> 0;
end;
FindClose(Rec);
end;
end;
|
|