2002年2月8日(金) 〜 2002年4月24日(水)

明日香V2 開発記録


asuka006.jpg
asuka007.jpg
項目表示条件 設定パネル
項目表示条件を変更しているところ


長い開発前夜・2001年7月17日(火)


   Borland から、Delphi6 のアップグレード案内が到着した。

   今度の Delphi には、大きな「目玉」が2つあると、私なりに思っている。ひとつは
  Webサービスを作るための 大幅な機能追加、もうひとつは CLX の提供による Linux
  とのクロスプラットフォーム開発環境の実現である。

   どちらも「むむむ」と唸るべき目玉であり、これは是非とも 現行 Delphi5 をアップ
  グレードすべきであるが、実は過去の Delphi では「偶数の版」の出来がイマイチ良く
  ないというジンクスがあることもまた事実なのだ。私自身、かつての「4」の時に大変
  苦労させられた経験があり、そのため 会社ではいまだに「3.1」を使い続けている。
  今度の「6」は大丈夫かしらん?(^_^;)という危惧が、ないわけではないのだ。

   Professional 版 乗り換え料金は 25,200 円だが、申し込み期限は本年12月18日
  までなので、ここはちょっとガマンして「様子見」することにしよう(^_^;)。

長い開発前夜・2001年12月27日(木)


   ぎゃぁぁぁ〜っ!! 大変なことを思い出してしまった! 今年の夏に送られてきた
  Delphi6「優待販売」ハガキだが、なんと! その申し込み期限が今月18日で切れて
  いたのだぁぁぁ!!(^_^;)

   まったくもって、不覚であった。ついウッカリと、ハガキを机上に置いたままにして
  いたのが間違いだった。机上に置いたモノは、ゴミに埋もれる……、この自然の摂理を
  完全に忘れていた。ボーランドのWebサイトで調べた限りでは、今のところ、今回の
  乗り換えキャンペーンに「乗り遅れた」ユーザーの救済策は用意されていないようだ。
  一応、確認メールを打っておいたが、果たしてどんな結果になりますやら?

長い開発前夜・2002年1月3日(木)


   ボーランド「デルファイ6」(アップグレード)     25,200 円

    バージョンアップを失念して、サポートセンターに救済を依頼していたら、すぐに
   アップグレード申込書を再送してくれた。さすがは我らのボーランド……って、客が
   カネを払うと言ってるんだから、これは当然の対応かも知れんけどな(^_^;)。新しい
   Kylix と共用出来るという「互換コンポーネント」が楽しみだ。

長い開発前夜・2002年1月12日(土)


   朝は9時過ぎに起床。ほどなくして、年明け早々にカネを振り込んだ「Delphi6」が
  宅配便で配達されて来た。早速インストールしたけど、なんだか凄い機能がてんこ盛り
  状態で驚いた。会社では 未だに「Delphi3.1」を使っていて、それでもあんまり不足を
  感じていないのだが、こりゃ慣れるまでにはちょっと時間がかかるかも知れない。

   とりあえず、巨大電卓「デカルク」を Delphi6でリコンパイルしてみた。

    ● 巨大電卓「デカルク」XP DECALC30.LZH (Delphi6 リコンパイル版)

  昔ながらの LZH 形式で 圧縮済み。解凍して出てくる実行ファイルを、現行最新公開版
  EXE(ver2.40)と 差し替えて使って下さい。特に新しい機能追加は無いけど、細かい
  チューニングを施しています。なお「環境ファイル」は、そのまま継続使用可能です。

   考えてみればデカルクも、最初の「DOS版」を作ってから、なんと10年の年月が
  過ぎ去ったわけだ。現行バージョンである ver 2.40 を公開してからも、すでに4年と
  半年が過ぎてしまった。これほどまでに新版の開発ペースが遅いのは、すでに完成度が
  十分高く、バージョンアップの必要性が少ないからだろう。……なんちゃって(^_^;)。

2002年2月8日(金)


   今週の会社は、かなり忙しかった。その忙しさの合間を縫って、久し振りに業務用の
  データベースアプリケーションを書き進めている。最初は他愛もないアプリケーション
  だろうとタカをくくっていたのだが、なかなかどうしてこれが結構本格的なシロモノに
  なりつつある。TQuery で結合した LiveUpdate の結果セットに、TUpdateSQL で更新を
  かける処理は初めての経験だ。純粋なプログラミングは、本当に楽しい。これが仕事で
  なければ、もっと楽しいのだが……(^_^;)。

   会社でのプログラミングに触発され、自宅では昨夜から Delphi6 をいじり始めた。
  驚いたことに Delphi6 では Professional 版でも TClientDataSet コンポーネントを
  利用出来るようだ。しかも Uses 節に MIDASLIB を書いておくと、MIDAS.DLL を静的に
  リンクした EXE を 生成出来る。ということは、単独で動くデータベースソフトを書く
  ことも出来るわけで、大昔に「CSVデータベース・明日香」をこしらえた私としては
  ムラムラと妄想が沸き出てくるのを抑えることが出来なくなった。

   一応、新規に表を作成して編集し、その表を保存したのち再び開く……ところまでの
  テストは成功した。TQuery や TTable、TUpdateSQL を使わず、TClientDataSet だけで
  どこまでデータ操作が出来るのだろうか? これは、ひょっとするとひょっとするかも
  知れませんぞ(^_^)。

2002年2月9日(土)


   おとといからやっている Delphi6 のテストが、かなり佳境に入って来た。現時点で
  成功したのは、以下の動作である。

      1.表の新規作成
      2.レコードの追加・削除・編集
      3.編集済みの表のバイナリデータ保存
      4.保存した表のバイナリデータ読込み
      5.表にCSVファイルからインポート
      6.表をCSVファイルにエクスポート

   このあと最低限テストしなきゃならない動作は、およそ以下の通りだと思う。

      7.項目の(動的)追加と挿入
      8.項目の(動的)削除
      9.項目定義の(動的)変更
     10.レコードの検索
     11.レコードの絞り込み
     12.レコードのソート
     13.複数の表の併合

   10番以降はある程度「勝算」があるとは言え、7・8・9については一旦定義した
  項目を動的変更することは確か不可能だったはずだから、なんらかの「再定義」機能が
  必要となるだろう。しかし、もしもこれらが成功すれば、これはもう立派に簡易データ
  ベース「明日香V2」を名乗ることが出来るはずだ。DOS時代、スキル不足から実装
  出来なかった印刷機能については、表のデータをエクセルに渡しますからそれでガマン
  して下さい …… と言うことも出来そうだ。

   いやホント、これはひょっとするとひょっとするかも知れんぞ(^_^)。

2002年2月10日(日)


   昨夜は結局、朝4時まで Delphi6 の「実験」を繰り返して沈没した(^_^;)。

   項目の「動的追加」が、まったく巧く行かない(^_^;)。昨夜から、かれこれ30時間
  近くも試行錯誤しているが、実装のための解決の糸口が全然見えてこないのだ。参考書
  とか、オンラインヘルプとか、Webとか、Nifty FDELPHI 会議室ログとか、とにかく
  膨大な分量の文献を読破したつもりだが、Delphi6 の TClientDataSet で 既存の表に
  動的に項目を追加する方法は、どこにも無かった(と思う(^_^;))。

