カテゴリー「CBuilder」の21件の記事

2015-11-26

一定時間アイドル状態が続いたら何かをしたい

アイドル状態を検知したかったので、TApplication::OnIdleイベントハンドラを設定して云々?も思ったが、このイベントは超高頻度に発生してて、ちょっとうまくいかなさそう。

やっぱり、TApplication::OnMessageでマウス移動、クリック、キー操作の時間を取得して、タイマーで最終更新時間との差が一定時間以上だったら、何かの処理を開始すると言うのが、現実的なような気もするが、何かもう少しシンプルにできないもんかなぁ。と、思って実装していない。

今回の場合、一定のアイドル時間で、バックグラウンドで、サーバーからファイルをコピーすると言うもの。すべてのファイルがコピー成功して、成り立つ物なので、コピー中にユーザーの操作があったら、ロールバックするか、コピーが終わるまで待たせないとならない。

もう少し、試行錯誤してみて、それなりに目処が立ったら、ここにサンブルでも書こうと思う。

| | コメント (0) | トラックバック (0)

2015-07-30

TMetafileへの描画が反映されない

TMetafileの扱いで、少し戸惑った。

TMetafileは、キャンバスに描画する際にビットマップのようにはキャンバスにアクセスできない。

TMetafileCanvasのインスタンスを生成してキャンバスを独自に扱う。

このキャンバスに描画するのはわかっていたのだが、問題はキャンバスへの描画がメタファイルに反映されなかったこと。

結果的には、キャンバスのインスタンスが破棄される際に反映されるようなので、描画部分を別関数に抽出してキャンバスインスタンスのライフタイムを制限するようにした。

| | コメント (0) | トラックバック (0)

2015-02-19

TDataModuleはClientHeightプロパティを持っていない

なぜだか知らないけど、時々、TDataModuleを使おうとするとTDataModuleはClientHeightプロパティを持っていないとか、ClientWidthプロパティを持っていないというようなエラーが出ることがある。例外クラスはEReadErrorだったと思う。

クリーンアップをしてみたり、RAD Studioを再起動したり、コンピュータを再起動したりと色々と試してみたんだけど解決しない。

で、当該のTDataModuleをプロジェクトから削除してから再びプロジェクトに追加して実行してみたら解決された。

どういう理由かわからないけど。


続きを読む "TDataModuleはClientHeightプロパティを持っていない"

| | コメント (0) | トラックバック (0)

2014-12-18

VCLのTStringsを検索キーワードのトークナイザー的に使ってみる

8e0db9690b4151a5dfbe4658f929cdba_s

取り敢えず、検索キーワードは、全角、半角のスペース区切りという事にします。

で二重引用符でくくられた範囲は、ひとつのキーワードとする事にします。

TStringsにはStrictDelimiterというプロパティがあります。

このプロパティを使用して,Delimiter が DelimitedText プロパティ内で使用される唯一の値かどうかを指定します。True に設定されている場合,DelimitedText 内の各文字列は,Delimiter の値の文字だけで区切られます。False に設定されている場合は,DelimitedText 内の各文字列をスペース,非表示文字,または Delimiter の値の文字で区切ることができます。

続きを読む "VCLのTStringsを検索キーワードのトークナイザー的に使ってみる"

| | コメント (0) | トラックバック (0)

2014-12-02

Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する

ボタンの下にポップアップメニューを表示したい時など、任意の場所にポップアップメニューを表示したいが、ポップアップメニューのPopup関数に渡す引数の座標はスクリーンの座標なので基準となるコントロールの座標を渡してしまうと、とんでもない所に表示されたりする。

そんな時にTControl::ClientToScreen関数が使える。この関数はconst TPoint&を引数に取って、TPointを返す。どうせならTPopupMenu::Popup関数も引数にTPointが渡せたらいいのに。と、思うが、取り敢えずX座標とY座標を別々に渡す。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TPoint button_point(0, Button1->Height); // ボタンの左下の座標
    TPoint popup_point = Button1->ClientToScreen(button_point); // スクリーン座標に変換
    PopupMenu1->Popup(popup_point.x, popup_point.y); // ポップアップメニューをポップアップ
}

上のサンプルでは、フォームにButton1とPopupMenu1という名前のTPopupMenuを置く。
Button1はTControlから派生していればTButtonじゃなくても問題ないが、ここではとにかくButton1という名前にする。
Button1のクリックイベントハンドラにサンプルのコードを書いておくと、Button1をクリックするとButton1の下にポップアップメニューが表示される。

| | コメント (0) | トラックバック (0)

2014-04-13

DUnitでのTProgressBarの挙動

DUnitでTProgressBar::SmoothReverseをtrueにして、MarqueeIntervalを設定しても動かない。

TStatusBarのデザインがレトロな感じ。

