2012年12月5日水曜日

NetAdvantage(WinForms) AppStylist,MDI,DataBindingを同時に使用する場合の処理

NetAdvantageAppStylistは簡単な設定でアプリケーション全体の外観を変更できるとても便利なツールです。
デザインツールも付属しているので,自分でデザインするのも良いですが,予めスタイル情報ファイルもいくつか用意されているので,手間無くユーザーに外観の選択肢を提供できます。
外観を変更すると,まるで別のアプリケーションを見ているようで新鮮です。
個性の問題だけなく,ユーザーによっては「グリッドの行がストライプのほうが良い」などの要望もありますので,利便性の向上にもつながります。

しかし,MDIアプリケーションでデータバインディングを使ったフォームを使用する場合は注意が必要です。
この場合データバインディングが正しく動作せず,データソースを更新してもエディター系コントロールに反映されません。これは既知の問題であるらしく,この不可解な現象を解決しようと多大な時間をかけることになるかもしれません。
(いかなる条件でも問題が発生するかどうかは分かりませんが,UltraWinGridをマルチバンドで使用し,かつEditorコントロールのDataBindingsを設定した場合は発生しました)

解決のためには,AppStylistを使用しないか,あるいは以下のようにフォームのインスタンスを生成する度にAppStylistをリセットする必要があります。
リセットしたからといって処理にひどく時間がかかったり,表示がちらついたりということはないのですが,フォーム生成の都度リセットを忘れないよう注意が必要です。

Private Sub ShowForm()

    Infragistics.Win.AppStyling.StyleManager.Reset()
    Dim frm1 As New Windows.Forms.Form
    Infragistics.Win.AppStyling.StyleManager.Load("スタイル情報ファイルのパス")

    frm1.MdiParent = Me
    frm1.Show()

End Sub

2012年9月18日火曜日

Vostro 360をWindows8にアップグレードしてみた

Windows8の発売日も間近になってきました。弊社でもタブレットでの活用を考えていますので使い勝手や周辺機器,ソフトウェアの対応状況が気になるところです。
そこで,テスト機を用意してWindows8 Enterpriseをインストールしてみました。今回はWindows7 Professionalからアプリやファイルを引き継ぐ設定でセットアップしました。
今後いろいろと試してみたいと思います。

スペック

機種:Dell Vostro 360 Touch
CPU:Core i5-2400S
メモリ:4GB
グラフィック:NVIDIA Geforce GT 525M 1GB
モニタ:23インチ フルHD 光学式タッチパネル(2点)
OS:Windows 7 Professional

タッチパネル

Vostro 360にはオプションでタッチパネルを付けていますので,Windows8のタッチ操作にも対応しています。タッチパネルは2点までの感知できます。Windows7のときはMS標準のアプリ(ペイントなど)では軽快に動作しましたが,その他のアプリケーションでは使い物にならないレベルのものでした。マウス代わりにクリックするイメージで使えるのみですので,デスクトップ機としては最初からマウスを使った方がはるかに作業性が良かったです。
Windows8にしてみて,全体的なタッチパネルの操作性が向上したように感じました。同じマシンとは思えないという印象です。IEでの操作は指の動きにしっかり付いてきますし,一般的なWindowsフォームアプリでもスクロールバーやコンボボックスを操作するときの動きが幾分自然になっています。これまではタッチする位置をしっかり確かめながらでないときちんと操作できませんでした。とはいえ,このあたりはコントロールの種類や対応によって動作が異なるようです。

弥生会計

弥生会計ネットワーク版ですが,アップグレード前からインストール済なのでセットアップが可能かどうかは分かりません。今のところWindows7とまったく同じように動作します。特にタッチ操作が有用な場面は見当たりません。

Docuworks

Docuworks Desk 7.3です。タッチ対応が最も活きてくるアプリだと思うのですが,残念ながらタッチパネルの操作性が向上したとは感じられませんでした。わずかながら使いやすくなったのはフリーハンドのラインアノテーションです。Windows7のときは途切れ途切れの線になりましたが,Windows8では途切れない線が引けます。ただ,これもマウス操作を前提としているので,きちんとクリックのつもりでタッチ,そのままドラッグのつもりで指を動かしたときのみ可能です。Penviewer for Docuworksを使うとタッチ操作がさらに活きてくるのかもしれません。ちなみに,Windows7でPenviewerを試した時にはうまく線が引けませんでした。タブレット機と異なり,Vostro 360の光学式タッチパネルではマウス操作と見なされてしまうのが原因かもしれません。
Docuworks Viewer Lightではピンチ操作による拡大縮小ができます。動作はぎこちなく,カクカクとした表示で,操作した後になって画面に反映される感じです。また,一般的なピンチ操作と逆の動きで拡大縮小が行なわれます。


