スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Lazarus特練 タイマーアプリを作ってみる(4)

前回の積み残しを調べてみました。

TGraphicsDrawEffect =
(
gdeNormal, // no effect
gdeDisabled, // grayed image
gdeHighlighted, // a bit highlighted image
gdeShadowed, // a bit shadowed image
gde1Bit // 1 Bit image (for non-XP windows buttons)
);
TImageList.Drawの最後の引数に、Trueを渡せばTGraphicsDrawEffectのgdeNormal、FalseならgdeDisabledが使われているようで、実際他のものも試してみましたけど、今回の目的には必要なさそうでした。

***
次に進みます。
描画の方は落ち着いたので、データの持ち方を考えると気がきました。さて、どうしようか。
2種類あることはわかっています。
ウルトラマンのカラータイマー的なのと目覚まし時計的なの、の2つです。

例えば
カラータイマーの設定値 3分20秒(経過したら何かが起きる)
目覚まし時計の設定値 2012年6月3日13時25分30秒(になったら何かが起きる)

でいいんですが、フラグと日付、でしょうね。やっぱり。

[Timer]
ColorTimer=False
Time=2012/6/3 13:25:30

だったら、2012/6/3 13:25:30 かどうかを確認し続けて、以降になれば何かをする。

[Timer]
ColorTimer=True
Time=2012/6/3 13:25:30

だったら、開始した年月日時分から数えて、2012年と6ヶ月と3日と13時間と25分と30秒後に何かをする、っていうのはあまりにアホすぎる。BLAME!じゃあるまいし、17,629,525時間と25分30秒たった後に何か意味があると思えないです。

普通に考えると、カラータイマーはその日の内に使うと考えて十分。もし途中でパソコンがシャットダウンしたらもう忘れてもいいかも。
でも、5時間後に、って設定してて、何かの都合で再起動することもあるだろうから、その時にどう復帰するかは考えておかないとだめかも。ま、後回しで。

そもそも「何時間後」っていうカウントダウンは、使うかなぁ。いや使うな。
うーん。じゃ、テストしやすいカラータイマーに限定して考えることにします。

で、1日が24時間なのでそれ以上の時間設定は不要、作っても誰も使わないもちろん自分も使わない、とします。すると年月日を無視して時分秒だけ使うようにすれば日付として保持できます。

[設定日1]
Enabled=True
Message=Hello World!
Time=2012/6/2 00:03:00

***
そう、その前に日付の表示形式について調べておくことにします。もうウロウロしますけど。
ちなみに、Delphi6 Personalのヘルプだけは今でもかなり使えます。何は無くともこれはインストールしておくべきです。

FormatDateTimeに曜日や「年」などの日本語を表示しそうな形式文字列を渡すと化ける?今、Lazarusで初StringGridを使ってテストしてるんですが、年号とかもダメ。

ひょっとすると、DelphiとLazarusで渡せる形式文字列に差があるのかも。さっきDelphiのヘルプが役に立つと書いたとおり、形式文字列に関しては、Delphiで使える文字列をごっそり渡してテストしています。

わかりました。UTF8のことを忘れてました。
FormatDateTimeの戻り値をTStringGrid.Cellsに代入する前にUTF8に変換しておかないとダメでした。といっても、理解してやってるわけじゃなく、

Grid1.Cells[0,0] := UTF8Encode(FormatDateTime(省略));

とやったらうまくいっただけで。

でも、e,ee,g,gg の4つ、元号を使う形式は無視されてしまいました。エラーにならないので予約されてるのかもしれません。



FormatStrFormatDateTime
yyyy/mm/dd"("ddd")"hh:nn:ss:zzz2012/06/03(日)21:12:51:764
c2012/06/03 21:12:51
d3
dd03
ddd
dddd日曜日
ddddd2012/06/03
dddddd2012年6月3日
eE
eeEE
gG
ggGG
m6
mm06
mmm6
mmmm6月
yy12
yyyy2012
h21
hh21
n12
nn12
s51
ss51
z764
zzz764
t21:12
tt21:12:51
am/pmpm
a/pp
ampmPM
//
::


fc2のエディタで、<table>タグを使うときに、見やすさ重視で改行を入れまくると、大変なことになりますね。改行無しで書かないと表の前に</table>までに使った改行の数だけ消せない改行が入ります。

ところで、StringGridの内容をtableに吐き出すのは、こんな感じで。
procedure TForm1.MenuCopyClick(Sender: TObject);
var
i, j: Integer;
LGrid: TStringGrid;
LRect: TGridRect;
LLine: String;
begin
LGrid := Grid1;
FStrBuf.Clear;
FStrBuf.Add('<table border="1" cellspacing="1" cellpadding="1">');
LRect := LGrid.Selection;

for i := 0 to LGrid.FixedRows - 1 do
begin
LLine := '';
for j := LRect.Left to LRect.Right do
begin
LLine := LLine + Format('<th>%s</th>', [LGrid.Cells[j, i]]);
end;
FStrBuf.Add(Format('<tr>%s</tr>', [LLine]));
end;
for i := LRect.Top to LRect.Bottom do
begin
LLine := '';
for j := LRect.Left to LRect.Right do
begin
LLine := LLine + Format('<td>%s</td>', [LGrid.Cells[j, i]]);
end;
FStrBuf.Add(Format('<tr>%s</tr>', [LLine]));
end;
FStrBuf.Add('</table>');
FStrBuf.Text := StringReplace(FStrBuf.Text, #13#10, '', [rfReplaceAll]);
FStrBuf.SaveToFile(ChangeFileExt(ParamStr(0), '.txt'));
end;

選択範囲だけをテキストファイルに吐き出すんですけど、さすがにタイトル行はつけとく方向でやってます。なーんにも進んでませんが、今回は終わりです。
関連記事
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。