Home > Software Tips > Delphi
Last Update 2015.04.19
現在は、最新版の2010を使っています。2009の段階でUnicodeに切り替わったので、古いプログラムのうち、SHIFT JISを暗黙の前提に型変換などをしているプログラムは修正が必要です。
メーカーはボーランド社からEmbarcadero Technologies社に変わっています。
最近の映画の来場者特典にガチャ的なものが増えた。「5種類の中から1つをプレゼント」というようなものだ。
これをコンプリートしようと思ったら、同じ映画を何回も観なくてはならない。一体何回観に行ったら、コンプリートできるんだろう。
仮に5種類だとすると、
1種類目は無重複→1回目でGet
2種類目は4/5で無重複→1.25回でGet
3種類目は3/5で無重複→1.667回でGet
4種類目は2/5で無重複→2.5回でGet
5種類目は1/5で無重複→5回でGet
全部で11.417回
これはCASIOが運営しているkeisanサイトでも計算できる。単純計算12回で揃うと期待できるということか。
検索をしてみると、こういうものはcoupon collector's problemと呼ばれる数学の問題になるらしい。びいたまブログの2010年3月29日のエントリを参照。
結局、先日の計算は期待値でしかないので、どれくらいの確率で揃うのかは判らないということか。
で、何回目の試行で揃うのかという確率の計算の仕方がびいたまブログの2010年4月6日のエントリで書いてあったのだが、アイテム数の変化に対応させるのが表計算ソフトでは面倒。そこでガチャをコンプする確率の計算をするプログラムを書いてみた。
期待値や確率の計算は
カシオのサイト
ここのエントリ
を参考にした
この計算結果によると、5アイテムの場合、
5回目で揃う(無重複)確率は3.84%
8回目で揃う確率が最も高いが、それでも10.75%、累計で32.26%
12回目(前回エントリの期待値を下回らない整数回)で揃う確率は、7.16%、累計で67.80%
そうか、この時点では1/3の人はまだコンプリートできない可能性があるのか。
累計が90%を超えるのは18回目、
更に繰り返して21回目での累計は95.41%なので、ここで揃わない人々は無重複の人(3.84%)の対極の存在である不幸な人々(22回目の累計が96.32%で96.16%を突破する。)ということになるのかな。
スマートフォンの機種変更をしたら、キャリアメールのアプリがハードメーカー製のものに変わってしまった。
今まではこれをeml形式でエクスポートして保存していたのだが、新しいメールアプリはSMSはVMSG形式でしか保存できない。ところが、PC側のアプリはVMSGを開けないので、eml形式に変更してやる必要がある。
検索するといくつかのvmg2emlが見つかるのだが、対応するVMSG形式が違うのか、思ったような変換をしてくれないので、変換プログラムを作れないか調べてみた。
出力されたvmgとemlを見比べると、SMSが元だけにデータの並びはシンプルで、比較的簡単にできそうな気がした。
問題は、QuotedPrintableの本文
データの記述を見ると、
ということらしいので本文から「=」を取り除きながら、得た文字コードをUTF8として解釈してやれば良いってところは判った。
DelphiにはIndyというインターネット関連の処理をするコンポーネント群があって、使えそうに見える。その中に、「IdDecoderQuotedPrintable」というまさにこれの為のようなコンポーネントがあった。
これでDecodeしてやれば楽勝!!
と思ってやると、確かに「=」を取り除いてデコードはしてくれるのだが、マルチバイト文字が別々の文字になってしまう。
例えば「に」は「E381」なわけだけど、「E3」と「81」という2文字で帰ってくる。
これを1つの文字に直さないといけないのだが、これを処理しようとしたら、1文字づつコードを見てエスケープされていた文字かどうかを再判定する必要があるような気がする。
そうすると、「IdDecoderQuotedPrintable」を使う意味が無くなってしまう。
これのオプションでキャラクタセットをいじるとか何かできないだろうかと探しているのだが、見つからない。
残った文字コードの変更、とりあえず文字数分単純にループするだけ(エスケープ判定なし)で対処できた。
procedure TForm1.Button2Click(Sender: TObject);
var
s1:String;
u8:UTF8String;
cl,i:integer;
begin
s1:=IdDecoderQuotedPrintable1.decodestring(memo1.text);
cl:=length(s1);
u8:=StringOfChar(#00,cl+2);
i:=0;
while i<(cl+1) do
begin
u8[i]:=ansichar(S1[i]);
i:=i+1;
end;
memo2.Text:=utf8tostring(u8);
end;
memo1に変換のための文字(utf8の文字列をQuotedPrintableでエスケープしたもの)を貼り付けて、Button2をクリックすると、デコード後の文字列がmemo2に貼り付けられるという動作になってます。
2013/05/09
Delphi XE4が出た。
今まで使っていたのはDelphi2010で、バージョンアップキャンペーンで購入できる最後の機会になったので、奮発して購入することにした。
今Delphiについてくるレポートツールは英語版のRave Reportです。これの使い方は、こちらのサイト(株式会社基創のDelphi Tips)が詳しいようです。なお、使い方以前の問題として、Rave Reportの出すダイアログ類が英語なので、他人に使わせるソフトだと、そこを日本語化しないといけません。以前開設していたBLOGでコメントを頂いたので、その応用で今自分の環境は日本語化しています。
今検索してみても、なかなか情報がないので、閉じてしまったBLOGの中から、Rave Reportに関連するエントリーとコメントを抜粋して以下に再掲します。コメントして下さった方々ありがとうございました。
Rave Reportをなんとか使おうと色々検索してみたが、根本的な解決策が見つからない。
ダイアログなどの日本語化については、Delphi8の頃の記事で、「\Borland\BDS\3.0\RaveReports\Lib」にある「RpFormSetup.dfm」などをテキストエディタで編集するという技があり試してみた。
ボタンの「Setup」やラジオボタンキャプションの「Preview」などは、これで実際に変更できたが、グループボックスの「Selected Printer」はフォントが設定できないためか文字化けしてしまう。また、ラジオボタンキャプションの「File」はその後ろのコンボボックスとの距離がないため、文字を変更しても使い物にならない。
根本的にレイアウトを直さないとダメなようだが、Delphiパッケージのエディションではそれはできないようだ。
QuickReportもRaveReportも開発元からアップグレード版などを購入するのに日本円で3万円程度かかるようだが、この金額を払って更に日本語処理がダメだと話にならない。
Borlandはいったい何を考えているんだ。
では、日本で開発されているDelphi(Win32)から利用できるレポートツール(配布先の環境から、ActiveXも使いたくない、せめて同じフォルダのランタイムDLL、理想は本体にそのまま組み込めること)を探してみると、JIVE Reportなどいくつか見つけたが、これは開発版だと10万円くらい、とても素人のツールとして購入できるものではない。
lightReport2というのもあるらしいが、こちらはD2005でうまくコンパイルできない。(やりかたが悪いのか?)あとは、Mr.XRAYのサイトにある印刷プレビュー制御コンポーネントか。ただ、データベースレポートやプログラム内部で処理したテキストをとにかく何も考えずに印字したいという目的~印字のためのコーディングの手間を最小化する~には不適当なようだ。
ほかのレポートツールを探しても、値段が高い、D2005未対応などどれもだめ。
D2005へのアップグレードは、無駄な出費だったかな。
D2005の紹介にWin32でのレポーティングツールが役に立たないとは書いていなかったし、これまでのものがすべてあると書かれていたはず。
Borlandのサイトのトップページに、
「僕、こんなの注文してません。」
というコピーがあるが、それをそのままBorlandに返したい。
(・-・)さん、2005/04/17 11:59:00 AM
>ボタンの「Setup」やラジオボタンキャプションの「Preview」などは、これで実際に変更できたが、グループボックスの「Selected Printer」はフォントが設定できないためか文字化けしてしまう。
できますけど・・・
>また、ラジオボタンキャプションの「File」はその後ろのコンボボックスとの距離がないため、文字を変更しても使い物にならない。
ビジュアルで変更できますけど・・・
(・-・)さん、2005/04/17 11:59:12 AM
操作方法
必ずオリジナルをバックアップ。
どこか適当なディレクトリでRpFormSetup.dfmをおき
ニューフォーム生成して保存 unit.PASの中身を。unit RpFormSetup; var RPSetupForm: TRPSetupForm;
にすり替え,RpFormSetup.Pasに名前を変える。
RpFormSetup.pasをクリックで開き直す。このみのレイアウトに編集をする。
イベントが消去されるので!!
Delphiで 保存は絶対してはダメ!!編集が終わったら、 フォームを右クリックして
エディタで表示を選ぶ。
全部選択して コピーする。メモ帳などで、libのRpFormSetup.dfmに丸ごとはりつける。
しつこいけど Delphiでは、絶対保存しないこと
DelphiのRpFormSetupを 保存せずに閉じる。アルバトロス、2005/04/19 07:39:55 PM
Rave Reportのローカライズ試してみました。
どこに違いがあるのかわかりませんが、いくつか操作方法を変更する必要がありました。
- 私の書いた部分の文字化けは、FormのCharsetを「SHIFTJIS_CHARSET」に変更することで、全てのキャプションが日本語表示可能になりました。
- フォームの右クリックからエディタで表示を選ぶと「モジュールRpFormSetupでエラーが発生しました。TRPSetupFormクラスの宣言が無いか間違っています.」となってしまい、やむなく、別フォルダではDelphiから上書きをしたうえで、RpFormSetup.dfmを元の場所にコピーすることで対応できました。同様な方法で「RpFormPreview.dfm」も編集できました。
コンパイルしてみたところ、フォームキャプションなどコードで生成しているであろう文字列が元にもどってしまいます。
プレビューの場合、総ページ数の表示が「of 3000」がデフォルトになっているものを「/ 3000」にしたいのですが、コードで「of」から生成されてしまいます。
(・-・)さん、2005/04/19 10:52:24 PM
>プレビューの場合、総ページ数の表示が「of 3000」がデフォルトになっているものを
>「/ 3000」にしたいのですが、コードで「of」から生成されてしまいます。文字を同じ長さか短くするだけなら、dcuをいじるとなんとかなることがあります。
フリーのStirling というバイナリエディタ(vector.co.jpにころがっています)で
ofを検索。 2個ひっかかります。 最初のofが
どうも of 3000のofっぽいです。ofの2バイトを置き換えるといいです。 0いれると、どうも終端文字とみなすようなので
[of]→[ /][/ ][/]片方をどちらかスペースでうめるか、ofを全角の/にするといいです。
(2個目のofは何かわからないのでさわっていません。)上のほうの方法でフォームのフォントを日本語のフォントに変更した後
全角の/に変えると表示できました。
書き換えを間違うと動作しなくなるので、オリジナルはバックアップしていたほがいいです。(・-・)さん、2005/04/19 11:23:40 PM
>・フォームの右クリックからエディタで表示を選ぶと「モジュールRpFormSetupでエラー
謎ですね?
サンプルコードのせますDelphiはDelphiで保存をすると要らないコードを消しますので
Delphiで保存をおすとたいへんなことになりますので、
フォームをエディタで表示をしてコピーし、メモ帳で開いた物に貼り付けて、
メモ帳などから保存しますます
作業フォルダにおくダミーファイルの例です注)\RaveReports\Libフォルダには絶対置いてはいけません。
unit RpFormSetup; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TRPSetupForm = class(TForm) private public end; var RPSetupForm: TRPSetupForm; implementation {$R *.dfm} end.
(・-・)さん、2005/04/20 12:53:30 AM
>コンパイルしてみたところ、フォームキャプションなど
>コードで生成しているであろう文字列が元にもどってしまいます。RvProject1.Execute;では ちょっと探しましたが
わかりません。RvSystem1.TitlePreview := 'タイトル'; RvSystem1.Execute;
でタイトルつけれるので、
どこかにありそうですがみつかりません。RvProject1の設定
みつけたら、書き込みます(・-・)さん、2005/04/21 12:28:44 AM
みつかりました
RvProject1.Engine := RvSystem1; RvSystem1.TitlePreview := 'タイトル'; RvProject1.Execute;
アルバトロス、2005/04/24 03:07:36 AM
色々調べていただいてありがとうございます。
RvSystemコンポーネントのプロパティを設定すると言うことですね。
さっそく貼り付けているコンポーネントを見てみると、
TitlePreviewの他にも、TitleStatusやTitleSetupもありました。これらに日本語のタイトルを入力したところ、めでたくタイトルが日本語に変わりました。
また、レポートステータスの作成中を示す文字列も、SystemFilterのStatusFormatを書き換えてやることで日本語メッセージが出せるようになりました。
それなりにできたつもりだったが、データに応じた領域の拡張に困った。
DataTextコンポーネントのTruncateをFalseにすると、収まらない文字の切り捨てをしないのだが、折り返しをしてくれるわけではないみたい。
DataMemoコンポーネントを使ってやり、ExpandParentをTrueにすれば、拡張すること自体はできるのだが、折り返し時に2バイト文字が泣き別れ...
どうしたらいいんだぁ...
まだ移行させていないプログラムは日本語をMemoに流し込んで折り返しなどはQuickReportにおまかせだったやつがあるんだよなぁ。
これ、長文を流し込んだら大変なことになるかも。
いろいろ探してみたが、どうもQuick Reportはないようだ。
しかたがないので、Rave Reportに移行させることにする。
グループヘッダの作り方とか集計値同士の計算とかいろいろ苦労した(意外な落とし穴もあり)が、Wizardで作るシンプルな表よりは踏み込んだ(でも基本的な)帳票は作れるようになったつもり。
ただ、Rave Reportが日本語版ではないためか、印刷設定のダイアログが英語で表示されてしまう。
簡単なダイアログではあるけれども、自分で使うならいざ知らず、他の人に配るものの場合は、どうしたものだろうか...
どこかにダイアログを日本語化する方法があるのかなぁ。
#インストールCDに不具合のあるものがあったとかで、
#新たなCDのセットが送られてきていた。
#早くもパッチが出ているらしいが、Pro版はまだ未対応らしい。
今(2010)はProより下のラインナップがないのであんまり意味ないのですが、6の頃は無料版などいろいろあったのです。そんななかでProを選んだ理由、それは、データベース機能が欲しかったんです。
昨年Personalがダウンロードして使えるようになった時点で登録ユーザにはなっていたのですが、Personal版にはデータベース機能がないため、一大決心でProfessional版を購入しました。
Approachに挫折して、改めてデータベース製品を探したのですが、dBase(やその流れを汲むVisual dBase)とかParadoxなど、SQLやクエリーが使えるRDBはもうほとんどないんですね。DBProとかも試用版を使ってみたのですが、桐と同じで連結テーブルが遅いし使いにくい(単独で使う分にはめちゃくちゃ便利なんですがね。昔Accessを始めた頃、桐で普通に作った表機能は、Accessでかなり作り込んだフォーム並の能力があると感じてましたから。)。であちこち探していたら、Delphiならそこらへんができそうな感じだったので、乗り換えを行ったのです。
Approachのためにコンバートしたデータを再度Paradoxに戻さないといけない。データベースデスクトップというツールがあって、基本データ型のデータ編集やテーブルの構築ができるので、これで変換をちまちまするんだけど、メモ型などのBLOB型フィールドがついているとちょっとうまくコンバートできないこともあったりしてちょっと苦労しています
データベースを使うためにDelphiをどう使うかというと…ParadoxなどのRDBアプリほど簡単ではないけれど、だいたい同じ感じ。フォームにコンポーネントを配置してプロパティを設定するだけ。これで基本的なフォームは完成です。しかもアプリウィンドウの中のフォームではなく、完全な独立ウィンドウで動きます。
これで実行すれば、とりあえず動きます、はじめの設定がちょっとややこしいことと、リンクの構築にGUIがないくらいでとてもプログラミングをしているとはいえないのですが、これで独立した実行ファイルになっちゃうんです。(BDE自体は別途必要ですが)なんかブロックで遊んでいるかのような感じです。
Diaryにも書いたが、2002年4月から単身赴任生活を始めた。この関係で、今まで必要なときにスプレッドシートでちょこちょこやっていた家計管理をきっちり作った方が良いと考えた。暇で寂しい休日の午後(午前中は掃除や洗濯で忙しい)の暇つぶしにもなる。
ここで月次集計や科目別集計をさせようとして、いろいろ苦労した。問題解決に当たってはBorland社のサイトやDelphi Acid Floorが大変参考になった。感謝します。
今までデータベースソフトで当たり前のように使っていたrequeryとかが見つからない。条件で表示色を変えようとしたら、オーナー描画を行わなければならず、オーナー描画ではalignプロパティが効かない(オーナー描画だから当たり前といえば当たり前)、クイックレポートのグループフッタの集計がグループごとにリセットされない状態がなぜかデフォルトで、グループごとの集計ができるように切り替えるプロパティを見つけるのに時間がかかった。
このクイックレポート、Delphiからすれば高機能でありがたいコンポーネントだけど、AccessやParadoxから見たら低機能だよね。おまけに勉強はdemoで見ろなんて書いてあったけど、↑とかのプロパティの設定方法なんかわかりにくい!!まぁ、帳票なんて滅多に作らないから(普通は画面だし)
あと残っているのはクロス集計かな。でもこの機能professional版はダメなんだよな。なんか別の方法考えないと...