PDF

OS標準のリーダーアプリは普通に動作します。iPadほど自在ではないものの,拡大縮小やスクロールで特に気になることはありません。このアプリに限った話ではありませんが,Windowsストアアプリでファイルを開くと全画面表示になるため,元のデスクトップに戻るのが面倒です。
Adobe Acrobat Reader Xでは今まで通りのウィンドウでファイルを開くことができます。ズームが少々ぎこちないですが,Docuworksほどではありません。特に問題なくPDFを読むことができます。注釈とテキストハイライトはタッチパネルでも問題なく操作できます。やはりデスクトップ機なのでマウスで操作したほうが速いですが。
PDFについてはいろいろなところからアプリがリリースされることと思いますので,そのうちiPadのように操作できるようになるのかもしれません。

2012年7月19日木曜日

弥生会計のバックアップ時エラー

弥生会計12ネットワーク版でバックアップを行なう時,以下のようなエラーが発生しました。


”事業所データのバックアップ中にエラーが発生しました。バックアップデバイス'\\...\YACCBACUP$\....zbk'を開けません。オペレーティングシステムエラー67(ネットワーク名が見つかりません。)。”

 データベースサーバーに YAccBackup$ という共有フォルダを作る必要があったようです。ちなみに書き込み権限が必要です。(詳しくはデータベースインストールマニュアルP83を参照)

データベースインストールマニュアル

2012年5月24日木曜日

UltraGridを方向キーでExcelライクに操作する

InfragisticsのNetAdvantage WinFormに含まれるUltraGrid。
とても高機能で便利なのですが,Excelみたいに方向キーで操作したいと思うとコードを追加する必要があります。
グレープシティのSPREADほどExcelライクというわけではないけれど,伝票系の入力画面を作るときなどに重宝します。



Imports Infragistics.Win.UltraWinGrid

Private Sub grid1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles grid1.KeyDown

    Dim gd As UltraGrid = grid1

    Select Case e.KeyCode
        Case Windows.Forms.Keys.Up
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
            gd.PerformAction(UltraGridAction.AboveCell, False, False)
            e.Handled = True
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
        Case Windows.Forms.Keys.Down
            gd.PerformAction(UltraGridAction.ExitEditMode, False, False)
            gd.PerformAction(UltraGridAction.BelowCell, False, False)
            e.Handled = True
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
        Case Windows.Forms.Keys.Right
            gd.PerformAction(UltraGridAction.ExitEditMode, False, False)
            gd.PerformAction(UltraGridAction.NextCellByTab, False, False)
            e.Handled = True
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
        Case Windows.Forms.Keys.Left
            gd.PerformAction(UltraGridAction.ExitEditMode, False, False)
            gd.PerformAction(UltraGridAction.PrevCellByTab, False, False)
            e.Handled = True
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
        Case Windows.Forms.Keys.Enter
            gd.PerformAction(UltraGridAction.ExitEditMode, False, False)
            gd.PerformAction(UltraGridAction.BelowCell, False, False)
            e.Handled = True
            gd.PerformAction(UltraGridAction.EnterEditMode, False, False)
    End Select

End Sub

2012年3月7日水曜日

Vostro 3750セットアップ

Dell Vostro 3750を購入。さっそくセットアップしました。
各種フレームワークや業務用アプリをインストールする以外にも,不要なプリインストールアプリをアンインストールするという作業がけっこう面倒です。
とりあえず備忘録として作業内容をまとめました。

AccelerometerP11
"ST Micro Free Fall Sensor Driver"という説明あり。HDD保護のためのものなので削除せず。

BingBar
BingBarは不要なので削除。

Dell DataSafe Online


デルのクラウドバックアップサービス。使わないので削除。

