趣味のブログ
OhYeah!-日々発見!!
2024-03-29T16:58:11+09:00
http://www.o-ya.net/modules/d3blog/index.php
Copyright © 2010 OhYeah!
D3BLOG - XOOPS BLOG MODULE
Lazarus DBGrid で (MEMO) 表示対策
http://www.o-ya.net/modules/d3blog/details.php?bid=55
2013-12-15T22:14:25+09:00
2013-12-15T22:16:44+09:00
kabe
お言葉に甘えて、こちらを間借りします。
掲示板の記事は削除してください。
Lazarus版 ACFinder をぼちぼちと作り始めてます。
Windows8.1 + Lazarus 1.0.14 win32版です。
SQLite3 を使った場合...
お言葉に甘えて、こちらを間借りします。
掲示板の記事は削除してください。
Lazarus版 ACFinder をぼちぼちと作り始めてます。
Windows8.1 + Lazarus 1.0.14 win32版です。
SQLite3 を使った場合の固有の問題かどうか不明ですが、DBGrid のデータ表示が実際のデータではなく (MEMO) となることがあります。
この方法で、うまく実際のデータが表示されました。
<a href="http://forum.lazarus.freepascal.org/index.php?topic=19339.0" target="_blank">http://forum.lazarus.freepascal.org/index.php?topic=19339.0</a>
とりあえずサンプルにある
if (DataCol = 1) then
の部分をコメントアウトすると、全てのカラムが処理対象となるようです。
Zipper.pp のバグ
http://www.o-ya.net/modules/d3blog/details.php?bid=54
2013-12-03T21:02:51+09:00
2013-12-03T21:20:06+09:00
OhYeah!
Lazarus の Zipper ユニットは、実に簡単に ZIP アーカーブの圧縮/解凍ができる優れたクラスライブラリです。が、TUnZipper で解凍したときに、解凍されたファイルのタイムスタンプがおか...
Lazarus の Zipper ユニットは、実に簡単に ZIP アーカーブの圧縮/解凍ができる優れたクラスライブラリです。が、TUnZipper で解凍したときに、解凍されたファイルのタイムスタンプがおかしいことに気づきました。具体的には、日付と分秒は OK なんですが、時だけがオリジナルファイルのタイムスタンプと異なります。<br /> ソースを追ってみると、タイムスタンプは ZipDateTimeToDateTime 手続きで内部形式から TDateTime 形式に変換されています。んで、よくよく見ると、時を計算するときに 12 bit も右シフトしてるので、残り 4bit しかなく、これじゃあ 0~15 時までしか表現できません(1bit 余分に右シフトされているので、実際には時の半分の値になります)。正式には、秒 5bit (本来は 6bit 必要だが偶数秒のみ表現することで 5bit に圧縮)、分 6bit、時 5bit なので、11bit 右シフトするのが正解です。<br /> ついでに、H は最上位の 5bit なので、11bit 右シフトすれば、31 でマスクする必要はないですね。<br /><br /><pre class="blogCode"><code>Procedure ZipDateTimeToDateTime(ZD,ZT : Word;out DT : TDateTime);
Var
Y,M,D,H,N,S,MS : Word;
begin
MS:=0;
S:=(ZT and 31) shl 1;
N:=(ZT shr 5) and 63;
H:=(ZT shr 12) and 31; // この行が間違い H:=ZT shr 11; が正しい
D:=ZD and 31;
M:=(ZD shr 5) and 15;
Y:=((ZD shr 9) and 127)+1980;
if M < 1 then M := 1;
if D < 1 then D := 1;
DT:=ComposeDateTime(EncodeDate(Y,M,D),EncodeTime(H,N,S,MS));
end;</code></pre>
Lazarus の SQLite3 絡みのバグでハマった
http://www.o-ya.net/modules/d3blog/details.php?bid=53
2013-11-16T21:46:40+09:00
2013-11-18T00:46:46+09:00
OhYeah!
本業関係のソフト(ACFinder)を Lazarus に移行しようかということで、最近 Lazarus をいじり始めました。ACFinder には SQLite データベース操作が必須のため、標準の SQLite3 コネクタである TSQLite3...
本業関係のソフト(<a href="http://acfinder.kabe.info" target="_blank">ACFinder</a>)を Lazarus に移行しようかということで、最近 Lazarus をいじり始めました。ACFinder には SQLite データベース操作が必須のため、標準の SQLite3 コネクタである TSQLite3Connection をいじってて気づいた点をいくつか。<br /> まず最初につまづいたのが、TSQLite3Connection の ExecuteDirect メソッドや TSQLite3Connect に接続した TSQLQuery の ExecSQL では、ATTACH DATABASE 文が実行時エラーになってしまうところ。ATTACH DATABASE はトランザクション内では実行できないようで、ExecuteDirect や ExecSQL では必ずトランザクションを発行するため、エラーになるようです。<br /> これについては、TSQLite3Connect の protected 節にある execsql メソッドがトランザクションを発行しないので、TSQLite3Connect を親クラスとする新しいクラスで public に置いたメソッドから execsql を呼び出すことで解決しました。<br /><a href="http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-SQLDB-Can-t-attach-second-SQLite-database-because-transaction-td4028432.html" target="_blank">http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-SQLDB-Can-t-attach-second-SQLite-database-because-transaction-td4028432.html</a><br /><br /> ATTACH DATABASE については、ウェブ上に情報もあったのですぐ解決できたんですが、しばらくハマってしまったのが、regexp 演算子の実装がエラーメッセージも出ない原因不明の実行時エラーになってしまうところです。最初は、TRegExpr の使い方が間違っているのかと思ったんだけど、単純なプログラムで動作確認して問題なし。<br /> デバッガでトレースして、sqlite3_result_cint で真偽の結果を返しているところでエラーが発生していることを確認したものの、相変わらず原因は不明。SQLite3 API を定義している sqlite3.inc (ダイナミックローダ sqlite3dyn.pp、スタティックローダ sqlite3.pp でインクルードしているファイル)を眺めていたら、sqlite3_result_int 関数をリンクしなければならないのに、リンクする関数の名前まで sqlite3_result_cint にしてあるのが問題と判明。元々のライブラリの関数名が sqlite3_result_int なので、関数名をこちらに統一して sqlite3.inc を修正しました。<br /> が、修正しただけでは sqlite3dyn.pp を使用するユニットをコンパイルしても、sqlite3dyn.pp がリコンパイルされません。sqlite3dyn.pp を保存し直してタイムスタンプを更新してもダメ。結局、コマンドラインから fcp.exe で sqlite3dyn.pp を(ついでに sqlite3.pp も)コンパイルして、 *.o, *.ppu をライブラリ用ディレクトリに移動しました。<br /> これで解決するかと思ったら、あにはからんや。sqlite3dyn.ppu が更新されると、Lazarus の再構築の際に、今度はそれを使用している sqlite3conn.ppu がリンクできなくなります。で、sqlite3conn.pp もコマンドラインからコンパイルし、sqlite3conn.ppu もライブラリ用ディレクトリに移す必要がありました。<br /><br /> sqlite3.inc を見ると、コメント中の sqlite3_interrupt なんかも sqlite3_cinterrupt になってたりするので、int を全部 cint に置換して、リンクする関数名だけ int に修正し直したようです。で、sqlite3con 等で使用している API については int に修正したけど、sqlite3_result_int は sqlite3_create_function で SQLite の内部関数を拡張しない限り使用しない API なので、修正漏れになったというところでしょうか…。<br /> 夜3時間くらいしか触っている時間がないのに、このバグのせいで3日無駄にしてしまいました<img src="http://www.o-ya.net/uploads/smil4c6419daee8e4.gif" alt="" />。