2002年2月11日(月)


   のべ36時間を費やして、ようやく TClientDataSet に「動的に項目を挿入」出来る
  ようになった! 途中で ClientDataSet.Data なんぞに惑わされたのが間違いだった。
  てっきり、Data でアクセス出来るなら 列単位でアクセス出来るプロパティ(か何か)が
  あるに違いない!という、致命的な誤解をしてしまったのだ。 列データを TStream に
  保存したり、そこから復元しようとしてみたり、あるいは TField を動的生成して無理
  矢理 FieldDefs にブチ込んだり……、間違った思い込みで すべてはまったくの徒労に
  終わってしまった。ここまでドツボにハマったのは、本当に久々の経験だった(^_^;)。

   最初の閃きを大切にすべきだ。オンメモリとは言え、もともとはデータセットなので
  あった。列単位で一気にアクセス出来るわけ……、ねぇじゃんかぁ!(^_^;) レコード
  単位で根気良くデータを復元する以外、最初から方法は無かったのだと確信する!

 (* TClientDataSet への 動的な項目挿入 *)

 procedure TForm1.InsertField(var CDS: TClientDataSet; IDX: Integer); 
 var
   TX  : Integer;
   TMP : TClientDataSet;
 begin
   TMP := TClientDataSet.Create(SELF);
   try
     TMP.Data := CDS.Data;
     CDS.Close;
     CDS.FieldDefs.Insert(IDX);
     CDS.FieldDefs[IDX].Name     := IntToStr(CDS.FieldDefs.Count);
     CDS.FieldDefs[IDX].DataType := ftString;
     CDS.FieldDefs[IDX].Size     := FLDMAX;                (* 8192 *)
     CDS.CreateDataSet; CDS.DisableConstraints;
     TMP.Open; TMP.First;
     while not TMP.EOF do begin
       CDS.Append;
       for TX := 0 to IDX - 1 do begin
         CDS.Fields[TX].Assign(TMP.Fields[TX]);
       end;
       for TX := IDX + 1 to CDS.FieldDefs.Count - 1 do begin
         CDS.Fields[TX].Assign(TMP.Fields[TX-1]);
       end;
       CDS.Post; TMP.Next;
     end;
     CDS.First; CDS.EnableConstraints;
   finally
     TMP.Free;
   end;
 end;

   まだ「実験」段階なので Form の手続きになっているが(手抜き(^_^;))、これは絶対
  TClientDataSet を継承した 新しいクラスを作り、メソッドなんぞに仕立ててやるのが
  清く正しいオブジェクト指向プログラミングの「王道」だろうと思う。

   ともあれ、これで大きく一歩前進した! もしも本当に「明日香V2」を作ることに
  なれば、おそらく1年以上かかる大プロジェクトになるに違いない。それを思えばこの
  3連休を費やした「基礎実験」も、決してムダではなかったはずだと信じたいところ。

   しかしなぁ。実は私、今日になって初めて(ついさっき)、土曜日からオリンピックが
  開幕されていたことに気づいたのだった。こ〜ゆ〜「非常識な」生き方って、やっぱり
  あんまり自慢出来るもんじゃないよねぇ?(^_^;)

2002年2月12日(火)


   苦労して苦労して、連休中に動的な「項目挿入」が出来るようになった。今夜はその
  続きで、残っているデータベースエンジンの基本的な機能を実装した。

   まず「項目追加」だが、これはケツに追加するだけなので簡単。むしろ「挿入」より
  シンプルなロジックで、難なく実装出来た。続いて「項目削除」だが、こいつも比較的
  簡単に実装した。最後に残った「項目定義の変更」だけはチと悩んだが、対象の項目を
  いったん「削除」したあと、改めて定義を変更した項目を「挿入」すれば良いのだ!と
  いう「とんち」が閃いて、どうやらこいつも無事に実装出来たようだ。

   ここまで基本機能が実装出来たので、今度はこれらを新しいクラスにまとめることに
  した。最初の構想通り、TClientDataSet を継承して TLocalDataSet という新クラスを
  でっち上げた。さらにこのオブジェクトをコンポーネント化して、Delphi6 の 環境で
  ポトリペタリと貼り付けが出来るようにした。コンポーネントパレット上のアイコンは
  あえて TClientDataSet と同じとした。これは決して手抜きではなく「兄弟コンポ」と
  いう意味あってのことだ。うむ、ここまでは実に順調な進捗である!(^_^)

   ついでに、調子に乗って LoadFromCSV と SaveToCSV というメソッドまで実装した。
  引数に FileName を与えるだけで、CSVファイルの読み書きが出来ちゃうという誠に
  便利なメソッドだが、オブジェクトにまとめることで、実行時の経過行数表示が難しく
  なってしまった。これはちょっと、再考を要するところかも知れぬ。

2002年2月13日(水) 〜 16日(土)


   日記の更新をサボっていたので、思い出す範囲で書いておく。読めば判るが、日記を
  サボったからと言って、決して惰眠をむさぼっていたわけではない(^_^;)。

  2月13日(水)

   パス出来ない飲み会があったが、午後10時に帰宅後、気合いを入れて「明日香」の
  基本設計を開始する! これまで散々「TClientDataSet」の基礎実験だけを繰り返して
  来たが、これ以上やるのなら、ある程度アプリらしいインターフェースも同時に検討を
  進める必要があると判断。4時間かけて、メインフォームのデザインと、その技術的な
  裏付けを考えた。タブシートを使って、複数の表データを同時に開けるようにしたい。

  2月14日(木)

   データベースエンジンは「TClientDataSet」で決まりだけど、表示系も同期を取って
  検証しておく必要がある。これは当然「TDBGrid」を使う。項目情報を 一発で読み書き
  出来るメソッドを見つけたまでは良かったが、エンジン側で項目追加や削除を行なうと
  変更状況が反映されない。なんでか?(^_^;) しかも、表示系をいじり始めて気づいた
  ことだが、挿入したレコードに更新をかけると、そのレコードが必ず、データセットの
  最後の位置に来てしまう。これには 参った! TClientDataSet の「仕様」だと言えば
  それまでだが、これは近い将来、致命的な問題点になるかも知れない。妻からもらった
  義理チョコを喰いながら、午前3時まで格闘して沈没。

  2月15日(金)

   今週は、会社の仕事の方も充実した毎日だった。さぁ週末だ。大急ぎで帰宅し、午後
  8時よりメインフォームの実装を開始。

     TLocalDataSet    = class(TClientDataSet)
     TASKLocalDataSet = class(TLocalDataSet)
     TASKDBGrid       = class(TDBGrid)
     TASKTabSheet     = class(TTabSheet)

   最後の「TASKTabSheet」が、上の3つを全部載せたオブジェクト。新しいファイルを
  開くたび、このオブジェクトを動的に生成して、ページコントロール上に載せて行く。
  ページコントロールからは型が違うと怒られるが これは「TTabSheet」でキャストして
  やれば良い。最低限必要な他の部品(メニューバーやファンクションキーなど)を加えた
  テスト結果は上々。明日香V2の「張りぼて」が、この世に初めて誕生した! 調子に
  乗り過ぎ、久し振りに朝まで徹夜でブッ飛ばす。

  2月16日(土)

   徹夜明けだが、メシの時間以外はひたすら作業に没頭する。この段階では一気呵成に
  書き上げてしまわないと、アイデアがボロボロと欠け落ちる恐れもある。午後2時頃に
  ようやくテストデータの入出力と編集が可能になった。完璧なキーカスタマイズが前提
  なので、キーコードのディスパッチが厄介で結局16時間もかかってしまった(^_^;)。

   ここから、また大変。明日香V2でやろうと思っているユーザーインターフェースを
  実現するためには、かなり細かい表示系(グリッド)の制御が必要だ。

   1.編集中に下矢印キーで次行に移動すると、勝手に編集モードがクリアされる
   2.レコード更新のタイミングで、挿入データが突然飛び、消えたように見える
   3.項目定義の変更が絡むと、データセットと表示系の項目情報の同期がズレる
   4.なんと! DisplayWidth と DisplayLabel が項目情報データに書き出せない
   5.ソート機能は素晴らしいが、データファイルにはキー情報の保存が出来ない
   6.あと、まだ、いろいろある……(^_^;) ハッキリ言ってボロボロ状態(^_^;)
