GUIアプリがIDEでしか実行できない。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/kylix3/bin
を先に実行して下さい。GUIアプリケーションを配布する場合には共有ライブラリも一緒に配布する必要があります。


IDEで_(アンダーバー)が入力できない。

コンソールから
$ xmodmap -e 'keycode 115 = backslash underscore'
を入力します。

普通のキーボードでは押すことの出来ないWindowsキーを「バックスラッシュ/アンダーバー」割り当てています。多分、116でも117でもいいと思います。これを行うと何故か知りませんが、普通に(Shift+"ろ"で)アンダーバーが入力できるようになります。

/usr/local/kylix3/bin/startdelphiにあらかじめ記述しておくのもいいかもしれません。

IDEのエディタで日本語入力するとキャレットが激しく点滅する。  環境に合わせて上記のファイルを編集。

Section "Device"
を検索し、"Device"セクションに

Option "backingstore"

を記述します。

TEditでパスワード文字を設定できない。

KylixのTEdit にはPasswordCharプロパティはありません。EchoModeプロパティにemPasswordを指定して下さい。

実行ファイルのメニュー/ポップアップメニューのフォントだけが汚い。
  1. プロジェクトファイルをエディタで開きます。

  2. Application.Initialize; の前に
    Application.Font.Name := 'ipapgothic'; // フォントは任意
    Application.Font.Height := 12;       // フォントの大きさも任意 
    と記述します。

  3. 各フォームのFormCreateイベントで
    Font.Assign(Application.Font);
    ParentFont := True;
    と記述します。

アプリケーションアイコンを指定したい。
  1. メインフォームのIconプロパティでアイコンを指定します。

  2. メインフォームのFormCreateイベントで
    Application.Icon := Self.Icon;
    と記述します。
KonquerorやNautirus上ではアイコンは変化しません。アプリケーション実行時に左上のアイコンやタスクバーに表示されるアイコンが変化します。KDEやGnome用にpng形式にコンバートしたアイコン画像を一緒に配布する事をオススメします。

サイズを固定したフォームを作りたい/最大化ボタンを出したくない。
  1. フォームのBorderStyleプロパティをfbsSingleにする。

  2. BorderIcons プロパティを[biSystemMenu]等にする。

  3. フォームの FormShowイベントで
    Constraints.MaxHeight := Height;
    Constraints.MinHeight := Height;
    Constraints.MaxWidth := Width;
    Constraints.MinWidth := Width;
    と記述します。
  最大化ボタン/最小化ボタン/閉じるボタンの挙動はLinuxのウィンドウマネージャの設計思想に依存しています。BorderStyleや BorderIconsが思った通りに動作しないように感じるのはWindowsとの思想の違いによるものです。恐らく多くのウィンドウマネージャにおいて最小化ボタンを消す事ができないハズです。

Helpボタンを出したくない。
  1. フォームのBorderIconsプロパティからbiHelpを外す。

  2. フォームのHelpContextプロパティに0を指定する。

  3. フォームの HelpFileプロパティを空にする。

  4. フォームのBorderStyleがfbsDialogになっているのであればfbsSingleに変更する。

Variant型の変数に整数を代入してもVarType関数が整数型を返さない。

変数に代入するときに

v := Integer(10);

のように明示的に型を指定するようにして下さい。

ScrollBarsプロパティを持つコントロールでssBothを指定すると必ずスクロールバーが表示される。

"ssAutoBoth"を指定して下さい。Windows版から移植されたコントロールの中には"ssAutoBoth"の指定が利かないものがありますのでご注意。

Helpファイルを使いたい(作りたい)。

 「Bristol Technology社」の「HyperHelp」が使えます。Kylixのヘルプシステムには「HyperHelp」が用いられています。WindowsのWinhelpとソース互換性があります。

 「Borland Developer Network」に「HyperHelp 5.2 for Linux (for Kylix)」がアップされています。「HyperHelp」は販売されている"製品"なのですが、BDNのものはKylixでの使用を前提として自由に使えるようです。

IBXはどこ?

  「Borland Developer Network」にあります。

 IBX(for Kylix3)のパッチもあったのですが、BDNからはDLできません(そこに書かれたURLも存在しません)。UnOfficial版のIBXパッチは現在以下のサイトからDLできます。

[Futuro Sistemas]
http://www.futurosistemas.net/uibxkp.html

但し、このパッチは主にデザイン時の不具合を修正するもので、必ずあてなければならないパッチではないようです。

ちなみにインストール方法は以下のようになります。

$tar -xvf ibxpress.so.6.9.tar
$./ibx_install

この後、Kylix3を起動し[コンポーネント]-[パッケージのインストール]で「追加ボタン」を押して「<Kylix3のインストールフォルダ>/bin」にある「dclib.so.6.9」を指定すれば。完了です。
コンボボックスの動作がなんだか変です。

 Delphi と違い、"TCombobox..Items.Clear"を行ってもItemIndexの値は自動的に「-1」になりません(Delphiでもそれが保証されている訳ではありませんが)。習慣としてClearを行ったらItemIndexに-1を代入するようにしましょう。

なんだがツールボタン/メニュー等がチラついてるような気がするんですが?

  そんな時は、フォームの「DoubleBuffered」をTrueに....できません。TActionListを使っていませんか?そして OnUpdateイベントでTActionの有効/無効を設定していませんか?

procedure TForm1.Test1Update(Sender: TObject);
begin
(Sender as TAction).Enabled := (条件);
end;

