2013年12月21日土曜日

Nixie(ニキシ管) 風 コンポーネントの作成

Delphi Programing

皆様、こんにちは、やましょうです。

今週は、忘年会等、いろいろお世話になりました。


さて、今回はネタもなくいろいろ考えた末に、@luxideaさんからの要望もあり。

Nixie(ニキシ管)っぽいのコンポーネントを作成してみたいと思います。

まず、ニキシ管って何?と言う方もいらっしゃるとおもいます。
ニキシ管はこれです

今回はロシア製のIN-12っぽいコンポーネントを作成してみたいと思います。


さて、コンポネントの設計です。

まずは方法論の検討です。
1.設定値を見て、画像を更新して表示
2.設定値を見て、線や関数を使って描く


1.の方法は既に画像が、フリーの画像がありました。が、最終製品でないと不味いような・・・・・
でも良い様な。。確認の時間の関係で、色が変更できない等等の理由で、パスとなりました。

2.線や関数を使って書くを仕方なく選択です。
しかも縦横のサイズが変わるとどうしても汚く見えたりするので、縦横比は横1: に対して:縦√2とします。これ以外ではきれいに表示しなくても仕方ない!と今回は割り切りいたしました。
さて、先日の7セグの場合ですと、周りを線で引いて中に色をつける方法をとりました。
たぶんPathとか使って行うとできるのだろうとは思われますが、時間がないので取り急ぎ、
Strokeの線を太めにとって作る事としました。だいたい、数時間で出来たのですが、
字のバランス調整でかなり手間取りました、0~9 ," .", ":"しかでません。が、もうやっつけ
力技でデバッグしてなんとか出来ました。(StorkeだけでできるのがFmxって凄い!)


画面はこんな感じです。

今回はこの縦横値で作成したためこれ以外だと汚くなります。
上はストップウオッチ/下は適当な値の表示です。


取りあえずβ版をここからダウンロードできる様にしておきます。
(2014/1/03 Path使用版をリリースいたしました。よってベータの配信は終了いたしました。)



ともかく、何とか形になりましたが、ブラシアップが本当に必要なレベルですね。。。
A..zまでも表示させたいですし、もうbmp化しちゃえと言う気もするのですが、
やっぱり容量とか色とかいろいろ考えると。。。っていつの時代だって話なのですが。。。
現在、グラデーションも検討状態です。

しかし、Fmxで作成してみるとわかるのですが、
delphi+fmxって
本当に凄い!!

だってこんなコンポーネントが簡単にできるんですよ。。
しかも、携帯端末(iosなど)で動くのですから。。

いや、本当に最近の開発は、楽になっていて本当にびっくりでした。みなさんもコンポーネント作成してみてください。

追記:ブラシアップは順次して行く予定です。


インストールはPackage フォルダーから行ってください。
使用時にパスの追加?が必要になると思います。
ソースはSourceフォルダーです。
テスト用プロジェクトはTestProj フォルダーです。


それではまた、お会いいたしましょう。

2013年12月14日土曜日

Bingo! シャッフル機能の実現。(年末ビンゴ大会までに間に合うのか・・?)

Delphi Programing

先日のデベロッパーキャンプでは皆様に本当にお世話になりました。

やましょうです。

アドベントカレンダー通りにBingo用 シャッフルについて書いてみたいと思います。
 まず、ランダムとシャッフルの定義についてです。


ランダムとは感覚的にいうと適当に数字よ!出て来いということです。
(次に同じ番号が出てくる事もありです。)
シャッフルとは、トランプのカードを1枚づつ抜いていって終了するまでは、
同じカードは出てこない。
と言う差違があります。
最近の音楽プレイヤーとか、シャッフルなのに。。ランダムだったりする場合もあるのです。



まず、Delphi XE3のRandom関数を調べます。。 詳しくコードは書かないけど。。。
なんじゃーこの定数は
$08088405 + 1しかも、あとから1を足したのは何故?
1103515245ではないのは何故?とぶつぶつ呟くのでした。
そして、 {$IFDEF LINUX}をみつけ、早く、ubents対応。。"は・や・く"と思ってしまったのです。(完全に脱線しています。)
 

余談は、さておき、

このRandomルーチンを用いてShffleを実現させる方法を検討します。
  1. 100個のバッファを用意して、その番号が選択済みをか判定し、抽選する。
  2. 100個のバッファを用意して、番号を適当に入れ適当に掻き回す。
  3. 線形合同法を用いて抽選を行った様に見せる。