asuka000.jpg ← 動き始めた 「明日香V2」


2002年2月19日(火)


   明日香V2の開発は、一筋縄ではいきそうに無い。本当は今夜あたりに「評価版」を
  アップロードしたいと思っていたのだが、とてもとても(^_^;)……、まだそういう状態
  ではないようだ。項目定義の変更に伴うエンジン系と表示系の食い違いについては克服
  出来たが、ローカルデータベースならではの「クセ」といった部分で、本来はオラクル
  などのサーバーデータベース向きの部品(TClientDataSet)を使うこと自体が、そもそも
  無理が有りそうな気もしてきた。

   その最たる部分が、「挿入したレコードが、更新されたとたんに必ずデータセットの
  最終行まで飛んでしまう」という、TClientDataSet の 哀しい「仕様」である(^_^;)。
  サーバーデータベースなら「当り前」のこの仕様も、やはりローカルデータベースでは
  ユーザーには馴染みが薄いはずだ。古いユーザーさんから「明日香はレコードの挿入が
  出来ないのですか? 確かDOS版の明日香は出来たはずですけど……」なんてことを
  聞かれたら、私は一体どう答えれば良いのだろう?(^_^;)

   とりあえず、一日も早く「評価版」をアップロード出来るように頑張ろう。すべては
  その「評価版」の反響次第である。

2002年2月23日(土)


   やっと週末が来た。いつものように、パーソナルデータベース「明日香V2」制作に
  没頭するあまり、昨夜(今夜?)もまた完全に徹夜してしまった(^_^;)。

   先日も書いたように、現在、明日香の制作は「評価版」公開に向けて全精力を傾けて
  いるところだが、制作が進めば進むほど当初想定外だった事柄が明らかになり、対応に
  追われる日々が続いている。特に Delphi6 で搭載された数々の新機能については その
  技術を「採用するか?否か?」を決めるだけでも、膨大な分量の文献を読破しテストを
  繰り返さねばならない。感覚的には「1歩進んで2歩下がる」という感じかな? もし
  そうなら「下がりっぱなしやんけ!(^_^;)」というツッコミも入りそうだが、まさしく
  実態はその通りなのだ。う〜む、評価版公開までの道のりは遥かに遠いようである。

2002年2月27日(水)


   気がつけば、午前4時だった。さっきまで、明日香V2のコーディングをしてたはず
  なのに、ものすごく眠い。しかも、なぜだか無性にケツが痛い(^_^;)。この頃になって
  ようやく、自分が書斎の椅子に座ったまま、眠りこけていたことを認識する。さっきは
  確か午前1時過ぎだった。してみると、あれから3時間ほど眠っていたということか?
  またやっちゃった。こ〜ゆ〜ことを続けていると、絶対、身体に悪いよなぁ(^_^;)。

   現在、2月28日(木)午前4時20分。今日はこのまま起きていよう、そうしよう。

