タグ

ブックマーク / coma2n.hatenablog.jp (17)

  • MVPパターンを業務アプリに適用する - coma2n’s diary

    業務アプリケーションを開発するにあたって、最低限守るべき事の一つとして「画面とロジック」の分離が挙げられると思う。 簡単そうに思えて、これが意外と難しい。 一人での開発ならば自分だけでやり方を決めてしまえばそんなに難しくはない。しかし、開発要員が増えれば、これが途端に難しくなる。 この原因としては、 どこからが「画面」の役割で、どこまでが「ロジック」の役割かの定義が個々人でばらつきがある。 定義を決めても守らない奴がいる(そもそも意味が理解できていない)。 言語自体がへぼくて「画面とロジック」の分離がそもそも(充分に)できない。 なんていうのがある。 ほとんど、「それって開発者としてどうなの?」というレベルに思えるけど、現実の開発ってそんなもんだよね。 いつの時代もこの問題は付きまとうようで、実際色んなデザインパターンが考えられてきた。 知ってるやつでは、 MVC(モデル・ビュー・コントロ

    MVPパターンを業務アプリに適用する - coma2n’s diary
  • MVPパターンを業務アプリに適用する − 画面遷移 - coma2n’s diary

    MVPパターンにおける画面遷移のやり方を調べていたが、具体的な情報があまりなく、これだというのが無かったので自分なりに考えてみた。 業務アプリでやるからには極力シンプルで、誰にでもわかるやり方にする必要がある*1。 とりあえず考えたのは、下図のようにプレゼンター側で遷移するビューを取り出し、必要な値を設定し表示するというやり方。 概要図 これくらい単純なのが一番いい。 ビューに値を設定する方法としては、 コントロールを参照して直接値を設定する。 プロパティを定義して、間接的に値を設定する。 が考えられるが、プロジェクト的には1.を採用したい。簡単だし、受け入れられ易い。プロパティってなに?って言われちゃうレベルだからね。 しかし、いくつか問題点がある。 コントロールを直接参照するので、コントロール名を変更されたり、削除されたりするとコンパイルエラー 型の不一致(例えばTextBoxのTex

    MVPパターンを業務アプリに適用する − 画面遷移 - coma2n’s diary
  • DataGridViewにデータバインドして編集・削除するのに最適な方法は? - coma2n’s diary

    WindowsFormで業務アプリを開発する場合、DataGridViewの様にデータの表示と編集作業を実際のデータソースの種類を問わずに一括してやってくれるコントロールがあると非常に便利である。 単純な編集作業ならば、これにデータバインドしてちょこちょこっとコードを書いてやるだけで、目的の仕様を達成できるのだから、ありがたくて涙が出てくる。 .NETにはデータベースにアクセスする技術が何種類かあって、どれを選ぶかによってDataGridViewとの連携のし易さもかなり変わってくる。 その辺の違いを調べる為に以下の仕様をいくつかのデータベースアクセス技術で実装して、その違いを比べてみた。 表示するレコードは複数のテーブルをJOINしている(JOINで対応できない場合はビューを使う)。 属性を変更できる。 レコードを削除できる。 ER図 ためした技術は以下、 DataSet 型付けDataS

    DataGridViewにデータバインドして編集・削除するのに最適な方法は? - coma2n’s diary
  • VB6で(なんちゃって)宣言的トランザクション - coma2n’s diary

    前回に引き続きVB6でも、できるだけの事はやってみようシリーズ VB6でデータベースを使ったアプリケーションでよくやってしまうのは、トランザクションの張り忘れとかロールバック、コミットのし忘れなど。おまけに汎用的な関数の中でやっちゃったりして、トランザクションがまともに機能しなかったりする。 こういうのはきっちりルールを決めて実装しなくちゃいけないんだけど、なかなか守れないのが実情。そういう状況を打破するために宣言するだけでトランザクションの開始とコミット、ロールバックが自動で行われるモジュールを作ってみた。 使い方はこんな感じ modMain.bas Sub Main() Call modException_ClearLastException() On Error Goto EXCEPT ' modTransaction_Beginでトランザクションが開始される ' また、引数に接続オ

    VB6で(なんちゃって)宣言的トランザクション - coma2n’s diary
    kageroh_
    kageroh_ 2009/08/04
  • VB6で(なんちゃって)構造化例外処理 - coma2n’s diary

    最近はずっとVB6*1で仕事をしているので、できない事が多くてイライラしてくる。 だからと言って、いい加減な物を作るわけにはいかないので、VB6でもできる限りの事をやる為に色々とフレームワーク的なものを作り始めた。これを使えば一定の品質を保てるって程度のやつ。 まずはVB6のしょぼいエラー処理の機能をもう少しましにする機能を作った。 やりたい事は 一貫したエラー処理 呼び出し履歴が参照できる(スタックトレース) エラーに追加情報を載せる これらを実現する為に、まず例外クラスから作ることにする。 その前にこのクラスが必要なので、載せとく。単なる文字列バッファクラスね。 clsStringBuilder.cls Option Explicit '#--------------------------------------------------------------------------

    VB6で(なんちゃって)構造化例外処理 - coma2n’s diary
    kageroh_
    kageroh_ 2009/07/31
  • WCF はじめの一歩 - coma2n’s diary

    今更ながらWCF(Windows Communication Foundation)を始めた。 長い間プログラミングから遠ざかっていた*1ので、若干書き方を忘れてきたけど思い出しつつ勉強開始 まずは基中の基からやってみる。 概要 イメージとしてはこんな感じ Server側とClient側でContract(インターフェース)を決めてあげれば、通信部分のプロトコルとかなんやらはWCFがやってくれまっせという事です。 これに従って、今回作成するプロジェクトは以下の三種類 WcfService(コンソール) WcfServiceInterface(ライブラリ) WcfClient(コンソール) また、参照設定に以下のアセンブリを追加しておく System.ServiceModel(WCFの体) System.Runtime.Serialization Contractの定義 まずはインター

    WCF はじめの一歩 - coma2n’s diary
    kageroh_
    kageroh_ 2009/07/23
  • Silverlightって、 - coma2n’s diary

    こんな感じでHTMLにもアクセスできるんだよな。内部的にJavaScriptに変換されて実行されてるんだろうか? var ele = HtmlPage.Document.GetElementById("Hoge"); ele.SetProperty("innerHTML", "Hello"); 要素を取得する方法が「GetElementById」と「GetElementByTagName」しかないけど、これでなんとかSilverlight上にマネージドjQueryみたいなのを構築できないやろうか? えぇい!!これを実装する猛者はどこかにおらぬか!! 追記: こんな風にするとクライアントサイドのJavaScriptをサーバーサイドから呼べる事が判明した。 var obj = (ScriptObject)HtmlPage.Window.Invoke("$", "#msg"); obj.Invo

    Silverlightって、 - coma2n’s diary
  • SilverlightでjQuery - coma2n’s diary

    さっきのやつでサーバーサイドからクライアントサイドのJavaScriptを呼び出せる事がわかったので、さっそくjQueryのラッパークラスを作ってみた。 jQuery.cs class jQuery { private static readonly HtmlWindow window = HtmlPage.Window; private ScriptObject element; public jQuery(string expression) { element = (ScriptObject)window.Invoke("$", expression); } public jQuery Text(string text) { element.Invoke("text", text); return this; } public jQuery Append(params object[

    SilverlightでjQuery - coma2n’s diary
  • SilverlightにjQueryのパワーを - coma2n’s diary

    ところでこのコードを見てくれ・・・こいつをどう思う? Page.xaml.cs private void LayoutRoot_Loaded(object sender, RoutedEventArgs eventArgs) { var data = new[] { new { Name="A", Member=new[] { "Bob", "John" } }, new { Name="B", Member=new[] { "Cozy", "Sally" } } }; new JQuery("#button1").Click(() => { new JQuery("#content").Append( JQuery.Ul.Append( JQuery.Convert(data, o => JQuery.Li.Text(o.Name) .Append( JQuery.Ul.Append(

    SilverlightにjQueryのパワーを - coma2n’s diary
  • Silverlight Beta 2では非同期呼び出しができない - coma2n’s diary

    Silverlight Beta 2でこういう処理書いたら、NotSupportedExceptionが飛んできたんだけど、 Action act = () => { HtmlPage.Window.Alert("Async call"); }; act.BeginInvoke(null, null); NotImplementedExceptionじゃないところを見るとSilverlightでは非同期呼び出しが駄目っていうことか。。。orz これはBeta 2だから?正規版では変わるんだろうか。結構いろいろ制限あるなぁ。

    Silverlight Beta 2では非同期呼び出しができない - coma2n’s diary
  • Silverlight Beta 2では非同期呼び出しができない 続き - coma2n’s diary

    と思ったら、Threadクラスを使えばできた。 var thread = new Thread(() => { HtmlPage.Window.Alert("Async call"); }); thread.Start(); 実行はできたけど、メッセージが表示されない。 デバッグしてみたら、SilverlightでもWinFormアプリケーションと同じようにUIスレッド以外からのUIへのアクセスには例外が出るようになっていた。 WinFormでは「Control.Invoke」を使ってUIにアクセスするので、Silverlightでの同様の方法を探してみたら、以下の方法でできた。 var thread = new Thread(() => { this.Dispatcher.BeginInvoke( () => HtmlPage.Window.Alert("Async call") );

    Silverlight Beta 2では非同期呼び出しができない 続き - coma2n’s diary
  • SilverlightにHttpWebRequestがある件 - coma2n’s diary

    「System.Net」アセンブリに「HttpWebRequest」クラスがある・・・orz アセンブリ分かれてやんの。 しかも同期呼び出しをサポートしている・・・ゴクリしていなかった・・・orz。 オブジェクトブラウザで見ると「GetResponse」メソッドがあるのに、Intellisenceには表示されないし、コンパイルもできない。Silverlightこんなの多いよねぇ。 実際にPOSTしようとするとこんな感じか。 例 var data = new Dictionary<string, object>() { { "firstName", "ほげ" }, { "lastName", "太郎" } }; var postData = string.Join("&", data.Select(p => string.Format("{0}={1}", p.Key, p.Value))

    SilverlightにHttpWebRequestがある件 - coma2n’s diary
  • .NETとSilverlightで(デフォルトの)日付の書式が違う件 - coma2n’s diary

    .NETとSilverlightでは日付の書式が違うことに気が付いた。 例えば以下のようなコードの場合、 DateTime.Now.ToString(); .NET 2008/04/18 10:00:00 Silverlight 平成 20/4/8 10:00:00 というように結果が異なる。 これは.NETとSilverlightでは日語Cultureの内容が異なるためにおこっているみたい。 現在のカルチャーの情報を調べてみればそれがわかる。 Console.WriteLine( System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern ); .NET yyyy'年'M'月'd'日' H:mm:ss Silverilght gg y'年'M'月'd'日' H:mm:ss Date

    .NETとSilverlightで(デフォルトの)日付の書式が違う件 - coma2n’s diary
  • Silverlightで自身のURLを取得するには? - coma2n’s diary

    その手があったかー!! How does my Silverlight app finds it’s web services? « IgorShare Thoughts and Ideas Uri docUri = HtmlPage.Document.DocumentUri; Uri svcUri = new Uri(docUri, "ServiceAdress.svc"); どういうことかというと SilverlightクライアントがWebサイトにアクセスする場合、それが自分と同じドメインであっても以下のように完全なURLで指定する必要がある。 var webClient = new WebClient(); webClient.DownloadStringAsync(new Uri("http://localhost/hoge.aspx")); でもこれをハードコーディングしちゃうと

    Silverlightで自身のURLを取得するには? - coma2n’s diary
  • マウスホイールに対応する - coma2n’s diary

    Silverlight 2 Beta 1ではマウスホイールに対応するイベントが用意されていない。これがないとホイールスクロールで画像を拡大・縮小とかができないので、操作性が悪くなってしまう。 といっても方法が無いわけでもなくて、JavaScriptを使えば簡単にできる。 以下のコードをSilverlightページのコンストラクタにでも書いておけば、マウスホイールに対応できる。 Page.xaml.cs // IE 用 HtmlPage.Document.AttachEvent("onmousewheel", new EventHandler<HtmlEventArgs>((s, e) => { var value = (double)e.EventObject.GetProperty("wheelDelta") / 120; if(value > 0) { // 下方向にスクロールされた

    マウスホイールに対応する - coma2n’s diary
  • GoogleGearsでSilverlightをオフラインで動かす - coma2n’s diary

    最近ちょっとGoogleGearsをいじってるんだけど、これにコンテンツをキャッシュするLocalServerという機能があって、これを使うとコンテンツをキャッシュしてWebアプリをローカル(オフライン)で実行できるようになる。 で、これをいじってて思ったんだけど、この機能でSilverlightコンテンツをキャッシュすればSilverlightもAirみたいに単独のアプリとして使えるようになるんじゃね? ということでやってみた。 表示するSilverlightコンテンツはどうでもいいので、ボタンを一個貼り付けた適当なやつを用意した。 Default.aspx <%@ Page Language="C#" AutoEventWireup="true" %> <%@ Register Assembly="System.Web.Silverlight" Namespace="System.We

    GoogleGearsでSilverlightをオフラインで動かす - coma2n’s diary
  • C#から見たVB.NET - coma2n’s diary

    仕事でVB.NETを使う必要が出てきそうなので最近のVBがどうなっているのかチェックがてらメモしておく。 VBは7(.NET 1.0)までしか使っていないので、その後ジェネリックとかがどのように取り込まれたか全く知らないのでそのへんも気になる。 基的な相違点 C#はクラス名やメソッド名などの識別子を大文字小文字で区別するが、VBは区別しない。 VBは事前バインディングと遅延バインディングを切り替えられる(Option Strict On/Off)。 VBは変数の型宣言を強制するかどうかを切り替えられる(Option Explicit On/Off)。 リテラル ちょこちょこ違う C# string s = "Hello"; char ch = 'a'; int i = 1; long l = 1L; double d = 1.0; float f = 1.0F; bool bl = tr

    C#から見たVB.NET - coma2n’s diary
  • 1