喫茶XRAYトップページ

[スレッド全体
]

[11646] Lazarus返信 削除
2018/1/2 (火) 23:35:29 igy
Lazarus
https://www.lazarus-ide.org/

ちょうど、2017年12月に Lazarus 1.8がリリースされ、
ZeosLibも使えるということもあり、少しだけ触ってみました。
# WindowsとUbuntu 16.04 はOKでした。CentOS 7もインストールできましたが、なぜかリンクエラーに・・


ZeosLibは、Stable版の 7.1.4ではなく、
Lazarus 1.8.0 Compile - Zeoslib Portal
http://zeoslib.sourceforge.net/viewtopic.php?f=40&t=71068
の情報にあるように、
Lazarus 1.8で確認済みのsvn 4068以降(ダウンロード時はsvn 4070)をコンパイル&インストールしました。


使ってみたのは、初めてですが、
使う前は、日本語関連の処理が厳しいのかな・・・と思っていたのですが、
日本語関連も、問題なく使えている印象です。# ファイルのエンコードはUTF-8(BOM無し)。
(まだ、数時間した使っていないので、もしかしたら、色々、細かい点で問題など出てくるかもしれませんが・・)

ZeosLibも(SQLiteだけしか確認していませんが)、きちんと動作しているようです。
DBGridもDelphi(VLC)のDBGridと同じような感じで使えるみたいですし・・


少し驚いたのは(Twitterにも書きましたが)、Delphiでは TStringGridを継承して自前で処理を追加していた機能が、
Lazarus のTStringGridでは、標準の機能として実装されていたことです。(文字列の右寄せ・中央寄せ、ボタン表示、その他いろいろ)


Delphiを使っている方ならば、Lazarusは、それほど戸惑うことなく使えるのでは・・・と思いますので、
興味がある方は、使ってみるのも良いかと・・



[11649] Re:Lazarus返信 削除
2018/1/3 (水) 11:21:21 Mr.XRAY
▼ igyさん

> Delphiを使っている方ならば、Lazarusは、それほど戸惑うことなく使えるのでは・・・と思いますので、
> 興味がある方は、使ってみるのも良いかと・・


かなり前ですが,Lazarus をスントールしたことがあります.
確かに Delphi とは違和感はないですね.
その時は微妙な違いはあるものの,使えるという感じでした.
TStringGird の機能は便利ですね.


[11655] Re2:Lazarus返信 削除
2018/1/5 (金) 01:09:11 taka
▼ Mr.XRAYさん
> ▼ igyさん
>
> > Delphiを使っている方ならば、Lazarusは、それほど戸惑うことなく使えるのでは・・・と思いますので、
> > 興味がある方は、使ってみるのも良いかと・・
>
> かなり前ですが,Lazarus をスントールしたことがあります.
> 確かに Delphi とは違和感はないですね.
> その時は微妙な違いはあるものの,使えるという感じでした.
> TStringGird の機能は便利ですね.


1.6はバグだらけで 使えない判定しましたよ
1.8は触っていませんが1.8もさほどかわらいかもと思っています

imeの切り替えが実装されていません

pointerの関数の扱いがdelphiと違います
アドレス関係の関数が異なっていた記憶があります

イベントとかの順序がdelphiと違う場合があります

format関数もgとか年号に対応していなかったような記憶が

fpcとlazarusはLCLのイベント関係のバグが多いので
複雑なアプリはやめたほうがいいです



[11671] Re3:Lazarus返信 削除
2018/1/13 (土) 22:03:42 taka
日付文字列 → TDateTimeへの変換を試してみました。

結果

# Delphi
# VarToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
1928/02/01 00:02:00 : 昭和3年2月1日0時2分
1928/02/01 00:03:00 : 昭3/2/1 0:3
1928/02/01 00:04:00 : S3/2/1 0:4
# StrToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
1928/02/01 00:02:00 : 昭和3年2月1日0時2分
1928/02/01 00:03:00 : 昭3/2/1 0:3
Error : 2003/02/01 00:04:00 : S3/2/1 0:4

# FPC
# VarToDateTime
1928/02/01 00:01:00 : 1928/2/1 0:1:0
Error : 昭和3年2月1日0時2分
Error : 昭3/2/1 0:3
Error : S3/2/1 0:4
# StrToDateTime
Error : 1928/2/1 0:1:0
Error : 昭和3年2月1日0時2分
Error : 昭3/2/1 0:3
Error : S3/2/1 0:4

 ---------------------

コード