Dell Backup and Recovery Manager
バックアップ管理ソフト。使わないので削除。
アンインストールしても起動時にタスクアイコンが表示されるので以下のフォルダとファイルも削除。
"C:\Dell\DBRM"
"C:\Dell\DBRM.ini"

Dell Support Center
パソコンの構成やサポート情報を確認できる。
故障時にサポートに連絡すると,このアプリでパソコンの情報をチェックするよう言われることもあるので削除せず。
ただ,個人設定はきちんと設定。あれこれメッセージが出てもユーザーが戸惑うので両方ともチェックは外す。もちろん広告はいらない。



Windows Live Essentials
使わないので削除。

Validity Sensors DDK
"Fingar Print Driver Development Kit"とある。指紋認証デバイスに必要なので削除せず。

Roxio Creator Starter
DVDユーティリティーだけど,機能限定されててかえって使いづらいので削除。

DigitalPersona Fingerprint Software
指紋認証によるパスワード管理ソフト。今回はWindowsログインをはじめとして利用したいので削除せず。

QuickSet
電源やネットワークなどを管理するユーティリティー。無くても困らないけど,ホットキーなどの細かい部分が動作しなくなるので削除せず。

2012年2月21日火曜日

USBストレージまたはSDカードにインストールできませんでした

使い始めて1年ちょっとのT-01C(Regza Phone)。新機種が次々リリースされるのも何のその,それなりに快適に使っていたのだけど,ある日突然以下のエラーメッセージが表示され,SDカードにインストールしているアプリが更新できなくなりました。

"USBストレージまたはSDカードにインストールできませんでした"

とはいえ,Googleで調べればすぐに見つかるだろうと検索してみると,かなりの量の記事がありました。特に分かりやすかったのが以下の記事でした。

http://kmor1.blogspot.com/2011/02/android.html

なるほど,.android_secureというフォルダーにあるsmdl2tmp1.asecというファイルを削除するか名称変更してしまえば解決するとのこと。
この記事では端末をPCにUSB接続して使っていたのだけど,要はファイルを削除できればいいの考えてAndroidアプリのESファイルエクスプローラーで直接操作しました。
ところが解決しません。もう一度アプリで対象フォルダーの中を確認しても,やはりファイルは存在しません。
思い直して記事にある通りPCに接続してみたところ,アプリでは表示されなかった対象ファイルが見つかりました。改めて名称変更を行なうとあっさり解決しました。
きちんと記事にある通りしていれば話が早かったわけで,ここでも少し反省です。

弥生会計12にアップデート

弥生会計12ネットワークのパッケージが届いたので,11からアップデートすることにしました。
今回のアップデートで目立ったものといえば,PDF作成機能でしょうか。他には帳票や設定関連の細かい変更や強化といった感じで,大きな変化はないようです。
会計ソフトだから,あまり大きな変化があるのも善し悪しで,安定と法律対応こそ重要なわけですけど。次に作業効率の向上といったところでしょうか。
その点,サポートに入っていると常に必要な修正が適用されて助かりますね。

昨年はセットアップファイルをDVDからファイルサーバーにコピーし,そこから複数のPCにインストールするという方法を使ったためランタイムの一部が不足して余計な手間をかける羽目になってしまいました。
その反省を踏まえ,今年はランタイムフォルダなど必要と思われるフォルダをすべてファイルサーバーにコピーしてインストールすることにしました。
(複数のPCで同時にセットアップするにはやはりファイルサーバーが便利なもので)
以下のフォルダーをコピーしました。(Adviserの中にはKaikeiというフォルダーのみコピー)
License.txtはライセンス認証でコピペして使うために登録番号を保存してあります。

 
こうしてStart.exeを起動してインストール。
以下のような流れで進んでいきます。


 KB256651はXPS関連の修正ファイルのようです。これのインストール時に再起動が求められることがあります。ちなみに,ファイルサーバーからのインストールで再起動しても,問題なく進捗しました。ただし,再起動時には再起動前と同じユーザーでWindowsにログインする必要があります。
無事にインストールが終わって弥生会計12を起動すると,以下のようなメッセージが表示されます。


 もちろん「はい」を選ぶわけですが,なぜかエラーが出てきました。