もしかすると、BCB6のプロジェクトからコピーしてきたユニットだったのが原因かも。

| | コメント (0)

2014-04-05

TUpDownではまった

TUpDownのAssociateにTEditを割りててたんですが、位置合わせのために再度AssociateにTEditを割り当ててやると、TEditのTextがTUpDownのPositionになるという事を知らずに、Edit1->Text = 10; とかしてた物がAssociateのタイミング?で、Edit1のTextが30とかになってしまう。

これだけじゃないけど、これをメインに色々とハマって1日無駄にしてしまった。

| | コメント (0)

2014-02-08

DUnitのGUIが表示されなくなる C++ Builder 2010

なんでだか知らないが、Win8.1でC++ Builder 2010を使ってたら、DUnitのGUIランナーが表示されなくなった。

debugフォルダを全削除してメイクしなおしたら表示された。

| | コメント (0)

2013-10-26

VCLでCGIにチャレンジしてみた

Delphi、C++BuilderではiPhone, Androidアプリ作成の話題で持ちきりですが、C++ Builder 2010でWebBrokerのWebサーバーアプリケーションプロジェクトでCGIを作らなければならなくなったので、やってみたのですが、わからない事だらけだしヘルプには記載がない物ばかりだし。

まず、デフォルトの文字コードがShift_JISなのかな?UTF-8にしたかったのですが、Response->ContentにUTF8String型の文字列を渡してやってもダメなんですね。
Response->ContentType=”text/html; charset=utf-8”;
ってしてやる必要があります。で、
Response->Content = UTF8String(PageProducer1->Content());
でUTF-8で出力する事ができるようになったのですが、HTMLのFORMから投げられる文字列の文字コードがUTF-8だと、取得がうまくいかない文字があるようです。組み合わせによってみたいです。
動的ページをブックマークしたり、リンクを作ったりしたいので、データはGETで渡します。
内部でAnsiStringで処理してるみたいですが…。

とにかく、
String title = Request->QueryFields->Value[“title”];
では文字化けしたりして取得できず、色々と試したのですが、どうもうまく取得できませんでした。
わからないので、自分で書く事にしました。

何をどう処理しているのかわからないので、色々と試行錯誤しました。

どうやらRequest->QueryとHTTPAppのHTTPDecodeが使えそうでした。
boost::shared_ptr queries(new TStringList());
queries->Delimiter = ‘&’;
queries->StrictDelimiter = true;
queries->DelimitedText = Request->Query;
としてみたんですが、うまく切り分けてくれませんでした。

どうもRequest->QueryがAnsiStringなのでうまくいっていないようでした。
UnicodeString unicode_query = Request->Query;
queries->DelimitedText = unicode_query;
として、Request->QueryをUnicodeStringに変換してからqueries->DelimitedTextに渡してみたら、ちゃんと切り分けてくれました。

UnicodeStringにしないとうまく切り分けられなかったので、切り分けのためにUnicodeStringにしてありますので、これをデコードするために再度AnsiStringに変換します。
AnsiString avalue = queries->Values[queries->Names[i]];
avalue = HTTPDecode(avalue);
UTF8String utf8_value;
utf8_value.SetLength(avalue.Length());
memcpy(utf8_value.c_str(), avalue.c_str(), avalue.Length());
でクエリを&で切り分けてデコードして、UTF8文字列に変換できたと思います。

あとは、適当にTPageProducerで透過タグの置換をしたりします。

それにしても、簡単にちょっとサンプルCGIを作って見る程度なら簡単にあっという間にできちゃうけど、サンプル以上の物を作ろうと思うと、結構自分で書かないとならない。

本当にこんな事が必要なのかな?大丈夫かな?なんか心配だな。

| | コメント (0) | トラックバック (0)

2013-07-03

Firebird unsupported on-disk structure

firebirdデータに急にアクセスできなくなった。

なんで、急にアクセスできなくなったのかはわからないのですが、というかRAD STUDIO 2010からXE4にバージョンアップした時に、一緒にinterbase XE3をインストールしていて、interbaseが稼働していたのが原因だったのですが。

それまでどうして正常に使えていたのか。その方が不思議です。

まぁ、サービスがfirebirdの方が先にポートを掴んで、interbaseのサービスが起動していなかったとか、そういう事なのではないかと。

interbaseのサービスを停めたら正常にアクセスできるようになりましたので、interbaseをアンインストールしました。

元はといえば、XE4でIBXがなかったので、「もしかしてinterbaseをインストールしないとIBXが入ってこないとか?」と思い、インストールしてみたんですね。結局ダメで、後から追加パッケージがダウンロードできるようになっている事に気が付いたのですが。

ヤレヤレ肝冷やしました。

| | コメント (0) | トラックバック (0)