2002年3月5日(火)


  2月28日(木)・夜

   設計方針を2点変更する。▼1点目は機能ディスパッチ方法。▼これまで後日のキー
  カスタマイズのことを考えて、従来通り「機能番号」を仮想キーボードに埋め込む方向
  だったがこれをやめる。▼デカルクと違って明日香にはアプリ動作モードとして大きく
  閲覧モードと編集モードの2種類があった。同じキーでも、動作モードによって機能が
  違ってくるのは確実だった(^_^;)。▼バタ臭いと思い敬遠していたが、ここは明日香の
  全機能を TActionList に登録する方法を採用してみよう。▼2点目は 各タブシートの
  実装方法。▼今まではこれを動的に生成するため、すべてのコードをゴリゴリと書いて
  いたが、これではさすがに画面デザインが辛い。▼IDE を使ってデザイン設計が出来る
  よう、1枚毎のシートを Form で生成することにした。▼実行時に、この Form をタブ
  シートに貼り付けて行く。これでイベントの記述もラクになるはず。▼ファンクション
  キー表示に凝る。▼A群〜D群のファンクションキーに加えて、データの編集時に専用
  ファンクションキーを出す。これはDOS版明日香では実現出来ず、悔しい思いをした
  ところ。▼ついでに Shift と Ctrl と Shift+Ctrl に ファンクションキーが自動的に
  反応するようにした。▼かっちょい〜(^_^)。今夜はここまで。

 (* キーダウン *)
 procedure TMFORM.FormKeyDown(Sender:TObject; var Key:Word; Shift:TShiftState); 
 begin
   if Shift = [ssShift, ssCtrl] then
     ChangeFuncKey(FuncKeyShiftCtrl)
   else
   if Shift = [ssShift] then
     ChangeFuncKey(FuncKeyShift)
   else
   if Shift = [ssCtrl] then begin
     ChangeFuncKey(FuncKeyCtrl);
   end;
 end;

 (* キーアップ *)
 procedure TMFORM.FormKeyUp(Sender:TObject; var Key:Word; Shift:TShiftState);
 begin
   if (Key = VK_SHIFT) or (Key = VK_CONTROL) then begin
     DispMainFuncKey;
   end;
 end;

  3月1日(金)

   シートのお面を Form に出来たのは良かったが、そのシートの破棄時にエラーが発生
  するようになった(^_^;)。▼コントロールは親ウィンドーを持っていません。▼かなり
  悩んだが、FDELPHI の過去ログで PageControl に NIL を入れる方法を発見。試したら
  これがビンゴ。▼シート生成と Form 生成を分けて、Form 生成は シートの Loaded で
  やる方式にも変更した。▼ここまでのコードを以下に示す。消耗だった(^_^;)。

 (* ロード *)
 procedure TASKSheet.Loaded;
 begin
   SELF.Visible := FALSE;
   inherited Loaded;
   FPFORM := TPForm.Create(SELF);
   FPFORM.BorderStyle := bsNone;
   FPFORM.Align       := alClient;
   FPFORM.Parent      := SELF;
   FPFORM.Caption     := SELF.Caption;
   FPFORM.Show;
   SELF.Visible := TRUE;
 end;

 (* タブシートの生成 *)
 procedure TMFORM.CreateASUKASheetExecute(Sender: TObject);
 var
   ASUKASheet : TASKSheet;
 begin
   ASUKASheet := TASKSheet.Create(SELF);
   ASUKASheet.PageControl := PGBASE;
   ASUKASheet.Caption := ' 無題 ' + IntToStr(PGBASE.PageCount) + ' '; 
   PGBASE.ActivePage := ASUKASheet;
   ASUKASheet.Loaded;                 // ←ここがミソ
 end;

 (* タブシートの破棄 *)
 procedure TMForm.DisposeASUKASheet;
 begin
   if PGBASE.PageCount > 0 then begin
     with TASKSheet(PGBASE.Pages[PGBASE.ActivePageIndex]) do begin
       PageControl := NIL;            // ←ここがミソ
       Free;
     end;
   end;
 end;

   問題発生。▼テスト中 F12 を押したら、突然落ちる(^_^;)。OSの デバッグ機能の
  ようでもあり、ようでもなし。▼一応、自作コンポの TFunctionKey も疑ってみたけど
  このコンポはもう4年近くも使っており、実績は十分あるはず。今まで気づかなかった
  なんて信じられない!▼試しに Delphi3.1 を起動して、TFunctionKey だけ貼り付けて
  やってみる。▼あらら、Delphi3.1 でも落ちてしまった。▼もう寝よう(^_^;)。

  3月2日(土)

   夜中の F12 問題がようやく解決。▼私のせいではなかった。これは もともとOSの
  デバッグ機能だった(NT/2000 のみ発生、95/98/Me に この機能は無い)。▼レジストリ
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug の中の
  UserDebuggerHotKey=0x00000000 という指定を 0x00000013 に変えると、このデバッグ
  機能のトリガを F12 から Pause キーに変更出来る。▼以上、FDELPHI 過去ログより。
  ▼F12 が動き出したので、閲覧モードと編集モードを行き来出来るようにする。▼だが
  これは一筋縄では行かない様子。▼そもそも DBGrid のカーソル制御を細かく設定する
  要求は、いわゆるクラサバシステムでは少ないのかなぁ?▼DOS版の桐の動きを思い
  出しながら、ひたすらやる。▼DataSource の OnStateChange なら出来そうな気もする
  けど、動的生成したインスタンスで親 FORM のファンクションキーをいじるのは美しく
  ないと思う。▼仕事じゃないから、趣味に走りまくって「美しい」コードを書きたい!

  3月3日(日)

   色々やったら、閲覧モードと編集モードの行き来だけは出来るようになった。▼だが
  単一セルの修正と複数セルの連続編集の区別がつかない。▼単一セルの修正のつもりで
  下矢印↓キーを押したら、そのまま連続編集「出来て」しまう。この時ファンクション
  表示も同期が取れない(^_^;)。▼根本的に、DataSource の OnStateChange で見るべき
  なんだ!と確信する。▼しかし、動的に生成したインスタンスだからなぁ。美しくない
  もんなぁ(^_^;)。▼子のインスタンスのイベントを、親が感知する方法はないのか?

  3月4日(月)

   背に腹は変えられない。▼DataSource の OnStateChange 内で、親のファンクション
  キー表示をいじる方法を採用することにする。▼単一セル修正と複数セルの連続編集の
  違いは、新規採用したフラグ EditContinue で実現。▼以下、苦悩のコード。

 (* 編集モードへ *)
 procedure TPFORM.ChangeEditMode;
 begin
   DSET.Edit;
   GRID.SetFocus;
   GRID.Options := GRID.Options + [dgEditing];
   with TDMYDBGrid(GRID) do begin
     EditorMode := TRUE;
     InplaceEditor.SelectAll;
   end;
 end;

 (* 表示モードへ *)
 procedure TPFORM.ChangeBrowseMode;
 begin
   DSET.Post;
   with TDMYDBGrid(GRID) do begin
     EditorMode := FALSE;
   end;
   GRID.Options := GRID.Options - [dgEditing];
   EditContinue := FALSE;                    // ←新規採用したフラグ 
 end;

 (* データセット状態変化時 *)
 procedure TPFORM.DSRCStateChange(Sender: TObject); 
 begin
   case DSET.State of
     dsBrowse   : Info.Panels[0].Text := '表示';
     dsInsert   : Info.Panels[0].Text := '挿入';
     dsEdit     : Info.Panels[0].Text := '編集';
     dsSetKey   : Info.Panels[0].Text := '検索';
     dsFilter   : Info.Panels[0].Text := '選択';
     dsInactive : Info.Panels[0].Text := '閉塞';
     else         Info.Panels[0].Text := '';
   end;
   Info.Update;
   if DSET.State = dsBrowse then
     MFORM.DispMainFuncKey                    // ←ここが汚い(^_^;)
   else begin
     MFORM.DispEditFuncKey;                   // ←ここが汚い(^_^;)
   end;
 end;

   またもや問題発生(^_^;)。▼編集モードから表示モードに戻ったあと、何かの拍子で
  ファンクション表示の同期「だけ」が取れなくなる。▼まだ、悪い部分がある模様。

  3月5日(火)

   リターンキーを押した時に、カーソルがヨコだけじゃなくタテにも動けるよう改善。
  ところが、これが 苦労の始まりだった(^_^;)。 ▼表示モードに戻って来て、カーソル
  移動しただけで落ちちゃう。▼なんでかなぁ? と思ったら、グリッドの OnColExit で
  強制的に表示モードにしたところが悪いようだ。InplaceEditor が NIL? ▼DSET.Post
  直前に DSET.State をチェックするようコード変更。しばらく、これで様子を見よう。
  ▼カーソルがヨコに動く時は良いが、タテだと相変わらず、単一セル修正と複数セルの
  連続編集がごっちゃになる。▼OnColExit で表示モードに戻すと EditContinue = TRUE
  and CursorDirect = VK_DOWN の時 イベントが発生しない。列を抜け出てないんだから
  当然だった(^_^;)。▼これは InplaceEditor を外出しにするしかない!と思って 実際
  やってみたら、お目当ての InplaceEditor.OnKeyDown は protected だった(VCLソース
  でも確認)。▼仕方ないから グリッドの OnKeyDown で EditContinue/CursorDirect を
  見ることにした。▼ついでに この EditContinue/CursorDirect は、各ページ毎に保有
  する必要があることにも気づく。Win版の桐で確認したら、まさしく同一仕様だった。
  ▼テストしてみたら、ようやく思った通りの動作となった!▼少しだけDOS版の桐に
  近づいた(^_^)。▼……と思ったけど、やっぱりダメみたい(^_^;)。

 (* データセット状態変化時 *)
 procedure TPFORM.DSRCStateChange(Sender: TObject); 
 begin
   case DSET.State of
     dsBrowse   : Info.Panels[0].Text := '表示';
     dsInsert   : Info.Panels[0].Text := '挿入';
     dsEdit     : Info.Panels[0].Text := '編集';
     dsSetKey   : Info.Panels[0].Text := '検索';
     dsFilter   : Info.Panels[0].Text := '選択';
     dsInactive : Info.Panels[0].Text := '閉塞';
     else         Info.Panels[0].Text := '';
   end;
   Info.Update;
   if DSET.State = dsBrowse then
     MFORM.DispMainFuncKey                    // ←汚いけど仕方ない(^_^;)
   else begin
     MFORM.DispEditFuncKey;                   // ←汚いけど仕方ない(^_^;)
   end;
 end;

 (* グリッドキー押下時 *)
 procedure TPFORM.GRIDKeyDown(Sender:TObject; var Key:Word; Shift:TShiftState); 
 begin
   if (Key = CursorDirect) and (not EditContinue) then ChangeBrowseMode;
 end;

 (* 編集モードへ *)
 procedure TPFORM.ChangeEditMode;
 begin
   DSET.Edit;
   GRID.SetFocus;
   GRID.Options := GRID.Options + [dgEditing];
   with TDMYDBGrid(GRID) do begin
     EditorMode := TRUE;
     InplaceEditor.SelectAll;
   end;
 end;

 (* 表示モードへ *)
 procedure TPFORM.ChangeBrowseMode;
 begin
   if (DSET.State = dsEdit) or (DSET.State = dsInsert) then DSET.Post; 
   with TDMYDBGrid(GRID) do begin
     EditorMode := FALSE;
   end;
   GRID.Options := GRID.Options - [dgEditing];
   EditContinue := FALSE;
 end;

         (* ---------------- 以下、メインフォーム側 ----------------- *)

 (* キーダウン *)
 procedure TMFORM.FormKeyDown(Sender:TObject; var Key:Word; Shift:TShiftState); 
 begin
   if Shift = [ssShift, ssCtrl] then
     ChangeFuncKey(FuncKeyShiftCtrl)
   else
   if Shift = [ssShift] then
     ChangeFuncKey(FuncKeyShift)
   else
   if Shift = [ssCtrl] then begin
     ChangeFuncKey(FuncKeyCtrl);
   end;
   if Key = VK_RETURN then begin
     Key := TASKSheet(PGBASE.Pages[PGBASE.ActivePageIndex]).PFORM.CursorDirect;
   end;
 end;

 (* キーアップ *)
 procedure TMFORM.FormKeyUp(Sender:TObject; var Key:Word; Shift:TShiftState);
 begin
   if (Key = VK_SHIFT) or (Key = VK_CONTROL) then begin
     DispMainFuncKey;
   end;
 end;

