2017.12.10

Lazarus 1.8がリリースされています

Lazarus 1.8正式版がリリースされています。

1.8RC版からのアップデート時にRC版での環境設定をそのまま引き継ごうとすると、追加でインストールしてあるパッケージで不具合が起こる可能性があるため、追加パッケージをアンインストールしてからアップデートするか、RC版を完全にアンインストールしてからインストールしたほうが良いかも知れません。

私の環境では、AncorDockingDsgn 0.5/sparta_DockedFormEditor 0.0が継承されているにも関わらずフォームがドッキングスタイルにならない問題と、indylaz 10.2.0.3がらみのコンポーネントパスが見つからない不具合が発生しました。

| | コメント (0) | トラックバック (0)

2017.09.27

Lazarus1.8RC4クロスコンパイルでの実行結果その2

Windows上からのX86_64-Linux版クロスコンパイルにてリンクの途中でエラー(Error while Linking)になる問題ですが、その後の調査でどうもリンク時にライブラリが不足しているために発生しているようで、プロジェクトソースに以下の指示を追加することでエラーを回避出来ることがわかりました(根本原因がはっきりしないので、すっきりはしないのですが)。

program Project1;
 
// ここから
{$ifdef Linux}
  {$ifdef FPC_CROSSCOMPILING}
    {$ifdef CPUARM}
      //if GUI, then uncomment
      //{$linklib GLESv2}
    {$endif}
    {$linklib libc_nonshared.a}
  {$endif}
{$endif}
// ここまでを追加する
 
uses
  Forms, tachartlazaruspkg, Interfaces,
  Unit1 in 'Unit1.pas' {Form1};

で、作成したx86_64-Linux版の実行ファイルをVirtualBox上のUbuntu64bit版で実行した結果です。
Ubuntu64
おーーーー!ちゃんと動きました。

残った課題はArm-Androidですが、VectPressさんのLazarusでAndroid開発環境を構築してみましたといった情報もありますので、無理して自力でやることもないのかも・・・

| | コメント (0) | トラックバック (0)

2017.09.23

Lazarus1.8RC4クロスコンパイルでの実行結果

クロスコンパイルに成功したi386-Linuxとarm-Linux用の実行ファイルが動作するかどうか確認しました。

尚、テスト用のプロジェクトは前回作成した正規乱数発生テスト用のものを用いいました(ソースコードは修正無しでコンパイル出来ました)。

i386-Linux・・・VirtualBox上のUbuntu32bit版で確認した結果、
Randtest
おーーーー!正常に動作するようです。

arm-Linux・・・Raspberry Pi3+Raspbian Pixelで確認した結果、
Randtestrasp
おーーーーーーー!こちらも正常に動作しました。

とりあえず、あとはx86_64-Linuxとarm-Androidがなんとかなるのかどうかです。今後の課題として、暇な時に取り組んでみたいと思います。

| | コメント (0) | トラックバック (0)

2017.09.20

Lazarus1.8RC4とクロスコンパイル環境の構築

Lazarus1.8のRC4がリリースされていたのでインストール。

Windows32/64両方に対応出来るよう、Lazarus自体は32bit版を選択して、追加インストールファイルであるlazarus-1.8.0RC4-fpc-3.0.4rc1-cross-x86_64-win64-win32.exeも合わせてダウンロードし、最初に本体をインストール後Win64クロス環境をインストール。

で、起動すると各フォームが独立したクラシックスタイルで表示されます。Lazarus1.7で折角モダンなスタイルになっていたので1.8も同じようなスタイルにしてみました。

インストール直後の状態
Lazarus18

Lazarusのパッケージメニューからパッケージのインストールもしくはアンインストールを選択して、表示されたダイアログの右側のリストからAnchorDockingDsgn 0.5とsparta_DockedFormEditor 0.0をダブルクリックしてインストール対象に登録し、保存してIDEを再構築ボタンを押してしばし待つと、Lazarusが再起動してモダンスタイルに変更されます。この時、sparta_DockedFormEditor 0.0も一緒に登録しないと、フォームデザイナだけ独立フォームとなって面倒なことになりますので(と言うかなった)、必ず同時に登録しましょう。

Lazarus18mdn


Lazarus1.7(trunk)ではi386-Linuxのクロスコンパイル環境が標準で含まれていましたが、1.8RC4では(といいますか、通常のWindows版では)含まれていませんので、クロスコンパイル環境の構築にも挑戦してみました。