取り急ぎ、1と2を合わせた適当な、ビンゴアプリができました。
まず、作成時に100個のバッファを用意、適当に番号を挿入しながら、
100個に入れ抽選結果を最初に設定。あとでそれをピックアップするという、
いかにも"何も考えてないだろう"と言われても
反論さえできないソースはこちらです。
 問題点はメモリー100byte食っちゃいますし、
時間だって同じ値がなんども抽選されたら、
と思うと夜も寝れませんね。

ともかく、取りあえず年末、ビンゴに間に合いました。よかったです。

完全にやっつけ仕事になってしました。反省です。

それでは、
3.線形合同法を用いて抽選を行った様に見せる。
を行ってみます。

興味のある方はWikiペディアをご覧ください。
本当にこんな式でできるのかよと思いますよね。
  Xn+1 =  (A * Xn + B)  mod  M
できるんです。
aとxiの2byteで実現できます。
ソースはこちら


メモリーを小さくしたいと思うのはすでに時代遅れかな?
と思いつつ、小さいことは良い事と自分に言聞かせる今日この頃でした。

それではみなさん、また、お会いいたしましょう。


2013年12月7日土曜日

7 セグ(電卓表示)のコンポーネントを作成する。

Delphi Programing

Gitta.comより、お越しいただいた皆様ありがとうございます。
7セグがつくりたくて、7日は頂きました。こんにちは やましょうです。

さて、まず7セグって何??って思われるかたも多いと思います
写真(SL-1274)です。ずばりこれです。これは7セグが2つ+ドット付です。










年末ですし。。
こんな感じの表示で、ビンゴ抽選をしてみたい。。

これをTRectangleとかで作成するととても面倒なことなわけです。
いくら動的に配置しても”めんどくせー” ってあまちゃん気分で言いたくなってしまいます。
まさに電卓の10ケタ表示とかだったら狂気の沙汰です。


早速、設計です。
図を簡単でもよいので書いておくと便利ですね。
”こんな感じに作る!!”とイメージが膨らみます。
(レポート用紙はいただきものです。字が下手です。。)

あとは、各a,b,c,d,e,f,gのデジットに対応してペイントをすれば
良いのです。
設計終了です。




FMX用に作成します。基本的にはVclの時と何も変わらない筈さ!!とつくり始めたのですが、InvalidDataがFmxではない。。Repaintでいいのかな?と思っていろいろやります。
そして、プログラムとは極論、置換でございまして、
置換をすればなんとかなるのです。
Rectangleを真似して作成するのですよ。。。
なぜか、設計時にFillが効かないよ。。。何故??
と思っていろいろ調べたのですが。。。
TRectangleは、プロパティーを引数になっている。。ムム。。。
Canvas.FillRect(R, XRadius, YRadius, FCorners, AbsoluteOpacity, FFill, CornerType);
さて、ここは、カンで。CanvasにFillでFillしちゃえばよいのさ

Canvas.Fill.Assign(Fill);
上記を追加してOK!


できあがったソースはこちらにあります。



さて、これだけ覚えれば、使えるプロパティ

Num 0-15までを入れば数字か文字がでます。16以上では、現在状態保持となります。
10~15はでないだろうと思う方は一度いれてみてください。

SEG_A...F 1Seg毎につけたい方このプロパティをTrue/False 変更してください。また
(Num値を16以上にすれば完璧です16以上で前置保持。)

私は実は、Firemonkeyのコンポーネントはじめて作りましたが、慣れれば、
Vclの時よりプロパティが多くて楽かもと思っちゃいました。
初めて適当に作ったので、誤り等ありましたら御指摘ください。

さて、サンプルを動かすと。。
Windowsですと。。
macでもok

と言う事で動いていますね。
ですが、
シャッフル機能:一度、抽選したらもう終了するまでその数値は選ばれない。
が未実装なので、未だです。
その為
ファイル名がGingoになっています。Bingoになっていない一つ手前なので。
次回その機能の実装を行いたいと思います。

(XE4でサンプルを動かす場合一度ボタンを貼り付けて削除して実行してください。
なぜかエラーが発生。)私は何故かXE3で作成。。。


それでは。。次回、またお会いいたしましょう。