Linux でのビジュアル開発をサポートする Borland Kylix.が日本でもリリースされ、いろいろな Linux 系の雑誌でもとりあげられるようになりました。今回は Kylix 日本語版 Server Developer Edition をちょっとだけレポートしてみたいと思います。

Kylixのインストールと起動

 Kylixのパッケージには Turbo Linux や RedHat Linux、LASER5 、 Miracle Linux などが同梱されています。その中から今回は RedHat Linux をインストールし、その後 glibc のアップデートを行いました。RedHat Linux に限ってこのアップデートを実施しないといけないようです。他の同梱 Linux は CDに "Kylix Ready" がプリントしてあるので大丈夫と思います。アップデートが終わったら Kylix のインストールです。これも簡単なので説明はとばします。セットアップが終わったらいよいよ Kylix の起動です!


■起動直後の Kylix

 起動直後の見た目は Delphi 5 とほとんど同じです。さっそく HelloWorld でもつくってみます。使い方も Delphi と同じで Linux を知らなくてもさくさく開発できます。

Hello Wordをつくってみる

 Formにボタンを二つ、ラベルをひとつ配置し、ボタンをクリックしたらラベルに "こんにちは" と表示する簡単なサンプルです。ボタンは Bitbtn を使い Bitmapプロパティに画像を設定してみます。


■画像を指定するダイアログ


■ Bitbtnに画像を設定した結果

 画像のダイアログは画像のプレビューが無くてちょっと不便です。用意されているのはすべて Bitmap ですが PNGファイルも指定できるようです。で、設定した結果が右です。なぜかボタン上をビットマップが埋め尽くしてしまいました。ん〜、なんか設定があるのでしょうか、、で、下がコードです。 uses 節に Qで始まるユニットがいっぱい定義してあるのが分かると思います。それ以外では $R で指定しているリソースファイルの拡張子が DFMから xfmに変わったぐらいです。

■ Kylixでつくった Hello World
unit Unit1;

interface

uses
  SysUtils, Types, Classes, Variants, QGraphics, QControls, 
  QForms, QDialogs,QStdCtrls, QButtons;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.xfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Label1.Caption  :=  'こんにちは';
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Close;
end;

end.

Delphiアプリケーションを移行する

 次は 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;

MyBaseを試してみる

 次はローカル XMLファイルをデータセットとして扱える MyBase を試してみます。マニュアルに書いてあるとおりですが手順を説明します。

→まず新規フォームに [ DataAccess ] ページの ClientDataSet を配置します。すでに XML ファイルがあればそれを読み込みますが、無いので新規に作成します。ClientDataSetをダブルクリックして項目エディタを表示し、右クリックのポップアップメニューから"項目の新規作成" を選びます。

←項目の新規作成ダイアログが表示されたら項目 (フィールド) の名前と型、サイズを入力して [ OK ] を押します。ここでは "ProductID : integer" "ProductName : string" "Version : real" の3つのフィールドをつくりました。

→これでフィールド定義ができました。次にこのレイアウトに沿った空のデータセットをつくります。 ClientDataSet を右クリックしてポップアップメニューから "データセットの作成" を選びます。これで空のデータセットができ、Open した状態になります。

↑試しに DataSource と DBGrid を置き、関連づけると以下のようにレコードのないデータセットであることが分かります。
実行時に画面から入力されたデータを XMLファイルとして保存するためのボタンを置き、以下のようなコードを記述します。


 
■ データセットの内容を XML 形式で保存する処理
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.SaveToFile('testdata.xml');
end;

 

↑これで完成です。アプリケーションを実行して DBGrid に値を入力し、保存ボタンを押せば入力したデータが XML ファイルとして保存されます。

■ 出力された XMLファイル
   <?xml version="1.0" standalone="yes"?>
   <DATAPACKET Version="2.0">
     <METADATA>
       <FIELDS>
         <FIELD attrname="ProductID" fieldtype="i4"/>
         <FIELD attrname="ProductName" fieldtype="string" WIDTH="20"/>
         <FIELD attrname="Version" fieldtype="r8"/>
       </FIELDS>
       <PARAMS CHANGE_LOG="1 0 4 2 0 4 3 0 4 4 0 4"/>
     </METADATA>
     <ROWDATA>
       <ROW RowState="4" ProductID="1" ProductName="Delphi" Version="5"/>
       <ROW RowState="4" ProductID="2" ProductName="C++Builder" Version="5"/>
       <ROW RowState="4" ProductID="3" ProductName="JBuilder" Version="4"/>
       <ROW RowState="4" ProductID="4" ProductName="Kylix" Version="1"/>
     </ROWDATA>
   </DATAPACKET>

 一度保存した XML ファイルをプログラム内で読み込むには ClientDataSet の LoadFromFile メソッドを使います。また、MergeChangeLogメソッドを使うと更新内容をデータにマージできます。

その他 Kylix あれこれ

 その他 Kylix を使って気づいたことです。まず、Linux 特有の API はどうやって呼ぶのか? Delphi なら Windows.pas に WIN32API が定義してありました。 Kylix では Libc.pas に Linux用 API が定義してあるようです。例えば opendir 関数は以下のように定義してあります。

function opendir; external libcmodulename name 'opendir';

 Application に Style プロパティがあります。これを使うとアプリケーションのルック&フィールを動的に変更できるようです。以下の4種類以外にもいくつかあります。

▲Windows

▲Motif

▲Platinum

▲QtSGI

 Kylix のパッケージの中には Delphi 等と同じく Companion Tools CD が同梱されていました。中身はフリーソフトやコンポーネント、シェアウェア、トライアル版などがほとんどだったんですが InterBase 6 と、BorCon のビデオが入っていました。ビデオは Kylix のCDが一番多く収められているんじゃないでしょうか、

BorCon 1999 より。年代別にボーランド製品がたくさん出てくる。 Borland Office なんかも。

BorCon 1997 より。この年は STARWARS 風。


まとめ

 かなり偏った内容でしたが今回のレポートはここまでです。 MyBase は個人的に非常に気になっていたので真っ先に試してみました。 dbExpress では Paradox や dBASE などのローカルデータベースをサポートしないようなので MyBase を使う機会も出てくるだろうと思います。それから Delphi との互換性は非常に高く、今回 Delphi 4 のコードを移行しても何カ所か修正するだけで動作しました。 Delphi 6 ではおそらくほとんど修正無しで移植できると思われます。

[ 戻る ]