ということで、Web上の情報を色々と探したのですが、Windows上でMinGWやCygwin環境を構築してコマンドラインでごにょごにょするとか敷居の高い方法やfpcupコマンドを使用する方法が見つかりましたが、中々うまく行かず悩んでいたところで、GUIで操作できるfpcupdeluxeというものを発見。このfpcupdeluxeも中々うまくいかなかったのですが、やっとなんとかなる方法が見つかりましたのでまとめておきます。

まずfpcupdeluxeのソースコードをgithubからダウンロードします。

適当なフォルダに解凍して、Lazarusでプロジェクトファイルfpcupdeluxe.lpiを開いて実行ファイルを作成します。
次にfpcupdeluxe用の作業フォルダを作成して(ここの例ではC:\freepascal-master)、その中にサブフォルダfpcsrcを作成します。
続いてLazarus1.8RC4で使用しているFreePascal3.0.4のソースコードを取得ためにSubversion(SVN)クライアントを準備するのですが、ここではちょっと調べたところで使いやすそうだったTortoiseSVNをインストールして使用します。
https://ja.osdn.net/projects/tortoisesvn/から自分の環境にあったものをダウンロードしてインストールするとエクスプローラのコンテキストメニューからSVNの操作が出来るようになります。

エクスプローラで先程準備したC:\freepascal-master\fpcsrcを選択して右クリックし、コンテキストメニューからSVN Checkout...を実行すると以下のダイアログが表示されます。
Svncheckput

Tortoisesvn

ここでfpcupdeluxeをインストールしたフォルダ内のサブフォルダdeluxebinにあるfpcup.iniを開き、[ALIASfpcURL]タグ内にある3.0.4=の右側のアドレスをコピーして、このダイアログのURL of repository:に貼り付ける。あとはOKボタンを押せば、3.0.4のソースコードが全てフォルダ内にダウンロード出来ます。

ダウンロードが完了したら、fcpupdeluxe-xxx-xxx.exeを実行します(xxx-xxxはWindows32か64かで変わる)。
fpcupdeluxeが起動したら、まずは画面中央下の方にあるSetup+ボタンを押して設定ダイアログを開き、Include LCL with cross compiler (default=no)をONにして閉じます。
Fpcupsetting

次に左側のFPC Versionから3.0.4を選択、Lazarus versionからfixes1.8を選択します。
後は、作成したいクロスコンパイル環境に応じてCPUとOSを選択して、Install cross-compilerボタンを押せば必要なファイルの作成が始まるので、あとは終了のを待ちます・・・
Fpcupdelux