procedure TForm1.Test2Update(Sender: TObject);
begin
if (条件) then
(Sender as TAction).Enabled := True
else
(Sender as TAction).Enabled := False;
end;

このようなコードはNGです。Kylixではこの辺が最適化されていないのか、Falseの時にFalseを代入してもイベントが発生します。正確には"このTActionに関連付けられているビジュアルコンポーネントが"...なのですが。

procedure TForm1.Test1Update(Sender: TObject);
var
OldFlg,
NewFlg:Boolean;
begin

OldFlg := (Sender as TAction).Enabled;

NewFlg := (条件);

if OldFlg <> NewFlg then
(Sender as TAction).Enabled := NewFlg;
end;

 クラスでプロパティの読み書きによく使う手法ですね。このようにやらないと、条件が変わっていなくてもビジュアルコンポーネントが再描画されます。Windows(Delphi)では描画が高速なのか、最適化が効いているのかはわかりませんが問題が発生しません(していないように見える)。

 冗長な感じを受けるでしょうが"代入や比較が2,3増える"のと"ビジュアルコンポーネントの再描画に必要となる膨大な処理"を天秤にかければ、どちらを選択するべきかは明らかですよね。
コードを短く書こうとする中級/上級者が陥りやすい罠です。


Konquerorからのファイルのドラッグ&ドロップに対応する。

  定義部に以下のように記述します。

uses
  ... Qt, HTTPApp, ...
 
  private
     ...
    evt:QEvent_hookH;
    h:TMethod;
     ...
  public
     ...
    function EventFilter(Sender: QObjectH; Event: QEventH):Boolean; cdecl;
     ...

そして実装部。

procedure TForm1.FormCreate(Sender: TObject);
begin
   ...
  QWidget_setAcceptDrops(Listbox1.handle,True);
  evt := Qevent_hook_create(Listbox1.handle);
  TEventFilterMethod(h) := EventFilter;
  Qt_hook_hook_events(evt,h);
   ...
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  QEvent_hook_destroy(evt);
end;

function TForm1.EventFilter(Sender: QObjectH; Event: QEventH):Boolean;
var
  qms:QMimeSourceH;
  s:WideString;
  DropFiles:TStringList;
  i:Integer;
begin
  result := False;
  if not QEvent_isQDropEvent(Event) then
    Exit;
  qms := QDropEvent_to_QMimeSource(QDropEventH(Event));
  if QEvent_isQDragEnterEvent(Event) or
     QEvent_isQDragMoveEvent(Event)  then
    QDropEvent_acceptAction(QDropEventH(Event),QTextDrag_canDecode(qms))
  else if QTextDrag_canDecode(qms) then
    begin
      QTextDrag_decode(qms,@s);
      DropFiles := TStringList.Create;
      try
        Listbox1.Items.Clear;
        DropFiles.Text := s;
        for i:=0 to DropFiles.Count-1 do
          Listbox1.Items.Add(StringReplace(HTTPDecode(DropFiles[i]),'file://','',[rfIgnoreCase]));
      finally
        DropFiles.Free;
      end;
    end;
end;

  この例ではListBoxにドロップされたファイルを処理しています。注意なのは、Konquerorからのドロップでは日本語ファイル名等がHTML (URL)エンコードされてしまうという点です。ファイルパスも「file://」で始まりますのでこの辺の注意が必要です。例ではHTTPAppユニットで提供されているHTTPDecode()関数を使って漢字名を復元し、先頭の「file://」を削除しています。

※場合によっては下で紹介されている
"UnOfficial VisualCLX Patch for Kylix3"を導入しないとうまく動作しないかもしれません。
なんか変です?

 コーディングは間違っていないのに、思ったような動作をしない場合には"UnOfficial VisualCLX Patch for Kylix3"を導入してみましょう。ここでは"3rd party compatible"のtgzをインストールするものとします。

$ tar zxfv k3patches.3.10.tgz
$ cd k3patches

  はい、ちょっと待ってー。当方の環境ではパッチをそのまま適用するとTImageListで不具合が出ました。具体的には「16ラ 16以外のサイズのアイコンを保持できない/実行時に表示できない」というものです。このように逆に不具合が出る場合がありますが、不具合は入れてみないと判りませんので、とりあえず入れてみる事にします。

$ ./installpatch

  何か不具合が出ましたか?もし出たのなら、kylix3フォルダに行き、"lib"と"source\clx"を削除し、"lib.org"と "source\clx.org"を"lib"と"source\clx"にそれぞれリネームしてから、不具合の出たパッチを削除します。

$ cd k3patches/paches
$ rm QImageList.pas.patch
$ cd ..
$ ./installpatch

  この例ではTImageListに関連するパッチを削除して再構築しています。アンインストール用スクリプトも用意されていますが、なんだかんだやってると「パッチ集はインストールされていない」と怒られてしまい、実行できなくなってしまいます。

 最悪の場合、バックアップフォルダをリネームし、"k3patches/paches"内のパッチをすべて削除してから「./installpatch」とやると元に戻せます。

VineLinux 4.1 へ Kylix3 をインストール


[インストール前に必要なもの]
# cd /usr/X11R6/lib
# ln -s libX11.so.6 libX11.so
# apt-get install gtk+
# apt-get install libstdc++2_9
# rpm -i compat-libstdc++-6.2-2.9.0.16.i386.rpm

 compat-libstdc++-6.2-2.9.0.16 RPM for i386がないと、libstdc++-libc6.1-1.so.2の問題を解決できないかもしれません。

[インストール]
# mount /mnt/cdrom
# cd /mnt/cdrom
# ./setup.sh