procedure TForm1.Button1Click(Sender: TObject);
 const data : array[0..3] of string = (
          '1928/2/1 0:1:0',
          '昭和3年2月1日0時2分',
          '昭3/2/1 0:3',
          'S3/2/1 0:4');
 var
   i: integer;
   JPNEraFormat: TFormatSettings;
   strDate, strDate2 : String;
   timestamp: TDateTime;
begin
{$ifndef FPC}
  JPNEraFormat := TFormatSettings.Create('ja-JP');
{$ENDIF}
  JPNEraFormat.ShortDateFormat := 'ggee/m/d';

  Memo1.Lines.Text := '# '+ {$ifdef FPC}'FPC'{$ELSE}'Delphi'{$ENDIF};

  Memo1.Lines.Add('# VarToDateTime');
  for i:=low(data) to high(data) do
  try
    strDate2 := FormatDateTime('yyyy/mm/dd hh:mm:ss',
                    VarToDateTime(data[i]));
    strDate2 := strDate2 + ' : ' + data[i];
    if ('1928' <> Copy(strDate2, 1, 4)) then
      Memo1.Lines.Add('Error : '+ strDate2)
    else
      Memo1.Lines.Add(strDate2);
  except
    Memo1.Lines.Add('Error : ' + data[i]);
  end;

  Memo1.Lines.Add('# StrToDateTime');
  for i:=low(data) to high(data) do
  try
    strDate := data[i];
    strDate := StringReplace(strDate, '年', '/', []);
    strDate := StringReplace(strDate, '月', '/', []);
    strDate := StringReplace(strDate, '日', ' ', []);
    strDate := StringReplace(strDate, '時', ':', []);
    strDate := StringReplace(strDate, '分', '', []);
    strDate2 := FormatDateTime('yyyy/mm/dd hh:mm:ss',
                    StrToDateTime(strDate,JPNEraFormat));
    strDate2 := strDate2 + ' : ' + data[i];
    if ('1928' <> Copy(strDate2, 1, 4)) then
      Memo1.Lines.Add('Error : '+ strDate2)
    else
      Memo1.Lines.Add(strDate2);
  except
    Memo1.Lines.Add('Error : ' + data[i]);
  end;
end;



[11672] 日付文字列 → TDateTimeへの変換返信 削除
2018/1/14 (日) 11:06:09 taka
VarToDateTime, StrToDateTime
を使った日付変換は、
fpcで見事に撃沈されてしまいましたが

Win apiのVarDateFromStrを使えば
fpcで日付の変換ができることがわかりました。

FPCは、 Active-X / OLE objects に対応していないので
関数を自分で定義する必要あります

結果
# Delphi
H30/1/2 3:2:1 ---> 2018/01/02 03:02:01
平成30年3月1日 ---> 2018/03/01 00:00:00

# FPC
H30/1/2 3:2:1 ---> 2018/01/02 03:02:01
平成30年3月1日 ---> 2018/03/01 00:00:00

 code[utf-8] -----------------------

{$ifdef fpc}
//{$codepage utf-8}
function VarDateFromStr(const strIn: WideString; alcid: DWORD;
    dwFlags: Longint; out dateOut: Double): HRESULT; stdcall;
    external 'OleAut32.dll' name 'VarDateFromStr'; overload;
function VarDateFromStr(const strIn: WideString; alcid: DWORD;
        dwFlags: Longint; out dateOut: TDateTime): HRESULT; stdcall;
        external 'OleAut32.dll' name 'VarDateFromStr'; overload;
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms221395(v=vs.85).aspx
// TDateTime, DATE型は0の開始日は同じ
{$endif}

procedure TForm1.Button2Click(Sender : TObject);
  const dataText : array[0..1] of WideString = (
                   'H30/1/2 3:2:1', '平成30年3月1日');
// fpc: 「ファイル設定 : エンコード: UTF8-BOM付き」以外になっていると漢字が破損します
  var
      Adatetime : TDateTime;
      i : Integer;
      s : string;
begin
  Memo1.Lines.Text := '# '+ {$ifdef FPC}'FPC'{$ELSE}'Delphi'{$ENDIF};
  for i:=0 to High(dataText) do
  begin
    Adatetime := 0;
    s := dataText[i] + (' ---> ');
    if (S_OK = VarDateFromStr({$ifdef FPC}dataText[i]{$ELSE}PWideChar(dataText[i]){$ENDIF}
             , GetThreadLocale, LOCALE_NOUSEROVERRIDE, Adatetime)) then
      s := s + FormatDateTime('yyyy/mm/dd hh:mm:ss', VarToDateTime(Adatetime));
    Memo1.Lines.Add(s);
  end;
end;



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82