2014年4月16日水曜日

WPF での DoEvents

Windows Form の頃は、時間のかかる処理をしつつ画面の変更(進捗率を表示するとか)する時には DoEvents を使っていた。

今回 WPF で DoEvents があるのか?調べてみると、その物自体はなく、自分で実装して使うようになっているようだ。
この実装を行って使うという内容については、結構な件数が確認できたので、メジャーな方法というか、Microsoft のサイト自信に載っているやり方らしい。

Dispatcher.PushFrame メソッド(Microsoft)
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcher.pushframe%28VS.80%29.aspx

ひとまず、ViewModel にコピペを行って確認をしてみた。
        public DelegateCommand CalculateCommand {
            get {
                if (this.calculateCommand == null) {
                    this.calculateCommand = new DelegateCommand(CalculateExecute, CanCalculateExecute);
                }
                return this.calculateCommand;
            }
        }

        private void CalculateExecute() {
            this.Message = "test message";
            DoEvents();         // ここで呼ぶ

            // 長い処理のつもり
            for(var i = 0; i < 9999; i++) {
                for(var j = 0; j< 99999; j++) {

                }
                this.Message = i.ToString();
                DoEvents();     // ここで呼ぶ
            }

            var calc = new Calculator();
            this.Answer = calc.Execute(this.Lhs, this.Rhs, this.SelectedCalculateType.CalculateType);
        }

        private bool CanCalculateExecute() {
            return this.SelectedCalculateType.CalculateType != CalculateType.None;
        }

        // ↓ ここからを追加
        public void DoEvents() {
            DispatcherFrame frame = new DispatcherFrame();
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
                new DispatcherOperationCallback(ExitFrames), frame);
            Dispatcher.PushFrame(frame);
        }

        public object ExitFrames(object f) {
            ((DispatcherFrame)f).Continue = false;
            return null;
        }
        // ↑ ここまで

参考にさせて頂いている様々なソースをそのままコピペの切った貼ったでの確認で、オリジナルの作者の方には申し訳無い気持ちではあるが、なんとか期待通りの動きになる事は確認できた。

わざわざの別実装なので、何か弊害がでのかも知れない点が気がかりと言えば気がかりだったりする。

2014年4月14日月曜日

Adobe Acrobat を使用しての PDF 出力時のエラー

WPF から印刷処理経由で PDF の出力を行う際にファイル出力まで何故か遅い。
この時、フリーの PDF プリンタを使用していました。
まずこのフリーの PDF プリンタに要因があるのかも知れないと思い、
Adobe のサイトから Acrobat の体験版を使用してみる事にしました。

インストールも完了し、PDF の出力処理をすると、ファイルの出力はされずログファイルが出力されます。
そしてログファイルの中身を見ると以下の内容が書かれていました。
    %%[ ProductName: Distiller ]%%
    07kyvr not found, using Courier.
    %%[ Error: typecheck; OffendingCommand: xshow ]%%

    Stack:
    [150 150 150 0]
    ( ト ・ゥ%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
    %%[ Warning: PostScript error. No PDF file produced. ] %%

・・・よくわからん。。。

途方に暮れそうになりながらも正気を戻し、「ProductName: Distiller」あたりで検索をかけてみました。
すると、同じ内容で困っている方がおられました。

AcrobatでPDFに変換しようとするとログファイルが作成されてしまう
http://plaza.rakuten.co.jp/mscrtf/diary/201302140000/

 まさにドンピシャ!!

どうやらフォントの関係で、上手く出力が出来なかったようです。
ここに書かれているように、Adobe PDF のドキュメントのプロパティの
「Adobe PDF 設定」の「システムのフォントのみを使用し、文書フォントを使用しない」の
チェックを外すと出力されるようになりました。
しかし、このログの内容では普通は解決出来ない気がするが・・・

いずれにせよ、上記で PDF 出力しても結果スピードは変わりませんでした。
XPS で出力すると、もの凄く高速(50倍ぐらい速い)なので今回はこちらで対応をしたいと思います。

2014年4月3日木曜日

Apple から「iTunes Connect: Updates to App Store pricing.」というメールが来た

少し前にはなりますが。。。

Apple から以下の内容のメールが来ました。

----
Dear XXXX,
 
Within the next 24 hours, the following changes will be made to pricing on the App Store.

To account for changes in foreign exchange rates,
App Store retail prices will be increased for the following currencies:

    Australian Dollar
    Indian Rupee
    Indonesian Rupiah
    Turkish Lira
    South African Rand

Additionally, retail prices for Israeli New Shekels and some price tiers for the New Zealand Dollar will be decreased.

Price adjustments on the App Store are made periodically due to changes in foreign exchange rates.
 Within 24 hours, you will see the new Pricing Matrix in the Rights and Pricing section of Manage Your Apps on iTunes Connect.

Updates to iOS Paid Applications and Mac OS X Paid Applications contracts will be available on the iTunes Connect website.
To view all current and outstanding contracts, see Contracts, Tax, and Banking on iTunes Connect.

Regards,

The App Store team

----

毎度の事ながら間違っているかもしれない意訳を

---- 
 24 時間以内に、App Store の価格設定変更について説明します。
以下の通過については、外国為替レートの変動により価格が上昇します。

オーストラリアのドル
インドのルピー
インドネシアのルピア
トルコのリラ
南アフリカのランド

さらに、イスラエルのニューシケルとニュージーランドのドルは価格が下がります。

 App Storeでの価格設定については、外国為替レートの変動により定期的に更新されます。
24時間以内に、iTunes Connect で管理しているあなたのアプリの価格マトリクスを見る事ができます。
更新された価格で、iOS 有料アプリと、Mac OS X の有料アプリの設定を行うには iTunes Connect の web サイトで行ってください。
これらの設定については、iTunes Connect の Contracts, Tax, Banking を確認してください。

それではよろしくね。

App Store チームより
----

要するに価格改定が有るとの事らしいです。
最近まったく iOS の開発とか出来ていないので、こういったメールをみると、寂しくなります。。。

というか、今出してるアプリが iOS 7 に対応してないので、早く直さないと、、、
(ユーザー自分しかいないけど)