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

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

DTPの構造を考える-その13:アルゴリズムとメモリ構造 その4 編集関係。

2007-06-23 20:08:57 | 土日シリーズ

 土日シリーズ「DTPの構造を考える」です。

 このシリーズ、第9回までで、本の構造、さらにDTPソフト全体でもつ、フォント、色、ライブラリの構造を概念的に説明してきました。
 それ以降、機能のお話しを書いています。

 今回は、編集関係の機能についてです。




■カットアンドペーストと、プロパティ変更

 一般的な機能としては、一般的な編集ソフトの作り方 その12:イベント発生時の動き(概要)。 で、あげたように
  ・印刷
  ・保存
  ・読み込み
  ・カット(切り取り)
  ・ペースト(貼り込み)
  ・プロパティ(属性設定・変更)
  ・表示
  ・要素の選択
  ・(要素の)移動

とあり、とくに、プロパティの変更に関しては、ここで取り上げました。
 プロパティ変更には、
 ・大きさ、位置がかわるもの
 ・大きさ、位置はかわらず、中身のみ変わるもの
とあり、それぞれ処理が違うと書きました。
 この、大きさ位置が変わる処理と、カットアンドペーストの動きはにているので、今回はまとめて、編集機能として書きます。




■位置決めが問題
 で、先ほどあげたところでは、処理は、こんな漢字に書きました。

1.ダイアログや、その他いろいろな操作で、プロパティ変更を受け付ける

2.現在選択されているもの(=変更するプロパティ)を決定

3.変更するものの親に対し、子供(変更するものと、その兄弟)
  の位置決めをする

4.3の値に変更し、変更するものに通知する。
   →変更できない場合、変更処理を取り消し、元に戻る

5.変更するものの子供に対し、変更後の位置決めをする
   →変更できない場合、変更処理を取り消し、元に戻る

6.5の位置に子供の属性を変更する。自分の属性も変更する

7.再描画する
   →クリックされたとこををバッファをもって調べている場合、
    そのバッファにも書き出し

つまり、3で自分の親が自分を含めた子供に対し、
5で、自分が、子供に対して、位置決めを行います。

この位置決めを、どの範囲で、どのようにやるのかが問題です。




■どの範囲で、どのように位置決めするか

 位置決めについて、どのように行うかが問題というのは、わかっていただけると思います。
 どの範囲の問題なのですが、親が、子供全体に行うのであれば、何も問題はないのですが、それだと時間がかかります。たとえば、10行書いて、文末の。を削除した場合、。の文字1字分だけ処理すればいいです。しかし、文頭の文字を削除した場合、全部の文字に影響が出ます。
 前者の1文字だけ処理すればいい場合、全部の子供(10行分)を処理するのは無駄になってしまいます。なので、範囲があるといいのですが、このとき、修正した文字からでいいかというと、そうではないです。

 英語などで、追い込んで入れたり、文字を追い出したりする場合、その行1行分使って処理します。つまり、変更文字の前も含めて変更行全体を処理します。なので、前の部分も含まれることがあります。




 次回は、この位置決めについて、さらに深く考えます。




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

一般的な編集ソフトの作り方 その19:イベント発生時の動き(プロパティ変更)

2007-06-23 18:35:18 | Weblog

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

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

ということで、現在、「イベント発生時の動き」をやっています。
その機能には、
  ・印刷
  ・保存
  ・読み込み
  ・カット(切り取り)
  ・ペースト(貼り込み)
  ・プロパティ(属性設定・変更)
  ・表示
  ・要素の選択
  ・(要素の)移動
で、今日はプロパティ変更についてやります




■プロパティの変更は2種類にわかれる

 プロパティは、図形等の場合、色など、文字の場合フォント、装飾(下線など)などですが、子のプロパティ変更は、
  ・大きさ、位置がかわるもの
  ・大きさ、位置はかわらず、中身のみ変わるもの
とあります。後者の「大きさ、位置はかわらず、中身のみ変わる」場合は簡単で、

1.ダイアログや、その他いろいろな操作で、プロパティ変更を受け付ける
2.現在選択されているものの、属性値を1で指定されたものに変える
3.再描画する

ですみます、しかし、大きさが変わる場合、例えば、文字枠の大きさが変わると、中に入っている文字の位置も当然変わりますが、外側の文字を排除しているような場合、外側も変わります。
 そのため、ちょっと面倒な処理になります。




■大きさ、位置が変わる場合のプロパティ変更

 この場合、親に、プロパティ変更することを通知し、変更後の位置決めを、(変更するものもふくめ、その兄弟の)子どもに対して決定し、設定したら、子供のプロパティに変更した旨をつうちしないといけません。また、変更するプロパティの子供の位置決めも必要です。
 
そこで
1.ダイアログや、その他いろいろな操作で、プロパティ変更を受け付ける
2.現在選択されているもの(=変更するプロパティ)を決定
3.変更するプロパティの親に対し、
  子供(変更するものとその兄弟)の位置決めをする
4.3の値に変更し、親に通知する。
  変更できない場合は、位置変更せずに、通知
   →変更できない場合、変更処理を取り消し、元に戻る
5.変更する対象の子供に対し、変更後の位置決めをする
   →変更できない場合、変更処理を取り消し、元に戻る
6.5の位置に子供の属性を変更する。自分の属性も変更する
7.再描画する
   →クリックされたとこををバッファをもって調べている場合、そのバッファにも書き出し




 とこんなかんじです。


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

サーブレットの雛形

2007-06-23 12:56:28 | JavaとWeb

ちょっとある人に説明するために、
サーブレットの入出力の方法と処理の流れがわかる
雛形をつくってみた。

こんなかんじ
/**
 * 
 * プロジェクト名:サンプルプログラム
 * クラス内容	 :サーブレットサンプル
 *
 */

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/*
 * クラス:testServlet
 * 内容 :サーブレットの見本
 * 
 */
public class testServlet extends HttpServlet {

	/*
	 * メソッド:service
	 * 内容  :PostでもGetでも、ここにくる
	 * 
	 */
	public void service(HttpServletRequest request, 
                      HttpServletResponse response) 
                          throws ServletException, IOException {

		//==============================//
		//	データの取得	     //
		//==============================//
			//	セッション開始・取得
//	 	HttpSession session	=	request.getSession(true);
			//	セッションの値の取得
//		String sessionValue1	= 	(String)session.getAttribute("key1");

			//	引数の取得
//		String argValue1	= 	(String)request.getParameter("key2");
//	なお、バイナリのようなケースで、引数ではなく、ボディ部分の値全体を取得
//	したい場合は、
//	ServletInputStream	is	=	request.getInputStream();
//	で、InputStreamを取得して、処理する
		


		//==============================//
		//	処理実行		     //
		//==============================//

		//	データチェック

		//	モデル部分呼び出し

		//	出力データ作成

		
		//==============================//
		//	出力する		     //
		//==============================//

			// ContentTypeを設定
//		response.setContentType("text/html; charset=Shift_JIS");

	    		// 出力用PrintWriterを取得
//    		PrintWriter out = response.getWriter();
//		out.println("<html>");
//		out.println("</html>");
//	なお、バイナリのようなケースで、ボディ部分の値を書き出したい場合は、
//	ServletOutputStream	os	=	response.getOutputStream();
//	で、OutputStreamを取得して、処理する

	} 
}


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