asuka001.jpg ← 2002.03.05 現在


2002年3月6日(水)


   昨日の日記でもご紹介したように、明日香V2の開発は「およそデータベースからは
  ほど遠い(^_^;)」ところで四苦八苦している有様だ。昨日の日記の最後の部分に、

     ▼……と思ったけど、やっぱりダメみたい(^_^;)。

  と書いたあと色々と考えていたら、明日香の動作モードには「表示」モードと「編集」
  モードの2種類がある……だけじゃなく、この2種類のモードが「各ページ毎に」にも
  存在することに気がついたのだ。プログラム的には2次元じゃなくて3次元的な思考が
  要求されるわけで、さらに色々と考えていたら「表示」「編集」の両方にも相当しない
  状態、すなわち「データ無し」状態があることに気がついた。これらの各状態において
  ファンクションキー表示を破綻なく切り替えるためには、単にデータセットの状態だけ
  見ておれば良いわけでは決してない。

   こ〜ゆ〜の、なんて言ったっけ? そうそう、確か「状態遷移」と言ったはず……と
  思い出したので、本棚から「憂鬱なプログラマのためのオブジェクト指向開発講座」と
  いう本を引っ張り出してきて、これをジックリと読み直してみた。すごい! たった今
  私がもがき苦しんでいる状況が、実に理路整然と解き明かされている! ずっと以前に
  この本を読んだ時にも大感動したものだが、すっかり忘れておったわい(^_^;)。

   これはもう、まずは「状態遷移図」を描くところから始めて、クラス設計をやり直す
  くらいの覚悟で取り組む必要があるなぁ、と思い至った次第(^_^;)。

2002年3月9日(土)


   今日は職場の慰安旅行。と言っても遠出をするわけじゃなくて、ちょっくら別府まで
  温泉巡りに行ってくる。明日の朝には帰宅予定。出張中に「憂鬱なプログラマのための
  オブジェクト指向開発講座」を読了したので、クラス図とか状態遷移図とか描きたくて
  ウズウズしているのだが、それも明日までお預けだ。

2002年3月11日(月)


   昨日から色々と考えて、非常に単純ながら、ようやく明日香V2の「状態遷移図」を
  描き上げた。ちょっと恥ずかしいけど、思い切って下図を公開しちゃおう(^_^;)。
【明日香V2・状態遷移図】 ver 0.10
   一応、現時点ではこれで良いはず(……だと思っている)。本当はデータ編集中の状態
  にも様々な局面があるのだが、物事は出来るだけ単純化した方が良いので、現時点では
  あえて詳細は描かない。プログラム的にも、コードへの影響は少なくて済みそうだ。

   描き上げてみて思ったが、先日から苦労している明日香V2の全体構成も、ここまで
  単純化すると全体がスッキリした。私の書いてきたコードにも「大きな狂い」は無くて
  一安心だ。こうなると「この図を描いても描かなくても同じだったんじゃないか?」と
  冷やかされるかも知れないが、しかし、この図をキチンと描いたことにはやはり大きな
  意義がある。特に、下の方に描いてある「ページ無し」状態をひとつの「状態」として
  認識出来たのが収穫だった。実際問題、今の明日香V2は「ページ無し」でも問題無く
  動作するが、これは「偶然」ではなく「必然」だと認識出来ることが大切なのだろう。

   その意味で、(泥沼で苦しむ前の)早い段階から、全体構成をスッキリ整理出来たのは
  幸いだった。また、これを描いたからこそ 一部コードにムダがある(有り得ない条件を
  IF 文で尋ねていた)部分にも気付いたので、さっき早速それを修正したところだ。

   よ〜し。とりあえず「状態遷移図」は描けた。あとは素直にこの図をコード上に反映
  して行こう。早速、今夜から頑張ってみよう(^_^)。

2002年3月13日(水)


   状態遷移図が描けたので、大きな骨組みだけは「ほぼ」正確にコードに落とすことが
  出来たように思う。あれほど苦労していた「表示」モードと「編集」モードの行き来が
  実にスムーズになってきて、ようやく最初の山場を超えられた。▼遅れを取り戻すべく
  作業を続行。これまで「実験」で成功している各種機能を、今度はひとつひとつ正式な
  ユーザーインターフェースで包みながら実装して行かねばならない。▼まず「行挿入」
  機能を実装。従来の「連続訂正」部分の突入ルーチンを、ほんの少しだけ拡張して修正
  したら、案外カンタンに出来上がってしまった。気を良くして「行削除」も考えたけど
  こちらはまだユーザーインターフェースが決まらないので後回し(^_^;)。▼「整列」で
  使うユーザーインタフェースパネルをこしらえたところで、今夜はダウン。

2002年3月14日(木)


   昨夜こしらえた「整列」パネルに、実際のソート機能を組み込んだ。▼実験段階では
  データセットに対し単に「IndexFieldNames := SortStr;」とだけ 書き込めば良かった
  わけだが、この1行に至るまでのユーザーインターフェース部分の実装は、面倒なこと
  この上ない試練である(^_^;)。▼苦労してその実装も完了。お〜、素晴らしい! 実に
  気持ち良くレコードが「整列」出来た!▼ソートキーの保存と復元が、直近の課題だ。
asuka002.jpg ←「整列」指定パネル


2002年3月15日(金)


   ソートキーの保存と復元は、他にも出てくるであろう保存情報と一緒に考えることに
  して、今夜はその他機能の実装に燃えることにした。▼となると次はいよいよ「選択」
  機能である。実験では動作確認が取れているが、ユーザーインターフェースまで含めた
  実装はこれからだった。▼我が崇拝する管理工学研究所は、Windows 版「桐」を作るに
  あたって、非常に多くのユーザー操作の局面で、操作の前にまず「名前付け」をさせる
  思想を導入した。Windows 版の「桐」では、何をするにもパネルが出て来て、これから
  設定する一連の操作内容の「名前」を尋ねられるのだ。▼私は、この思想は間違いだと
  思う。このパネルがワンクッション入るだけで、毎回毎回イライラしているのは私だけ
  ではないはずだ(^_^;)。▼明日香V2では、ここは是非とも、やりたいことがズバッと
  出来る、(そもそも操作に「名前を付ける」などという高級機能が無かった)「昔風」の
  ユーザーインターフェースを再現したい。▼とりあえず「比較選択」パネルをデザイン
  してみる。比較式の入力で、単独条件指定から複数条件指定に違和感無く移れるように
  工夫するのが、ここでのデザイン目標だ。▼意外と良い感じで、パネルデザインだけは
  出来た。コードを書くのは大変だろうけどね(^_^;)。▼大物は先の楽しみに取っておく
  ことにして、残り時間で「先頭行へジャンプ」「最終行へジャンプ」機能を実装。また
  ついでに「元に戻す」機能も実装出来た。なんと、編集中なら、無限アンドゥが可能と
  なった!▼こんなにすごい機能がサラリと書けるのは、何と言っても Delphi6 が提供
  してくれた TClientDataSet のお陰である。▼今夜はここまで。午前4時半就寝。
asuka003.jpg ←「比較選択」パネル


2002年3月17日(日)


   この週末に苦労して、ようやく「比較選択」機能を実装した。任意の(複数)項目列を
  対象として「等しい・等しくない・大きい・小さい・以上・以下・含む・含まない」の
  比較が出来る。ついでに「前方一致・後方一致・定義・未定義」まで組み込んだ。もし
  これ以上の要求(関数の利用など)が出て来たら「拡張指定」させることにして、今日の
  ところはこれで良しとする。▼選択の指定段数は無制限である。指定した条件はリスト
  保存してあるので「解除」「全解除」も自由である。ここだけを見たら、まさしく桐に
  ソックリである(^_^)。 ▼気を良くして「指定行」選択の実装に取り掛かったが、実は
  ここで行き詰まる。指定行だけを Filter 化する方法を思いつかない(^_^;)。ひょっと
  すると、選択行を識別するための単項目を、あらかじめ「隠し項目」として持っておく
  必要があるのかな?▼ここは確か、DOS版明日香でも苦労した部分だから、ちょっと
  頭を冷やして考え直すことにしよう(^_^;)。▼午前4時就寝。

2002年3月18日(月)


   ここんところ明日香V2の制作に夢中になっていて、本当に時間が惜しくて惜しくて
  たまらない。毎日の睡眠時間を無茶苦茶に削っているが、実はその削ったあとで眠った
  睡眠時間も惜しく感じるのだ。人間、全然眠らずに生きていくことが出来れば、なんと
  素晴らしいことだろう! 寄る年波で、そうそうムチャも出来ないんだけどね(^_^;)。
  午前4時半就寝。

2002年3月22日(金)


   夜中の12時近くに帰って来て、いつものように明日香V2の開発に取り掛かった。
  じっとソースを眺めていたら「美しくない」部分が目についたので、それを「美しく」
  書き直そうかと思ったら5時間近くもかかってしまった(^_^;)。寝たのは午前5時前で
  ある。しかし苦労した甲斐はあって、機能的な進展は何ひとつ無かったが、全体構造は
  極めて「美しい」ものになった。今夜はこれで良しとする。

2002年3月23日(土)


   朝から1日中、ずっと明日香V2の開発作業に没頭した。▼昨夜苦労して全体構造を
  改善することが出来たのは本当に良かったと思う。骨組みがしっかり出来上がったので
  あとは安心して各種機能を実装して行ける。▼本日まず最初に実装したのは「行削除」
  機能である。現在行・指定行・すべての行について、それぞれメニューから選んで削除
  出来るようになった。▼続いて削除行を「行復活」する機能に取り掛かる。これまでの
  基礎実験では試していなかった機能なので、ちょっと心配(^_^;)。▼かなり苦労したが
  ようやく「行復活」に成功した。データを保存する前なら、任意の時点で「指定行」と
  「全行」の復活が出来る。▼「行復活」は、諸般の事情(要するにスキル不足(^_^;))で
  DOS版明日香には搭載出来なかった機能なので、それが編集中に限るとは言え、実装
  出来たことは大変嬉しい。本当なら、やろうと思えば前回保存「前」に削除した行まで
  復元することも出来そうなのだが、とりあえずこの仕様で行くこととする。▼データの
  削除・復元が可能となったので、今度はそれを「書き出し」出来るようにする。すでに
  CSVへのエクスポートは実装済みだが、これを他の「表データ」として書き出すのは
  チと難しい。▼最初はクローンカーソルを使ってみたが、これは失敗。どうもクローン
  カーソルの仕様を誤解していていたようだ。▼内部的に別の表を動的生成して、これに
  データをコピーしたあと、フィルターを反転させて残った行をバイナリ保存する、この
  方法で「表データ書き出し」を実装完了。▼「削除」と「復活」と「書き出し」が完成
  したので、テストデータ作成がやりやすくなった。▼ちょっと気分転換の意味もあって
  バージョン情報のパネルデザインをやる。明日香V2は、アイコンまで「桐」みたいな
  雰囲気になってしまった。明日香の「A」をデザインしてみたつもりだけど、これって
  やっぱり「パクり」に見えるかなぁ?(^_^;)▼午前5時就寝。
asuka004.jpg ← バージョン情報表示パネル


2002年3月24日(日)


   ボーランドジャパンのサイトで、Delphi6 のアップデートパック2が公開されている
  ことに、今日になって気付いてしまった。今月19日に公開されたモノのようである。

    ● Delphi 6 Update Pack 2 (39,054,463 byte)

   なんと! ファイルサイズが38メガ以上もあるから、気合いを入れてダウンロード
  しなくちゃならない(^_^;)。私は「1メガ」しかスピードの出ない「高速」Yahoo!BBを
  使って、それでも約5〜6分でダウンロードすることが出来た。

    (39,054,463 × 8) ÷ 1,024,000 ÷ 60 = 5.08521653645833

   巨大電卓「デカルク」で計算してみたら、上のような数値になる。理論値で5分なら
  我が家のADSLもそこそこスピードが出ていることになる。本当に有り難くも幸せな
  時代になったものだ。

2002年3月25日(月)


  3月24日(日) 夜の部

   ようやく「行操作」関連をモノにしたので、引き続き「列操作」関連に取り掛かる。
  まずは「項目削除」である。▼この部分は、先月の中旬、のべ36時間を費やして確認
  した「基礎実験」の範囲内であるから、意気揚々とコーディングにいそしんだ。そして
  意気揚々とテストしてみたら、なんとエラーで落ちちゃった(^_^;)。目の前が真っ暗に
  なった。▼調べてみると、グリッドの列削除部分でコケている。どうもグリッドが列を
  掴み切れていない感じ。基礎実験はデータセットについてのみ確認しており、グリッド
  項目セットとの関連性は見逃していた。▼一応、RebuildColumns で 列を再構築すると
  エラーは止まったが、今度はデータセット項目とグリッドの同期が取れない。▼どうも
  私はグリッドの「持続的な列」について、根本的な部分で仕様を勘違いしているのかも
  知れない。▼ヘルプ・マニュアル・参考書・会議室ログ・メーリングリストログなどの
  文献を片っ端から読みあさってヒントを探したが、残念ながら今夜は収穫無し。▼空が
  明るくなる前の午前5時就寝(^_^;)。会社はど〜すんだよ、会社は?(^_^;)

  3月25日(月)

   「項目削除」がエラーでコケる部分は、RebuildColumns による 応急的措置で逃げる
  ことにした。気を取り直して「項目挿入」「項目追加」「項目定義変更」の方を、先に
  片付ける。▼項目定義用のパネルをデザインしてみた。下の写真がそのパネル。1枚の
  パネルが、モード付きコンストラクタで3種類のパネルに化けて出て来る。
asuka005.jpg ← 項目定義用パネル

  ▼項目のデータタイプは、当初「文字列」「数値」くらいが有れば十分じゃんと思って
  いたけど、少し欲張って「実数/整数/金額/日付/時刻」の各型を実装した。さらに
  自動的に連番を採番してくれる「カウンタ」型まで用意した。こんなにデータタイプを
  増やして大丈夫かしらん?(^_^;)▼案の定「項目定義の変更」が、データタイプの相互
  変換ルーチンのエラーでコケまくる。データ型変換はバリアント型でやるとよろしい、
  と書いてある参考書も読んだが、その通りにしてもエラーは止まらず。▼仕方ないので
  変換ルーチンを try 〜 except で はさみ、例外発生時に Continue させる処理を組み
  込んだ。▼この割り込み処理は「卑怯」なのと、単体テストで いちいち EXE 起動する
  必要があるのとで本当は嫌いなのだが、今回だけは背に腹は代えられまい。▼応急措置
  した「項目削除」を含めて、この2日間で主要「列操作」関連が実装出来たことは大変
  良かったが、しかし会社はど〜すんだよ、会社は?(^_^;)▼……などと、自分で自分に
  昨夜と同じツッコミを入れつつ午前4時就寝。

2002年3月26日(火)


   午前8時。出勤前の10分間でマニュアルを読み直していたら、気になる記述が目に
  ついた。TDataSource.Enabled を、アプリ動作中に FALSE に設定するのは 実はあまり
  よろしくないらしい。▼私はしょっちゅう TDataSource.Enabled を FALSE に設定して
  使う。これだ!と閃いた。▼会社から帰って来て早速試してみたら、おとといエラーに
  なっていた「項目削除」が、今度はうまく成功した!▼どうも TDataSourceEnabled を
  FALSE にすると、その時点でグリッドが列から項目セットのリンクを見失う(?) のでは
  ないか?と思われる。▼これまでは意味があって設定して、期待通りの効果を得ていた
  TDataSourceEnabled だが、項目の「動的削除」を行なう機会が 極めて少ないクラサバ
  システムでは、たまたま問題が表面化していなかっただけのことらしい。▼明日香V2
  みたいなローカルデータセットでは、アプリケーションは TDataSourceEnabled を設定
  する時には注意が必要である。▼今夜はこれから、出来上がった「列操作」関連の耐久
  試験にいそしむつもり。▼ここんとこ寝てないので、今夜あたりは早目に寝よう。

2002年3月27日(水)


   ああ、昨夜の日記に嘘を書いてしまった。「ここんとこ寝てないので、今夜あたりは
  早目に寝よう。」大嘘だった(^_^;)。寝たの、またもや朝の5時前だった(^_^;)。自分
  でも信じられないのだが、最近の私は、何かに取り憑かれたような勢いで明日香V2の
  プログラミングに没頭している。なんか変じゃないのか?>わし(^_^;)。

   またまた、設計方針を変更する。▼これまで、画面に見える表の体裁は、極力データ
  セット本体の方を変更する方針でやってきて、グリッドの属性の方は積極的には使って
  いなかった。しかし、今後はこの方針をやめる。つまり、今後はグリッドをバリバリに
  カスタマイズして、ひとつのデータセットが複数の「見え方」で見えるようにしたい。
  ▼これって、オラクルなどの「ビュー」の考え方だね。これをやると、データセットと
  ビューの関連性が煩雑になりそうな予感がしたので敬遠していたのだが、明日香V2の
  ようなローカルデータベースでは、そうも言っていられないことにようやく気付いた。
  ▼とりあえず、桐の「表示条件」くらいの機能は実現しようと思う。それ以上、つまり
  例えば「フォーム」とか「レポート」とかの機能は後回しだ。「表示条件」を実装する
  ことが出来て、その時点で腹をくくる覚悟があったら挑戦してみよう。▼以上の変更は
  昨夜 TDataSource.Enabled 関連を修正した時に思いついたもの。世の中 何が起こるか
  判らないが、それはプログラミングの世界にも言えることだ。▼今夜は午前3時就寝。

2002年3月30日(土)


   今日は丸1日をかけて、明日香V2の「項目表示条件」設定ロジックを書き上げた。
  先日、設計方針を変更して、グリッドをバリバリにカスタマイズしよう!と決めたのを
  受けてのお話である。▼下の写真(左)が、項目表示条件の設定パネルである。デザイン
  決めるだけでも、相当な時間がかかってしまった(^_^;)。▼写真(右)は、この表示条件
  設定パネルを使って、実際に表データの項目表示を変更してみたところ。項目背景色が
  一部分、変更されているのが判るだろうか? これが本日「昼の部」の成果であった。
asuka006.jpg
asuka007.jpg
項目表示条件 設定パネル
項目表示条件を変更しているところ

  ▼変更可能なプロパティーは、表示位置・表示幅・文字色・背景色・フォントの種類・
  フォントサイズ・フォントスタイル・文字飾り(取消し線・下線)であり、これがデータ
  及び項目タイトルで、各々を独立して設定可能である。ちょっと「凝り過ぎ」となった
  ような気がしないでもない(^_^;)。▼実際問題、こんな機能は「お遊び」の範疇にある
  もので、本当はもっと先に実装すべき重要機能が残っているのだが、ま、こ〜ゆ〜のも
  たまには宜しかろう。

2002年4月1日(月)


   本日の成果。▼「先頭項目へジャンプ」「最終項目へジャンプ」実装。▼グリッドの
  表示幅指定を桁数換算指定から直接ピクセル指定へ変更。▼メインフォームの大きさに
  最小制限値を適用。ここはもちろんDOS版明日香と同じ 640×400 ピクセルとした。
  ▼これに伴い パネルデザインの一部も変更。すべてのパネルが、タテ 400 ピクセルに
  収まるようになった。▼項目の「表示幅変更」実装。項目幅がゼロになる時は、項目が
  自動的に非表示になる。反対に表示が復活する時には、表示幅が強制的に初期値になる
  ようにした。▼ポップアップメニューの出現位置を調整。マウスポインタがあさっての
  場所にある時も、メインフォームの上空にメニューが出るようになった。▼編集モード
  から表示モードに戻る時の Post 判定に、CheckBrowseMode を新規採用。これはかなり
  良い感じ。▼23時頃から、書斎の椅子の上で仮眠を取る。午前3時起床。4時間寝た
  ので、これで良しとする。▼起動時「引数評価」を実装。エクスプローラなどでデータ
  ファイルをダブルクリックしたら、直接明日香が立ち上がるようになった。▼ちょっと
  思いついて、デスクトップ上の明日香のショートカットにデータファイルをドラッグ&
  ドロップしてみたら、こちらも見事に明日香が起動した。少しだけ感動。Windows って
  素晴らしいOSだなぁ(^_^)。

2002年4月4日(木)


   あ〜、眠い(^_^;)。今、4月5日の午前3時だ。ついさっき、目が覚めたところ。

   今日で3日も続けて椅子の上で寝てしまった。ケツが痛くて仕方がない。眠っている
  3〜4時間、体重がすべてケツの1ケ所に集中するわけだから当然であろう。寝たきり
  老人の「床擦れ」に近いものを体験しているわけで、どう考えても健康ではないわな。

   明日香V2の方は、ようやく「置換」機能を実装した。桐で言うところの「置換」に
  相当する「全置換」と、明日香オリジナル機能(?) でもある「部分置換」機能の2種類
  である。各々、置換開始行を「先頭行/現在行」から選べるようになっているが、この
  あと「行毎の確認」を「しない/する」から選択するオプションを追加せねばならぬ。

   今週は異動の引継と新体制での業務開始とでバタバタしていて、3日間も椅子の上で
  寝て頑張った割には、作業の進捗状況は芳しくない。機能を追加すればするほどテスト
  負荷が増えるのも非常に辛いところだ。今日はこれから仕事に行くけど、帰って来たら
  気合いを入れ直して、残り機能の実装に取り組もうと思う。
asuka008.jpg ← 置換条件指定パネル


2002年4月6日(土)


   本日の実装済み機能。▼置換機能に「行毎に確認」オプションを追加。▼部分置換に
  新オプション「大文字/小文字の区別」を追加。▼お遊び機能として「作者のサポート
  サイトへ」「作者にメールを送る」を追加。これは少し、感動した(^_^)。 ▼読み込み
  機能のうち「CSVファイルのインポート」にバグが見つかる。慌てて直した(^_^;)。
  ▼置換を実装出来たので、以前からの課題である「指定行選択」の実装方法を検討して
  いる。▼今考えている方法は、レコード行に「隠し項目」を持っておき、リターンキー
  押下のタイミングで選択の「深さ」を意味する数字を書き込む……という方法だ。この
  方法は、原理自体は非常に単純明快だと思うのだが、最大の弱点は「行選択しただけで
  レコードに更新フラグが立ってしまう」ということだ。▼例えば既存ファイルを開いて
  そのあと「指定行選択」しただけなのに、ファイルを閉じる時「レコードが更新されて
  います。保存しますか?」というメッセージが出ちゃうのはどうよ?(^_^;)▼やっぱり
  もう少し考えないとダメかも知れない。▼午前5時半就寝。
