ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

一般的な編集ソフトの作り方 その12:イベント発生時の動き(概要)。

2007-06-12 19:04:38 | Weblog

 ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
 ここでは、主に、

  ・メモリ上に、要素をもつ
  ・イベント発生時の動き
  ・画面の構成

 ということで、前回までで、メモリ上にもつ要素の共通部分(共通要素)のサンプルと呼び出すところについて書きました。
 今回は呼び出すところの説明・・・ではなく、「イベント発生時の動き」について説明します。

(前回の呼び出すところの説明は、この「イベント発生時の動き」の一部になっているので、そこで説明します)




■一般的なイベント

 まず、「イベント発生時の動き」を見る前に、一般的に、編集ソフトでは、どんなイベントがあるか?をみてみます。

 実は、編集ソフトというのは、同じようなイベントを処理します。

 ツールバーを見ると、多くの編集ソフト(ワープロなど)は、以下のようなふうになっていることがおおいです。

左から
1.ファイル(ファイルに関するもの)
    印刷
    保存
    読み込み
2.編集
    カット(切り取り)
    ペースト(貼り込み)
    プロパティ(属性設定・変更)
3.表示
4.ツール
5.ヘルプ

また、エディタ系の場合は、編集のところに、検索、置換などがあります。
ツール、ヘルプの内容はまちまちです。また、エディタには書式というのもあるかもしれません。

これら、

    印刷
    保存
    読み込み
    カット(切り取り)
    ペースト(貼り込み)
    プロパティ(属性設定・変更)

と、メニューはないけど、操作上必要な
    表示
    要素の選択
    (要素の)移動

は、たいていの編集ソフトにおいて、共通して持っている機能です。
次回から、これらの機能について説明していきます。




■位置づけ

 でも、その前に、これらの位置づけをちょっと書いておきます。

  画面(ビュー)
   |
コントローラー(イベントがあがってくる)
   |
 モデル(上記イベント処理)
   |
 メモリ部分(今までやってきた要素)

 編集ソフトは、その内容を画面に表示します。
 そして、エディタなどで操作されると、そのウィンドウシステム独自のイベントがあがることになります。
 そして、それらは、上記の
  ・印刷
  ・保存
  ・読み込み
  ・カット(切り取り)
  ・ペースト(貼り込み)
  ・プロパティ(属性設定・変更)
  ・表示
  ・要素の選択
  ・(要素の)移動
という機能を呼び出し、これらの機能が、いままでやってきた共通のメモリ部分を操作します。

 ということで、上記機能はモデルになります。
 前回の呼び出し部分で、読み書きがmodelというクラスにあったのは、そのためです。
 あのクラスに上記の機能がかかれることになります。




 ということで、次回から、これらの機能について説明します。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「ニフニフ動画」っていう、ニフティの新サービス

2007-06-12 16:21:48 | Weblog

ここのプレスリリース
ニフティ、動画にコメントを投稿できる「ニフニフ動画β(ベータ)版」を開始
http://www.nifty.co.jp/cs/07kami/detail/070611003235/1.htm

によると(以下斜体は上記サイトより引用)


ニフティ株式会社(社長:古河建純、東京都品川区)は、動画にコメント投稿できる「ニフニフ動画β(ベータ)版」を6月11日(月)からスタートします。
 
「ニフニフ動画β(ベータ)版」は、各種動画投稿サイト(注1)に投稿されている動画に対して、ユーザーが動画の下部に表示されるティッカー(注2)にコメントを自由に投稿し、感想を共有したりすることで、動画に関しての新しい価値を発見できるサービスです。


簡単に言うと、ニコニコ動画のNIFTY版ですよね。。
でも、名前まで紛らわしい、こーいうものを出してしまって、
いいんすかねえ。。

つーか、これ、

・YouTubeから、動画をそのまま流したら、
    YouTubeからアク禁食らったらおしまいだし、

・逆にサーバーを日本において、動画をサーバーにダウンロードしちゃったら、
 テレビの著作権があるやつとかをダウンロードしたとたんに
 NIFTYがアウトになるけど、

いーんすかねえ(^^;)





  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

開発の初めから順番に書いていってみる その59:プログラミング(21)入出力の自動生成9

2007-06-12 13:46:09 | 開発ネタ

 シリーズ「開発の初めから順番に書いていってみる」の続きです。
 現在プログラミングのDB入出力の自動生成をやっています。
 前回は、ここまでのまとめとして、今までやってきた、ユーザーテーブルにおけるDB入出力のクラスを続けて書きました。
 それは、トランザクション処理なしバージョンでした。

 今回は、それにトランザクション処理をいれることを考えます。




