喫茶XRAYトップページ

[スレッド全体
]

[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のイベント関係のバグが多いので
複雑なアプリはやめたほうがいいです



[11657] Re3:Lazarus返信 削除
2018/1/5 (金) 07:40:21 igy
▼ takaさん
> imeの切り替えが実装されていません

確かに、TEditなどにImeModeプロパティがありませんね。

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

FormatDateTime('gge年m月d日', DateTimePicker1.Date);
で試してみると、和暦の表示がダメでした。


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


Delphiと比べると、やはり、色々あるのですねぇ。


TStringGridでは、標準の機能で下の図のような感じのができたりするので、
割と良さそうな気がしたのですけどね・・


[11658] Re4:Lazarus返信 削除
2018/1/5 (金) 21:52:24 Mr.XRAY
う〜む.Lazarus は問題ありですか...
難しいのぉ〜.


[11659] Re4:Lazarus返信 削除
2018/1/6 (土) 22:20:19 taka
▼ igyさん
> TStringGridでは、標準の機能で下の図のような感じのができたりするので、
> 割と良さそうな気がしたのですけどね・・

GridでUnicode扱わないならいいですけど

Lazarusで
1WordでおさまらないUnicode(Unicode絵文字)は、誤動作の対象なので
気を付けてください

1.8の12月リリースで直っているのかは試していないので謎です。

Unicode(絵文字)は
Windows10のタスクバーの
ペンみたいなマークを右クリックして
「タッチキーボードボタンを表示」にし
→ キーボードマークをクリック
→ 顔のマークをクリックするとクリックで入力できます

タッチ経由の入力と
KeyPress eventがUnicode(絵文字)に反応しなかった記憶があります


[11660] Re5:Lazarus返信 削除
2018/1/6 (土) 23:40:40 taka
いまfpcの最新版に入れ替えて、lazarusのsvnの更新をしてrebuildしました。
dev1.9.0 2018-01-06 + fpc3.0.4
では、タッチキーボードから入力はできるようになっていますが、
keyイベントが反応しない文字があり
まだ絵文字問題は完全には修正されていないようです。


AnsiToUtf8:期待した値が返ってきません。(※Delphiでは表示できます)

procedure TForm1.Button1Click(Sender : TObject);
begin
  Edit1.Text := AnsiToUtf8(RawByteString(#$82#$a0));
end;


[11661] Re5:Lazarus返信 削除
2018/1/6 (土) 23:50:00 igy
▼ takaさん
情報ありがとうございます!

> タッチ経由の入力と
> KeyPress eventがUnicode(絵文字)に反応しなかった記憶があります


OnkeyPressイベントを確認してみると、確かにIMEパッドから絵文字を選択しても、反応していないようですね。

> GridでUnicode扱わないならいいですけど

入力してSQLiteに保存・Gridに表示してみると、一応、表示しているようです。


[11662] Re6:Lazarus返信 削除
2018/1/7 (日) 00:14:03 taka
▼ igyさん
> ▼ takaさん
> 情報ありがとうございます!
>
> > タッチ経由の入力と
> > KeyPress eventがUnicode(絵文字)に反応しなかった記憶があります
>
> OnkeyPressイベントを確認してみると、確かにIMEパッドから絵文字を選択しても、反応していないようですね。
>
> > GridでUnicode扱わないならいいですけど
>
> 入力してSQLiteに保存・Gridに表示してみると、一応、表示しているようです。

WM_CHARがからむと勝手にutf8に書き換えようとして誤判定して
理解できない文字は消去して返すみたいです


[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