「エラーコード 250」とありますが,解決はしたものの何が問題なのか分かりませんでした(検証前に解決したので)。やはりDVDからインストールしないのが悪かったのでしょうか。
とりあえずユーザーを「管理者」にしてログインし,同様の操作をするとコンバータが表示され,無事に変換が完了しました。
変換に使用したPC以外のPCで弥生会計を起動すると,今まで通り弥生会計11のデータに接続しようとするので,やはり「変換しますか?」メッセージが表示されます。
ここは「いいえ」にして,改めてデータ選択することになります。

セットアップDVDの中には弥生会計とは関係ないセットアップファイル(体験版など)がたくさん入っています。できれば関係ないファイルは別のメディアに分けていただけると嬉しいなと思いました。(重ね重ね,DVDからインストールすれば問題ないのですが)

2012年2月9日木曜日

Optiplex GX520 内蔵電池交換

何年間か使っているDell Optiplex GX520の起動時に以下のメッセージが表示されるようになりました。

"Alert! System battery voltage is low."

内蔵電池が弱ってるんだなと判断し,電池交換することにしました。
使用した電池は以下の通り。


5個セットあってもすぐには使わないけど,CR2032はまた使うだろうからということで決定。
Prime対象で送料もかからないし,近所とはいえ量販店に行くのも時間がかかるので今回はAmazonで購入することにしました。
電池交換の手順はメーカーサイトに載っていたのでいちおう確認。

Dell™ OptiPlex™ GX520 ユーザーズガイド:バッテリー交換

筐体を開けてHDDを外すと電池が見えますので,これを交換するだけです。
HDDはワンタッチで外れるようになっていて,とても簡単です。


交換後,電源を入れると各種エラーが表示されるかもしれません。
BIOS設定が全部消えているので,F2を押して設定をするように指示が出ます。
まずは日時を合せます。次いで,PCの環境に合わせてデバイスの設定を行ないます。
今回の場合は内蔵FDDがないのでFDDのタイプをUSBに変更するなどの設定を行ないました。

これでPCからメッセージが出ることなく起動するようになりました。

2012年2月2日木曜日

ソースには,DataRowが含まれていません

Linqを使ってデータテーブルの処理をしている途中,エラーが発生してしまいました。

"System.InvalidOperationException: Linq The source contains no DataRows."
ソースには、DataRow が含まれていません。

コーディング中にエラーは出ないのですが,デバッグを始めると状況によってうまくいったりいかなかったりです。
もういちどよくエラーメッセージの意味を考えた結果,Linqで抽出した結果が0だったのが問題だったと分かりました。

Private Sub LinqToDataSet()

    Dim dt1 As New DataTable
    dt1.Columns.Add("Key")
    dt1.Columns.Add("Value")

    For i = 1 To 10
        Dim r As DataRow = dt1.NewRow
        r("Key") = "Key-" & i.ToString("00")
        r("Value") = "Value-" & i.ToString("00")
        dt1.Rows.Add(r)
    Next

    Dim searchKey As String = "Key-99"
    Dim query = dt1.AsEnumerable.Where(Function(el As DataRow) el("Key") = searchKey)
    SetDataRow(query.CopyToDataTable.Rows) 'ここでエラー発生。

End Sub

Private Sub SetDataRow(ByVal rows As DataRowCollection)

    For Each r In rows
        Debug.WriteLine(r("Key") & "|" & r("Value"))
    Next

End Sub

というわけで,結果の数を確認して処理するようにしました。

If query.Count > 0 Then SetDataRow(query.CopyToDataTable.Rows)

単純なことで手間取ってしまい,少々残念です。

2012年1月25日水曜日

Android3.1 マーケットでダウンロードが終わらない

LGのL-06C OptimusPADのAndroidマーケットで,ある日ダウンロードができなくなりました。
アプリのアップデートがあるということで開始し,プログレスバーみたいなゲージがずっと動いているのですが一向に終わることなく,結局「ダウンロードできませんでした」となる状態が続いていました。

設定 > アプリケーション > アプリケーションの管理 > すべて

この中にある「マーケット」を選択,「キャッシュを消去」を行なって再起動したけどうまくいかず。
次に「ダウンロード」 というアプリを選択,「キャッシュを消去」を実行。
この時点で直りました。

「ダウンロード」のキャッシュは数百MBたまっていましたが,これが悪かったのか,あるいは不具合でデータがたまっていたのか・・。