作成が終了すると、C:\freepascla-master\cross\binフォルダ内にcpu-os名のフォルダ(i386-linux等が出来ていますので、その中のファイル全てをLazarusをインストールしたフォルダ内のFreePascalフォルダ(例えばC:\Lazarusにインストールした場合は、C:\Lazarus\fpc\3.0.4\bin\i386-win32フォルダにコピーします。
尚、arm-linuxの場合にはファイル名を全てarm-linux-gnueabihf-xxxx.exeからgnueabihfを削除してarm-linux-xxxx.exeに変更する必要があります。
尚、一回の作業では必要なunitが作成されない場合がある(C:\freepascal-master\fpc\unit内にcpu-os名のフォルダとファイルがなければ作成されていない)ので、その場合はfpcupdeluxeで再度Install cross-compilerを実行すれば作成されると思います。
続いて、C:\freepascal-master\fpc\bin\i386-win32フォルダ内に作成されたppcrossXXX.exeも同様に上記フォルダにコピーします。
続いて、C:\freepascal-master\fpc\fpmkinstフォルダとC:\freepascal-master\fpc\unit内に作成されたcpu-osフォルダをそれぞれC:\lazarus\fpc\3.0.4\fpmkinstフォルダとC:\lazarus\fpc\3.0.4\unitsにコピーすればクロスコンパイル環境が出来上がります。

あとはLazarusのプロジェクトオプションの設定と対象で対象とするOSと対象とするCPUファミリーを選択すればそれらターゲット環境用の実行ファイルを作成出来るようになります。


この方法で試してみたのは以下の通りです。

i386-linux・・・環境作成OK.コンパイル・リンクは正常終了で多分OK
x86_64-linux・・・環境作成OK.リンクの途中でエラーとなるが原因は不明
arm-linux・・・環境作成OK.コンパイル・リンクは正常終了で多分OK
arm-android・・・環境作成の途中でエラーとなり、fpmkinstやunitの作成が出来ずに停止

多分OKというのは、実際にそれらの環境で実行出来るか確認出来ていないからです。そのうち暇があれば確認しようと思います。

| | コメント (0) | トラックバック (0)

2017.09.09

Delphi/Lazarusでの正規分布乱数の発生

正規分布乱数を発生させるためにはどのような方法がベストなのかDelphiで試してみました。
比較したアルゴリズムはボックスミュラー法と中心極限法理による正規分布乱数生成にDelphi標準関数のRandGを加えた3種類で、生成元の一様乱数はDelphi標準のRandomとメルセンヌ・ツイスターアルゴリズムを用いたDelphi用MT19937ライブラリを用いて見ました。

テスト方法はそれぞれ任意の正規分布乱数をグラフに表示させての”見た感じ”比較と一応定量的な評価として±1σ,±2σ,±3σそれぞれの確立分布と実際の分布数を比較して、その差をパーセント表示させて誤差の大きさを見ることにしました。
とここまでは良かったのですが、何とDelphi 10.1/10.2 StarterエディションにはTeeChartが付属していないためグラグ表示が出来ないことが判明。仕方がないので、一度はDelphi XE2 Pro版でテストプログラムを作成したものの、Starterしか持ってないから確認出来ない!という方がいるかも知れないと思い、あらためてLazarusで作成し直しました(LazarusにはTAChartというTeeChartに似たコンポーネントがあります)。

で、その結果ですが・・・どれもあまり代わり映えがしないようで、生成数が10,000個になるとどれもほとんど差がありません。
まぁ、よほど正確性が必要な用途に用いるのではない限り、Delphi/Lazarus標準のRandGが最強ではないかと思った次第です。
#それにしてもTeeChartにしてもTAChartにしても、機能が豊富すぎて使うのがものすごく面倒くさいです。

参考にLazarusプロジェクトソースと実行ファイルをアップしておきます

// ボックスミュラー法による乱数生成
procedure TForm1.BoxMullerTransform(RandType: integer; var x, y: Double);
var
  r1, r2: double;
begin
  case RandType of
    TYPEMT19937:
      begin
        r1 := mt19937_double(mtctx);
        r2 := mt19937_double(mtctx);
      end;
    else begin
      r1 := Random;
      r2 := Random;
    end;
  end;
  x := Sqrt(-2.0 * Ln(r1)) * Cos(2.0 * Pi * r2);
  y := Sqrt(-2.0 * Ln(r1)) * Sin(2.0 * Pi * r2);
end;
 
// 中心極限定理による乱数生成
function TForm1.CentralLimitTheorem(RandType: integer): double;
var
  i: integer;
  r: double;
begin
  r := 0.0;
  for i := 1 to 12 do
    case RandType of
      TYPEMT19937:
        r := r + mt19937_double(mtctx);
      else
        r := r + Random;
    end;
  Result := r - 6.0;
end; 

Test

「RandTest.zip」をダウンロード

| | コメント (0) | トラックバック (0)

2017.04.23

DelphiとLazarusでのドロップファイル処理の違い

ファイルやフォルダの日付を一括変更したくてフリーソフトのTouchを探したのですが、フォルダの日付も変更できるものを見つけることが出来なかったので自力で作成しました。
細かなことが面倒だったので、ファイル・フォルダに関わらずまとめてドロップすれば一気に日付を変更する、ファイル日付は作成・更新・最終アクセス日付を指定した日時で全部変更する、ということにしました。また、実行ファイルのショートカットにファイル・フォルダをドロップしたら、その時点の日時で変更する、日時を指定したい場合は実行ファイルを起動して日時を指定後にそのフォームにドロップする、ということにしました。

Touch

で、今回もDelphiとLazarusの両方で実行ファイルサイズを見比べならが(^^;作成したのですが、Lazarusでのドロップファイル処理の仕方がDelphiとは異なっていたのでメモしておくことにしました。こうやって比べてみると、私的にはLazarusの方がスマートな感じがしていいかなと思います。

Delphiの場合

// ファイル・フォルダがドロップされた際のイベント
procedure TForm1.DropFiles(var Msg: TMsg; var Done: Boolean);
var
nFile, i: integer;
fname: string;
FileName: array[0..260] of char;
DT: TDateTime;
begin
Done := True;
if Msg.message = WM_DROPFILES then
begin
SetForegroundWindow(Application.Handle);
// 変更後の日付と時刻を合成(DateNewの整数部とTimeNewの小数部を足す)
DT := Trunc(DateNew.DateTime) + Frac(TimeNew.DateTime);
try
nFile := DragQueryFile(Msg.wParam, $FFFFFFFF, nil, 0);
for i := 0 to nFile - 1 do
begin
DragQueryFile(Msg.wParam, i, FileName, SizeOf(FileName));
fname := FileName;
if DirectoryExists(fname) then
ChangeDirTime(fname, DT)
else
SetFileDate(fname, DT, DT, DT);
end;
finally
DragFinish(Msg.wParam);
end
end else
Done := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//ドロップファイルイベントの登録
Application.OnMessage := DropFiles;
DragAcceptFiles(Handle, True);

Lazarusの場合

// ファイル・フォルダがドロップされた際のイベント
procedure TForm1.DropFiles(Sender: TObject; const Files:Array of AnsiString);
var
i: integer;
fname: string;
DT: TDateTime;
begin
SetForegroundWindow(Handle);
// 変更後の日付と時刻を合成(DateNewの整数部とTimeNewの小数部を足す)
DT := Trunc(NewDate.Date) + Frac(NewTime.Time);
// Lengthで配列の大きさを取得してリストを取得する
for i := 0 to Length(Files) - 1 do
begin
fname := Files[i];
if DirectoryExists(fname) then
ChangeDirTime(fname, DT)
else
SetFileDate(fname, DT, DT, DT);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// Lazarusではファイルドロップイベントを以下のように設定する
Application.AddOnDropFilesHandler(@DropFiles);

procedure TForm1.FormDestroy(Sender: TObject);
begin
// 終了時にイベント解除
Application.RemoveOnDropFilesHandler(@DropFiles);
end;

実行ファイルサイズは
Delphi10.1 Starter   2,167,808 バイト
Lazarus1.7+FPC3.1  2,788,352 バイト

LazarusではDateTimePickerコンポーネントが標準ではインストールされていないので、手動でDateTimeCtrlsパッケージをインストールする必要があります。おそらく、この追加コンポーネントがファイルサイズが大きくなっている原因ではないかと思います。

「touch.zip」をダウンロード

サンプルファイルにはDelphi/LazarusのソースファイルとDelphiで作成した実行ファイルが含まれています。

| | コメント (0) | トラックバック (0)

2017.02.28

Lazaru+FPCとDelphi10.1 Berlinの実行ファイルサイズ

Lazarus+FPCで作成したWindows実行ファイルのサイズは1,732kbあるのですが、Delphi10.1 Berlinではどうかと思いBerlinでWindows実行ファイルを作成してみました。まずはLazarusプロジェクトフォルダーのコピーを作成してコピーしたプロジェクトソースを修正していきます。
・フォームファイルUnit1.lfmの拡張子をUnit1.dfmに変更する。
・Unit1.pasソースの{$R *.lfm}を{$R *.dfm}に変更する。
・Project.lprの拡張子をProject.dprに変更する。
・DelphiでProject.dprを開く。この時フォーム読み込み時にDelphiとLazarusでコンポーネントの名前が違っていたりプロパティが違っている箇所でエラーが出るので、フォームのソースファイルを開いてエラーが出た箇所を力づくで修正する。
・エラーが無くなったらプロジェクトを保存して一旦閉じる。
・Project.dprojファイルをエディタで開いて


の行を見つけ、もしここが
となっていたら、以下のように修正する。

 
   
Form1

   dfm
 

 
となっていると、メインフォームがない状態となり、フォームデザイナーでフォームの編集が出来ないようです。

で、何とかDelphi 10.1 Berlinで正常にコンパイル出来るようにして作成した実行ファイルのサイズは・・・2,328kb・・・Lazarus+FPCよりも大きなサイズとなりました。昔のDelphiの頃にはLazarus+FPCのファイルサイズが大きいことが弱点だったのですが、ファイルサイズでは今や逆転してしまったようです。
しかしながら、Lazarus+FPCではCOMなどのWindows特有の機能を使用したアプリケーション開発が出来ないようですので、目的に合わせて使い分けるのが良いかもしれません。

Berlinで作成した実行ファイル
Publishberlin


| | コメント (3) | トラックバック (0)

その他のカテゴリー

Inno Setup | Lazarus | Nightly Build | Raspberry Pi | VisualStudio/C#