asuka009.gif

2002年4月9日(火)


   結局南極(ふ、古い(^_^;))、明日香V2に「指定行選択」させるための、巧い方法を
  思いつかない。▼レコードにダーティーフラグを立てないで更新するためには、データ
  セットの LogChanges を一時的に FALSE にすれば良い…… という見当まではついたが
  本当にレコード行の1行1行に「隠し項目」を持っても良いものか?という決心がまだ
  つかない。▼と言うより、ここはやっぱり「DOS版明日香」のリストインデックスと
  同じように、選択レコードのリザルトだけを保持するインデックスを別のリスト構造で
  持つべきかも?▼悩んでいても仕方ないので、とりあえず他の部分を優先させる。▼と
  いうわけで、今夜実装した機能は「連番付け(項目置換)」「ソートキー保存」の2つ。
  ▼ソートキー保存は「案ずるより生むが易し」だった。Set(Get)OptionalParam という
  そのものズバリのメソッドで一発である。▼こうなってくると、他の設定項目も続々と
  保存したくなる。これを「美しく」実装するためには、ちょっと整理が必要なようだ。
  ▼お遊びで 明日香V2のアイコンイメージを GIF 形式の画像にしてみた。下の画像が
  その明日香「A」のデザイン。桐V8アイコンのパクりじゃありません(^_^;)。
asukaico.gif ← 明日香V2のアイコンイメージ


2002年4月13日(土)


   本日の明日香V2進捗状況。▼データ行エクスポート機能を強化した。以前から可能
  だった「CSVファイルへの出力」に加えて「エクセルシートに書き出し」機能を実装
  した。▼項目名の同時出力や余白行列の出力指定も可能になったが、エクセルシートを
  任意のファイル名で保存する方法だけが判らず、大変苦労した。▼強制的に上書き保存
  するために DisplayAlerts を FALSE にしたけど、これって良かったのかなぁ?(^_^;)
  ▼ここんとこ、何故だか判らないけど、どうも開発ペースが若干落ちて来ているような
  気がしないでもない。疲れか?スランプなのか?(^_^;)

 (* エクセルOLE起動 *)
 procedure TEXFORM.WOutToExcel;
 const
   MaxXLSLine: Integer = 65535;
 var
   EExcel:       Variant;
   EApplication: Variant;
   EWorkBook:    Variant;
   EWorkSheet:   Variant;
   TX, TY, RX:   Integer;
 begin
   if PBar.Max + BlankY.Position > MaxXLSLine then begin
     Hide;
     DispBeepMess('転送データが エクセルの理論限界値を超えています!');
     ESCWOUT := TRUE;
   end
   else begin
     Caption := ' データ転送中、しばらくお待ち下さい ・・・・';
     try
       EExcel := CreateOleObject('Excel.Application');
       EApplication := EExcel.Application;
       EApplication.WorkBooks.Add;
       EWorkBook  := EApplication.ActiveWorkbook;
       EWorkSheet := EApplication.ActiveSheet;
       EApplication.Visible := FALSE;
       if not WOUTFLD.Checked then
         TY := BlankY.Position
       else begin
         TY := BlankY.Position + 1;
         RX := BlankX.Position + 1;
         for TX := 0 to FDataSet.FieldCount - 1 do begin
           if FDataSet.Fields[TX].Visible then begin
             EWorkSheet.Cells[TY, RX] := FDataSet.Fields[TX].DisplayLabel;  
             inc(RX);
           end;
         end;
       end;
       inc(TY);
       FDataSet.First;
       while ((not FDataSet.EOF) and (not ESCWOUT)) do begin
         RX := BlankX.Position + 1;
         for TX := 0 to FDataSet.FieldCount - 1 do begin
           if FDataSet.Fields[TX].Visible then begin
             EWorkSheet.Cells[TY, RX] := FDataSet.Fields[TX].AsString;
             inc(RX);
           end;
         end;
         PBAR.StepIt; inc(TY);
         FDataSet.Next;
         Application.ProcessMessages;
       end;
       EApplication.DisplayAlerts := FALSE;        (* 良いのか?(^_^;) *)
       EWorkBook.SaveAs(edFName.Text);
       EApplication.WorkBooks.Close;
     finally
       EExcel.Quit;
     end;
   end;
 end;


2002年4月22日(月)


   ここんとこ、明日香V2の開発は「なぁ〜んにも」進展がない(^_^;)。サボっている
  わけじゃないのだが、一時的にモチベーションが下がっているのはまぎれもない事実で
  ある。なんでか?(^_^;)

   先週の日曜、親父を見舞うために弟が大分まで帰省した。その時、私の書斎でヤツに
  初めて、明日香V2を披露した。日本初の「明日香V2ユーザー」は弟だったわけだが
  その時私はひどいショックを受けてしまった。なぜならヤツは、まったくと言ってよい
  ほど、明日香V2を使えなかったからである。

   弟は一応、比較的「熱心な」パソコンユーザーだ。ただし、データベースはあんまり
  使ったことがない、「桐」については皆目知らない……という、ごく一般的なユーザー
  でもある。この「ごく一般的な」ユーザーが、明日香を触り始めてから10分間、全然
  見当違いのオペレーションばかりを繰り返して、ちっとも明日香の真髄に気付く様子が
  無かったのだ。たまりかねてヨコから口出ししたが、それでもデータベースならではの
  仕様に対して無邪気にモンクまでつけたりする。「表計算じゃないんだから(^_^;)」と
  言う私が、逆に「言い訳」しているような雰囲気になってしまったのは意外だった。

   開発途上なので、状態遷移の「ガード」を甘めに設定してあったことも裏目に出た。
  少しでも「桐」を知っていれば到底しないであろうオペレーションを、やみくもに実行
  する。ガイドメッセージを読んでくれない(^_^;)。仕様的に「不可避」である状況まで
  陥って、そこからの「どんでん返し」を当然のことのように要求する(^_^;)。どういう
  状況に陥っても決して立ち往生させないのは設計者の当然の責任だが、なんぼなんでも
  データ「入力中」に「選択の解除」は出来んわなぁ(^_^;)。

   これはもう、世の中に「評価版」を出すなら、徹底的に状態遷移の「ガード」を強く
  設定せねばなるまい。さらにその「状態遷移」が、今よりも一層「目立つ」工夫をする
  必要がありそうだ。 ActionList の機能をフルに使っているので、この「状態遷移」の
  ガードについてはかなり自信があっただけに、なんだか非常に残念だ(^_^;)。ショック
  から立ち直るためには、ちょっとした「充電期間」が必要かも知れぬ。

2002年4月24日(水)


   こないだ購入した「Delphi6プログラミングバイブル」を、1ページ目からひたすら
  読みふけっている。本文1,064ページのうち、775ページまでを読んだ。 読めば
  読むほど、Delphi6 の 底知れぬパワーに魅了されるばかりだ。世の中には「天才」と
  呼ばれる人間が、確かに存在する。Delphi とは、まぎれもなく その「天才」が作った
  地球上で最も美しい構築物のひとつだろうと私は思う。

   読むべし、読むべし、読むべし……。



[トップページに戻る]