後日,Android2.2のT-01C(Regza Phone)でも同様の状況が発生。そして同様の処置で問題解決しました。

2012年1月23日月曜日

お年玉つき年賀葉書の当選番号照合

今年も年賀葉書の当選番号が発表されました。

平成24年用年賀葉書及び寄附金付お年玉付年賀切手当せん番号

そこで,弊社総務部用に照合シートを作成しました。
ただIF文を繰り返すだけの関数ですが,たくさん葉書がある場合は便利です。


年賀葉書当せん番号照合シート_2011.xlsx

2012年1月13日金曜日

WCF+RESTでファイル受信する際にヘッダー情報を分離

ASP.NETでWCFをホストし,POSTメソッドでファイルを受信するのはうまくできたのですが,受信した Stream型(System.IO.Stream)にヘッダー情報が含まれてしまい,そのまま保存するとファイルが壊れてしまうという問題に当たってしまいました。


FiddlerでファイルをPOST送信したときのRequestBody

---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="test.JPG"
Content-Type: image/jpeg

<@INCLUDE *C:\Users\nemo\Pictures\test.JPG*@>
---------------------------acebdf13572468--

.NETのライブラリに便利なものはないかいろいろと調べたけれど見つからず,結局コードを書いて処理しなくてはいけないかと考えましたが,幸い以下のコードが公開されていました。

http://multipartparser.codeplex.com/

VBで使えるように変換・調整して使うと,簡単に解決しました。

変換サイト

VB.NET(修正前)

' Get the start & end indexes of the file contents
Dim startIndex As Integer = contentTypeMatch.Index + contentTypeMatch.Length + vbCr & vbLf & vbCr & vbLf.Length

Dim delimiterBytes As Byte() = encoding.GetBytes(vbCr & vbLf & delimiter)

VB.NET(修正後)

' Get the start & end indexes of the file contents
Dim startIndex As Integer = contentTypeMatch.Index + contentTypeMatch.Length + vbCr.Length + vbLf.Length + vbCr.Length + vbLf.Length

Dim delimiterBytes As Byte() = encoding.GetBytes(vbCr & vbLf & delimiter)

ファイル名の取得もプロパティでできるし,快適です。
開発者に感謝です。

2012年1月10日火曜日

Windows AzureでIPアドレスによるアクセス制限をかける

Windows AzureのWeb RoleでIPアドレスによるアクセス制限をかける必要が生じ,調べてみました。TIPSやブログを読むと,SQL Azureの場合は管理画面で簡単に設定できるのですが,Web Roleの場合はIISをベースに動いているのでインスタンスごとに初期設定を行なわなければいけないということでした。リモートデスクトップで接続してGUIで設定することもできますが,インスタンスを作成する度に最初からやり直しなので,自動で再構成したときのことも考えると実用的ではありません。
設定を自動的に行なう具体的な方法についてはいくつかのやり方があるようですが,自分にとっては以下の手順が簡単に思えたので記録しておくことにします。


状況
許可したIPアドレスからのアクセス以外を制限
127.0.0.1 WebRoleがlocalhostにアクセスする場合に許可
192.168.1.1 からのアクセスを許可

1.StartUp.cmd
WebRoleプロジェクトにテキストファイルとして StartUp.cmd を作成。
プロパティの[出力ディレクトリにコピー]を[常にコピーする]に設定。

以下の内容で保存。

@echo off 
%windir%\System32\ServerManagerCmd.exe -install Web-IP-Security 
%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity

2.ServiceDefinition.csdef
Windows Azureプロジェクトの ServiceDefinition.csdef に以下の内容を追記。

  <WebRole>
    <Startup>
      <Task commandLine="StartUp.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
  </WebRole>

3.Web.Config
WebRoleプロジェクトの Web.Config に以下の内容を追記。

<system.webServer>
  <!--IPアドレスによるアクセス制限-->
  <security>
    <ipSecurity allowUnlisted="false">
      <clear/>
      <add ipAddress="127.0.0.1" allowed="true"/>
      <add ipAddress="192.168.1.1" allowed="true" />
    </ipSecurity>
  </security>
</system.webServer>


参考
http://news.mynavi.jp/articles/2011/06/07/wings02/index.html
https://support.blacknight.ie/524/how-to-block-an-ip-address.html