■トランザクション処理

 トランザクション処理は、「複数のテーブル操作において」、エラーなど、都合が悪いことが起こったときに、ある時点からの処理を、なかったことにする(ロールバック)することも、処理を行う(コミット)ことも出来るようにするしくみです。

 このとき、トランザクションの入れ子を仮に認めてしまうと、内側のトランザクションはコミットで、外側はロールバックのとき、どーすんの?となってしまうので、入れ子にしないように、トランザクションのかけ方を開発プロジェクトにおいて決めてしまうのが多いと思います(フレームワークというか、雛形でこうしろ!という)




■実際のやりかた

ここにあります。
JDBC (トランザクション)編
http://www.hellohiro.com/jdbctransaction.htm


・自動コミットモードを解除して(con.setAutoCommit(false))
・コミット(処理する)ならcon.commit();
・ロールバック(なかったことにする)ならcon.rollback();

です。




■今までとの関係

 いままでは、1つのテーブルに関してかんがえてましたけど、今度は、複数のテーブルになってきます。複数のテーブルで、同じConnectionを使うということになります。

 そこで、いままでは、
 ・テーブルのオブジェクトを生成する
 ・select,insert,update,deleteを呼び出し、処理をする

 ということでしたけど、こんどから

 ・コネクションを生成する
 ・テーブルのオブジェクトを生成する
 ・コネクションを渡す
 ・select,insert,update,deleteを呼び出し、処理をする
    :
    :
 ・テーブルのオブジェクトを生成する
 ・コネクションを渡す
 ・select,insert,update,deleteを呼び出し、処理をする
 ・ロールバック、ないしはコミットする

というように、外部でコネクションを作り、それを受け取ることになります。
その上、トランザクション無しのときにも対応しないといけません。




■そこで

以下のソースにあげるように
・コネクションをクラスの属性として持っておく(初期値null)
・setConnectionを用意し、コネクションを外部からセットできるようにする
  →生成するときの引数にしてもよい
・コネクションがnullだったら、自分で作るようにする。
・自分で作った場合はコネクションをクローズする
  →外部からセットされたら、外部でクローズする

こうすれば、
  ・外部でコネクションを作成し
  ・setConnectionでコネクションを渡し、
  ・外部で、コミット、ロールバックしてクローズできます。




■ソース

 こんなかんじ(関係するところのみ)
	 /*
	  * コネクション
	  */
	Connection con = null;

  	/*
	 * コネクションセット<BR>
	 */
	public	void setConnection(Connection con)
	{
		this.con	=	con;
	}
	
  	/*
	 * SQL実行<BR>
	 * @param	cmd	SQL文
	 * @return	int		0:OK,1:Error
	 */
	public	int	execute(String cmd)
	{
		try
		{
			int	con_flg	=	0;
			if ( con	==	null )
			{
	      		// ドライバクラスをロード
   	   			Class.forName(JDBCDriverName); // MySQLの場合

      			// データベースへ接続
      			con = DriverManager.getConnection(JDBCURL,
                                     JDBCUserName,JDBCPassword);
      			con_flg	=	1;
			}
			
      		// ステートメントオブジェクトを生成
      		Statement stmt = con.createStatement();

			//	実行
	  		stmt.execute(cmd);

      		stmt.close();
      		// データベースから切断
      		if ( con_flg	==	1 )
      		{
	      		con.close();
      		}
   		} 
   		catch (Exception e)
   		{
     			e.printStackTrace();
     			return	-1;
   		}
		return	0;
	}

	/*
	 * SQLの検索実行<BR>
	 * @param	cmd	SQL文
	 * @return	Vector	結果(1レコード1ハッシュマップ)
	 */
	public	Vector	selectExecute(String cmd)
	{
		Vector allData = new Vector();

		try
		{
			
			int	con_flg	=	0;
			if ( con	==	null )
			{
	      		// ドライバクラスをロード
   	   			Class.forName(JDBCDriverName); // MySQLの場合

      			// データベースへ接続
      			con = DriverManager.getConnection(JDBCURL,
                                        JDBCUserName,JDBCPassword);
      			con_flg	=	1;
			}

      		// ステートメントオブジェクトを生成
      		Statement stmt = con.createStatement();
      		
      		// クエリーを実行して結果セットを取得
      		ResultSet rs = stmt.executeQuery(cmd);

      		ResultSetMetaData meta = rs.getMetaData();
      
      		// 検索された行数分ループ
      		while(rs.next())
      		{
   				HashMap mp = new HashMap();
      			for(int i = 1 ; i <= meta.getColumnCount(); i ++ )
      			{
      				mp.put(meta.getColumnName(i),
                                        rs.getString(meta.getColumnName(i)) );
      			}
   				allData.add(mp);		
      		}
 
      		// データベースから切断
      		stmt.close();
      		if ( con_flg	==	1 )
      		{
	      		con.close();
      		}
    	}
    	catch (Exception e)
    	{
      		e.printStackTrace();
      		return	null;
    	}

		return	allData;
	}

(上記< > ¥は、本当は半角)




今日はここまで。

</fopnt>

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする