カテゴリ:今日もまた老年プログラマー( 14 )
今年の5月6日は休日ではなかった・・・ ?
 以前に「ちょっと便利なカレンダー」とかの記事を投稿したが。
 我が家で妻が毎年作成している写真入のカレンダー、5月になって良く見ると何か変?
 5月6日が休日になっていない

 3日、4日は翌日が祝日なので、振替休日の「権利がない」との勝手な思い込みで、日本に2つとないカレンダーを作ってしまった。

 来年以後のために大急ぎで修正する。

   '---------- 憲法記念日 -------
   Holidays( 5 ) = DateSerial( yy, 5, 3 )

   '---------- みどりの日 -------
   Holidays( 6 ) = DateSerial( yy, 5, 4 )

   '---------- 子供の日 -------
   Holidays( 7 ) = DateSerial( yy, 5, 5 )

   If Weekday( Holidays( 7 ) ) = 1 then
     Holidays( CountHoliday ) = DateSerial( YY, 5, 6 )
     CountHoliday = CountHoliday + 1
   End If

 赤字の IF 分を以下のように、憲法記念日・みどりの日を加え、OR でつなぐ。

   If Weekday( Holidays( 5 ) ) = 1 or Weekday( Holidays( 6 ) ) = 1
     or Weekday( Holidays( 7 ) ) = 1 then

 確認のため、来年のカレンダーを作ってみると、来年は5月2日(土)から、6日(水)までの5連休となる。


 現役時代なら、恥かしいだけですまない大ポカだが、私同様に毎日が日曜の妻は気づいているのかいないのか?
[PR]
by t_ichib | 2014-05-06 18:39 | 今日もまた老年プログラマー
ちょっと便利な? カレンダー作成①
 年が明けてしまったので、「6日のあやめ」的な投稿だが…

 我が家では数年来、パソコンを使い手製のカレンダーを作り続けている。

f0066555_19165363.jpg その元々は妻が退職後に通った、エクセルの初級講座。
 そのときの教材となったのが、このカレンダー。

 この表の上に前年の旅行先でのスナップや、孫たちの写真を貼り付けて印刷したものを、机の上などに飾る。

 エクセルに手馴れた人なら、5分もかからず作れてしまう。 が、念のために簡単な手順を。

 1、罫線を引いた後、日~土までの曜日、およびその上に「1月」などと打ち込む。
 2.A4のセルに「1」を入力し、B4のセルには「=A4+1」と計算式を入力。
   それを、G4のセルまでドラッグする。
 3.A5のセルには「=A4+7]と計算式を入力し、G9のセルまでドラッグ。
   表は1~42までの数字で埋まるはず。
 4.実際のカレンダーと見比べながら、(今年の1月なら)A4とB4のセルを消去する。
   さらに、31より多い数字をすべて(F8~G9)消去する。
 5.後は、文字の大きさ・中央揃え、祝日の文字色など体裁を整え、完成。


 以後は、前年のカレンダーをコピーし、手直し(消去した計算式をコピーしなおしたり)し、翌年のカレンダーを作成している。
 まったくの手作業なので、昨年など日数の足りない月までできたしまった。

 …で、Calcのマクロを使えば、「こんなみっともないことも起こらないか」と。 (この間にエクセルからOpenOfficeに変わったので)

f0066555_20185456.jpg 1.D2のセルに、「1/1」と日付を入力する。
 ###と表示されるのは、セル内に「2013/1/1」と表示しきれないため。

 2.続いてA4のセルに「=D2-WEEKDAY(D2)+1」と計算式を入力する。
 41273から始まる数字が表示されるが、実はこれが日付。 続いてこれらの表示形式を整える。

f0066555_20444096.jpg
 3.D2のセルの日付の表示形式を、書式コード「M月」にする。
  エクセルなら、日付の書式をユーザ定義で「M”月”」に。
  これで2013/1/1が1月と表示される。

 4.続いてA4~G9間での範囲の日付の表示形式を、書式コード「D」に。

f0066555_21121245.jpg 以上の操作で、左のようにカレンダーらしき表に整えられる。

 A4、B4の日付は前年12月、F8以後は2月の日付。

 この後は、セルの内容を消去するなどの乱暴な方法ではなく、次のようにする。

f0066555_2121870.jpg


 5.A4~G9の範囲を選択し条件付書式を設定する。

 6.数式として、「MONTH(G9)<>MONTH($D$2)」と入力。
  エクセルの場合だと、右下のセルではなく左上のセルを指定する。
 「MONTH(A4)<>MONTH($D$2)」

 7.新しいスタイルを選び、フォントカラーとして白を指定する。


 以上で、最初と同じカレンダーが表示される。 2/1などと違う月を表示しても、日付と曜日はあっている。
 2016/1/1とすると、ちゃんとうるう年となっている。 大丈夫そう。


 後は祝日を丸で囲ったり、フォントを赤にするなどが残っているが、それにはマクロが必要になる。

 続きは下に
[PR]
by t_ichib | 2013-01-15 23:00 | 今日もまた老年プログラマー
ちょっと便利な? カレンダー作成②
 作成するマクロは、『カレンダー作成.ods 』という名で保存する。

 マクロを実行すると、目的のカレンダーは別の新規ドキュメントとして作成され、最終的には「カレンダー20xx.ods」という名前をつけて保存される。


f0066555_17154475.jpg 1.カレンダー作成ドキュメントは、
左図のように3つのシートを持つ。



f0066555_17193010.jpg 2.プログラムシートは、
左図のように年を入力するセルと、『カレンダー作成』ボタンを配置。

 ボタンが押されると、指定の年のカレンダーを作成する。
 またこの年が保存するドキュメント名に使われる。


 3.modelシートには、前に作成したカレンダーのひな型が登録されている。
 このシートを新規ドキュメントにコピーし、さらに必要枚数をコピーする。

 実際には、A4用紙に2か月分を並べて印刷するため、必要枚数は6枚。



f0066555_17431564.jpg 4.paternシートには
左図のように、カレンダーの祝日につける赤丸、祝日の名称を表示するテキストシェイプなどが貼り付けてある。

 各シェイプは、日付が隠されないよう表面を透明に設定、テキストシェイプは枠線も邪魔なので白にしてある。

 この赤丸を祝日などに貼り付ける。



 【1】modelシートを元に新規ドキュメントを作成する。

  '---- Dispatcherの取得 -------
  Disptch = createUnoService( "com.sun.star.frame.DispatchHelper" )

  '---- ひな型のドキュメントを取得 ----
  oldDoc = ThisComponent
  oldSheets = oldDoc.GetSheets()

  '---- カレンダーのひな型を新規ドキュメントにコピー ----
  oldSheet = oldSheets.GetByIndex( 1 )
  oldController.SetActiveSheet( oldSheet )

  '---- パラメータの設定 ----
  Dim array( 2 ) as new com.sun.star.beans.PropertyValue
  array( 0 ).Name = "DocName"
  array( 0 ).Value = ""
  array( 1 ).Name = "Copy"
  array( 1 ).Value = true

  Disptch.executeDispatch(oldController.Frame,".uno:Move", "",0,array())

  '---- 新規作成したドキュメントの対応付け ---- 
  newDoc = starDesktop.CurrentComponent
  newSheets = newDoc.GetSheets()
  newController = newDoc.GetCurrentController()


f0066555_20504715.jpg 以上の手順で、
左図のように新規ドキュメント『無題1』が作成される。
 ドキュメントに含まれるシートは、『プログラム作成』ドキュメントからコピーされた『model』シート1枚のみ。

 GetByIndex(1)の1は複数のシートの中の2枚目のシートのこと。 エクセルならシート番号は1から始まるので、2を指定する。
 同様に、エクセルではA1のセルは(1,1)だが、カルクでは(0,0)で始まる。 


 【2】.続いて、『無題ドキュメント』側で必要枚数分のカレンダーを作成する。

  '---- コピーしたシートの名前を変更 ----
  newSheet = newSheets.GetByIndex( 0 )
  newSheet.Name = "1月"

  '---- さらに必要枚数だけコピー ----
  newSheets.CopyByName( "1月", "3月", 32767)
  …

 32767はシートの最後にコピーする意味で、0ならシートの先頭になる。

 【3】さらに、各月のカレンダーに月初めの日付を設定する。

  '---- 作成するカレンダーの年度を取得 ----
  oldSheet = oldSheets.GetByIndex( 0 )
  YY = oldSheet.GetCellByPosition( 2, 7 ).Value

 ここでは、『カレンダー作成』ドキュメントの『program』シートのC8のセルから日付を読取る。

  '--- 各月の月初めの日付のセット ----
  Dim I as Integer
  For I = 0 to 5
   newSheet = newSheets.GetByIndex( I )
   newSheet.GetCellByPosition(3,1).Value = DateSerial(YY,I*2+1,1)
   newSheet.GetCellByPosition(11,1).Value = DateSerial(YY,I*2+2,1)
  …

 各シートには2か月分のカレンダーがあるので、D2とL2のセルに月初めの日付を入れている。

 以上で、まだ祝日などの赤丸がついていないが、12か月分の原型が完成。


 【蛇足1】Calc Basic で別のドキュメントにシートをコピーする

 インターネットを検索すると、私と同様にそのことで苦心されている人を見かける。(エクセルのVBAなら、なんと言うこともなくできるのに…)

 上記のコーディング例は、シート1枚を新規ドキュメントを作成すると同時にコピーしている。
 既存のドキュメントにコピーするのであれば

  '---- パラメータの設定 ----
  Dim array( 3 ) as new com.sun.star.beans.PropertyValue
  array( 0 ).Name = "DocName"
  array( 0 ).Value = "無題1"
  array( 1 ).Name = "Copy"
  array( 1 ).Value = true
  array( 2 ).Name = "Index"
  array( 2 ).Value = 32767

  Disptch.executeDispatch(oldController.Frame,".uno:Move", "",0,array())

 とすることで、実現できる。


 【蛇足2】同様のことをエクセルのVBAでなら

 ずっと簡単にマクロが作成できてしまう。
 ↓

More
[PR]
by t_ichib | 2013-01-15 22:00 | 今日もまた老年プログラマー
ちょっと便利な? カレンダー作成③
 【4】1年間の祝日を洗い出す

 1年間の祝日には春分・秋分の日などや、第2・第3月曜に決められた成人の日など、振替休日など日付が変わるものがある。
 といっても面倒なだけで、難しいところはない。

 実際のコーディングは【蛇足】を参照。


 【5】祝日のフォント・赤丸・祝日名などを、カレンダーに貼り付ける。

 祝日・記念日のセルの位置は、GetTrgCellを使って取得している。

 テキストShapeや丸印などは、PaternシートのDrawPageにあり、登録順の番号で取得できる。
 このときの番号は、シート番号などと同様に0から始まる。(Excelでは1から)

 さらに、ExcelではShapeをシートに貼り付けたが、Calcではセルを指定して張り付ける。

f0066555_1203723.jpg
 シェイプは左図のように、セルの左上に貼り付けられてしまう。
 これではみっともないので、位置の修正をする。

 その微調整でも、Excelはたぶんピクセル単位だが、Calcでは1/100ミリ単位とかで違っている。
 VBAからCalcに移植しようとして四苦八苦しているさまを目にするが、私はその逆。 戸惑うことも多いが、「こんなに簡単!」と思うことの方が多い。


f0066555_1320161.jpg 以上の手順で、左図のようなカレンダーが作成される。
 (5/9の星印は孫の誕生日)


 【6】仕上げ

 完成したカレンダーを、『カレンダー20xx.ods』という名前で保存する。
 マクロが入った『カレンダー作成.ods』は閉じる。


 【蛇足】Calcのコーディング

 本文ではコーディングを省いたので、興味があれば是非に。
 ↓

More
[PR]
by t_ichib | 2013-01-15 19:55 | 今日もまた老年プログラマー
オープンオフィスを使ってみて??
 昨年末、我が家のデスクトップパソコンが新しくなった。 最近、私はノートパソコンを主体に使っており、デスクトップはほとんど妻が使っていた。


 5年ほど昔のWindows-Xpで、当初は早さも快適と思っていたのに、最近では動きがすっかり重くなってしまっていた。

 インターネットから知らず知らずにインストールしてしまったソフトのせいだろうか? 私は一番の原因は、セキュリティソフトをアップグレードしたことだと思っているが。
 とどまることを知らないウィルスの進化に対抗し、セキュリティソフトも肥大化したのだと。


 妻がしょっちゅう「遅い、遅い」とぼやいていたのを、毎月のように実家に帰ってきて、聞いていた娘がボーナスで買ってくれた。
 こちらも娘の負担を少しでも減らそうと、「エクセル・ワードは付けなくていいよ、オープンオフィスをダウンロードするから」と。
 エクセル・ワードを付けなければ、価格を2~3万節約できる。



 それから約1ヶ月、OSがWindows7に変わったこともあり、当初「あれっ?、あれっ?」を連発していた妻もようやく慣れてきたようだ。

 妻が主体と言っても、私も時々利用する。
 画面・キーボードが大きく使いやすい、写真アルバムや家族の共通な記録は分散せず1台にまとめて記録したい… と理由はいくつもある。
 そしてプリンターはデスクトップにしか付いていない。


     #################### 

 ダウンロードした「Open-Office」の使い心地

 よく似た画面でよく似たことができるので、ほとんど不満はない。 サクサクと仕事でエクセルを使いこなしている人は、「もう嫌!」と思うかもしれないが。



 私にとっては、「ここだけは何とかして欲しい」と思う点が2つだけある。

 ①列ごとの日本語のオン・オフの設定ができない。 (入力規則

     例えば表計算では、日本語の品名に続けて単価・数量を打つことも多い。
    エクセルでは押さなくても良かった「漢字」キーを、CALCでは毎回
    押さなくてはならない。

 ②同じ列に同じ日本語項目を打つときに便利なオートコンプリート機能が使えない。

     同じ列に「水道料金」と入力してあれば、「す」と打っただけで「水道料金」
    と表示してくれる。
     手抜きの効果だけでなく、「水道代」、「水道使用料」などと違った名前を
    使ってしまい、ピボットテーブルなどで、別集計されてしまうこともない。


 無いものねだりをしているのかもしれない? 私の知らない便利な機能があるのかもしれない?
 知っている方があれば、ぜひ教えてください。
[PR]
by t_ichib | 2011-01-19 11:19 | 今日もまた老年プログラマー
Outlook Express のファイル構造
 Becky のファイル構造のことを書いたついでに、私が利用できるもう一つのメール環境・Outlook Express のファイル構造についても書いてみたい。


 Outlook Expressには、Folders.dbxと受信トレイ.dbxなどの2種類のファイルがある。

 同じdbxファイルだが、Folders.dbxは他のdbxファイルと異なり、Outlook Expressのフォルダー一覧を表示するのに用いられる。

 Folders.dbxには
  ① フォルダー名と、各フォルダーの階層関係
  ② フォルダーに対応するdbxファイル名の指定
      受信トレイ⇒受信トレイ.dbxなどフォルダー名と同じ。
      Outlook Express・ローカルフォルダーにはdbxファイルはない。
  ③ 各フォルダー毎のメールの総件数・未読件数
 などが保存されている。


 受信トレイ.dbx・送信済みアイテム.dbxなどのファイルには、送受信したメールが保存される。

 各dbxファイルは【ディレクトリ情報】、【ファイル情報】、【メッセージ情報】の3つの情報で、メールを管理する。
 Outlook Expressのメッセージ一覧は【ディレクトリ情報】と【ファイル情報】の2つを組み合わせて表示される。
 【ディレクトリ情報】はファイル情報へのポインタ(=ヒモ付け)だけを持つ。 1対複数。
 メールの件名・差出人・送信日時などの情報は【ファイル情報】が持ち、【メッセージ情報】への1対1のポインタを持つ。


f0066555_831838.jpg それぞれの関係は、左図のようになる。

 ルートディレクトリからは、最大51件のファイル情報がヒモ付けされる。
 件数が51件を超えた時は、子ディレクトリが作成され、ルートディレクトリからヒモ付けされる。
 ルートディレクトリから子ディレクトリのヒモ付けも最大51件。
 51×51を超えると、さらに孫ディレクトリが…。

 ルートディレクトリへのポインタは、アドレス 0x00E4番地に保存されている。

 【メッセージ情報】は1つのメールのサイズが大きい時、複数に分割されヒモ付けされる。


  【ディレクトリ】
f0066555_841557.jpg
 ※1 親から子、子から孫へのポインタ
 ※2 子および孫からはすぐ上のディレクトリへのポインタ
 ※3 ボディ(1)、ボディ(2)…の組の数(最大51個)
 ※4 子の格納データ数 (子の※3と同じ数)

 ディレクトリはルート・子・孫とも、同形式・同サイズ
(ヘッド 24バイト+ボディ 612バイト(=12バイト×51件) =636バイト)


 前にも書いたように【ディレクトリ情報】にはポインタしか持っていない。 次の【ファイル情報】が持っている「件名」などとセットで、メッセージ一覧を構成する。

  【ファイル情報】
f0066555_865256.jpg
 ファイル情報のサイズは可変長
 =ヘッド(固定)12バイト+ボディ(※1のバイト数)
 ボディ=インデックス部(4バイト×件数 ※2) + 補足情報

 ずいぶん分かりにくいが、各インデックスあるいは各インデックス+捕捉情報の組み合わせで、件名・差出人・送信日時などの情報を保存する。


 インデックス4バイトは 1ビット7ビット+3バイトと分かれている。

    先頭の1ビット
 メールの優先順位などの短い情報は、’1’にして直接インデックスに持たせる。 
 件名など3バイトに収まらない情報は、、’0’にして補足情報に書き込む。
 そしてインデックスには、その補足情報へのポインタを持たせる。

    次の7ビットの意味
f0066555_888100.jpg
    最後の3バイト

 必要な情報が3バイト以内なら、ここに直接値が書き込まれる。
 3バイトを超える情報は補足情報に書き込まれ、そのポインタを保存。
    ともに、最初の1ビットとの組み合わせ。


例1) 91(=1+0x11) 24 08 00 ⇒メッセージ長が2084バイト(=0x000824)
例2) 08(=0+0x08) 53 00 00 で、かつ補足情報の 0x53バイト目に8E 6C 8D
     91 97 B7 8D 73 (=シフトジスコードで四国旅行)の文字列があれば、
     ⇒ 件名が「四国旅行」

 補足情報の各項目の区切りは、文字項目の後ろに0x00が、数字項目の後には0x01がセパレータとして用いられる。

 送信日時などは、Beckyとは異なり64ビットの(C#DateTime型)の日付。 文字列ではなく、バイナリ値。

 インデックスの中で最も重要なのは0x04で、続くメッセージブロックへのポインタとなっている。


    【メッセージ情報】
f0066555_884063.jpg
 メッセージブロックは固定長
  ヘッダ16バイト+ボディ512バイト=528バイト

 長いメッセージたとえば2000バイトの情報を保存する場合は、512×3+464に分割される。
 最初の3つのブロックの※2=512、※3には続きのブロックへのポインタ、最後のブロックの※2=464、※3=0となる。
 いずれのブロックにも※1=512の固定値、最後のブロックの※4の465バイト以降には0が詰められる。


    オブジェクトマーク

 【ディレクトリ情報】、【ファイル情報】、【メッセージ】の各先頭にあるオブジェクトマークは、そこから情報が始まることを示すもの。
 ファイルの先頭からのアドレスそのものが書かれる。
[PR]
by t_ichib | 2009-05-03 08:36 | 今日もまた老年プログラマー
Beckyのインデックス
 エキサイトのアクセス解析を見ていると、私のブログを見てくださる方が、どんな検索キーワードで訪れてきていただいているのか分かる。
 ごく最近書いた「ハンカチの木」など…

 その中で、もう3年以上も前に書いたBecky関連の記事を、毎月平均して数件もご覧頂いているのが分かる。
 せっかく訪問いただいて、失望されていないといいのだけど。


 3年前にはあいまいだったことで、最近理解できたことを少し書いてみる。 訪問いただいている方の、ご期待に沿うものであればいいのだか。


f0066555_11495290.jpg Beckyのメールを保存しているフォルダーは、左図のようになっている。
 Beckyの画面左側のツリービューの受信箱= !!!!InBox など。

 !!!Sent などのフォルダーには、Folder.idx Folder.ini xxx.bmf など3種類のファイルが保存されている。

 3eb70643.bmf などの bmf ファイルには、メッセージビューに表示されるメール(本文+添付フィル+ヘッダ)が保存される。

 Folder.idx には、リストビューに表示される「件名」・「差出人」などの情報が保存されると同時に、bmf ファイルへのひも付けがされている。


 Folder.idx の内容は改行で区切られた可変長のレコード。 (最初の1件目はファイルId?、実際のデータは2件目以降)

 その中は例えば、1fb4.5.3eb70644.お元気?.差出人.宛先.<・・・>..3eb11b7a.3eb11b54.3eb19ca8.787.000001.0.3.0.iso-2022-jp. のようになっている。
 「.」は各項目を区切るセパレータ。(1バイト、値は1)

f0066555_11514656.jpg 各項目の意味は前から順に、右の表のようになっている。

 ?が付いているのは、私には分からなかった項目。 もしかするとどこかに公開されているかもしれないが。

 タイプ欄の数字項目は、数字を16進数の文字列にしたもの。
 1fb4=8116、787=1927 などとなる。
 数字をバイナリ値としないのは、セパレータ「.」と区別が付かなくなるから。 ?

 差出人・宛先は名前+メールアドレスが保存される。

 送信日時などは、1970年1月1日0時0分0秒を0としたUnix形式の日付。

 C#などのDateTime型にするには10,000,000倍して、1970/1/1に加える必要がある。 (C#の日付は64ビット、Unixは32ビット。 32ビットなので、2038年には大騒ぎした2000年問題の再燃が起きるか?)
 3eb11b7a=2003/5/1 13:4:58 となる。

 優先度の3は通常、数字が小さいほど優先度が高い。
 エンコード方式の iso-2022-jp はシフトJISのこと。


f0066555_11525947.jpg 格納ファイル・アドレスについては容易に分かると思うが、左図のようになる。

 3eb70643、3eb70644 などいくつかあるbmfファイルのアドレス以降にメールが保存されている。

 ファイルサイズは短いメールでもヘッダが付加され、さらに添付ファイルがあるとかなり大きなものとなる。

 VB6.0が画面表示にJISコード、ファイルへの入出力にシフトJISを用いていたのに対し、Visual C#では画面表示にUnicode、ファイル入出力にはUtf8を用いている。

 BeckyのファイルもシフトJISで書かれているので、シフトJIS⇒Unicodeへの変換が必要となる。
 ただし、ファイルストリームのエンコード方式にシフトJISを指定すれば、自動的に変換してくれる。

 さらには、BASE64のエンコード・デコードもそれぞれメソッドが用意されている。 以前VB6.0では苦心して自分でデコードしたのに…。 もしかしてVB6.0にもツールが用意されていた?

 【追記】
 書き漏らしてしまったこと。 (そう重要ではないが)

 Folder.ini には、受信箱などのメールのトータル件数・未読件数、リストビューに表示する際のソート順、最後に保存したメールの「連番?」などを保存している。
[PR]
by t_ichib | 2009-05-02 12:04 | 今日もまた老年プログラマー
ボケ防止?
 私はよく図書館を利用する。 そのことで近頃、よくくあること。
 面白そうなタイトルに引かれ借りてきた本を2~30ページも読んで、ようやく以前に読んだ本であることに気づく。
 子供の頃読んだ本などはしっかりあらすじを覚えているし、子供たちに毎夜読み聞かせた絵本など、語呂がいいので登場人物のセリフまで口をついて出てくる。

 それなのに、2~30ページも読み進まないと気が付かないなんて…
 例えば推理小説。 枝葉末節のスジはともかく、情けないことにメインの「誰が犯人なのか?」が最後まで思い出せない。
 最初に読んだ時と同じように楽しめ、それはそれでいいのかもしれないが。

 やっぱり年のせい そして〇〇の兆候?

 妻は退職後、〇〇防止のため子供たちが残していったピアノの練習を始めた。 始めはたどたどしかったが、近頃では少しサマになってきた。
 指先を使うことが防止につながるとか…


 最近、私がやり始めたこと。 Visual C#と言うプログラム。 Microsoftのホームページから無償でダウンロードできる。
 Basicなみのやさしい言語ながら、いろいろなことができ楽しんでいる。
 そこそこに頭を使うし、指先を使うし… きっとボケ防止にもつながるはず。


 会社勤務の時と違い、仕事でパソコンを使うことも、ましてプログラムを組むこともない。 それでも、参考書を片手にいろいろ動かしてみると、なかなか面白い。

 覚えることより、忘れることのほうが得意になってきたが、いろいろやっているうちに新しい発見もあり、時間を忘れて楽しめる。


 先日、「毎日、何してるの?」と聞かれたが、子守・旅行にコレも付け加えておこうかな。
[PR]
by t_ichib | 2009-04-12 15:33 | 今日もまた老年プログラマー
まだまだ完成とはいえないが
 機能4、メールの削除

f0066555_1533139.jpg 編集メニューの削除あるいはツールバーの×をクリックすると、メールを削除することができます。
 これは、メール1通単位の削除で、メールの一部(返信の場合のOriginal…以下の削除など)は、切り取りの機能として追加の予定。 また、この削除は元のメールを削除しません。 テキストファイルへの出力を除外するだけです。

 機能5、出力データの選択

f0066555_15425928.jpg データ→出力データの選択をクリックすると、「出力データの選択」ウィンドウが開きます。

f0066555_15543164.jpg ウィンドウには現在の出力対象件数と、今までに出力を除外した件数が表示されています。 除外された件数には、この機能で除外したものと、機能4で削除した件数を含みます。
f0066555_1641670.jpg このウィンドウには「項目の指定」というメニューが一つだけあり、日付の範囲の指定、差出人アドレスの指定、あて先アドレスの指定と3種類の指定ができます。


 機能5-1、日付範囲での指定

f0066555_1684717.jpg 日付範囲の指定は">="と"<="のいづれか、あるいは両方のチェックをオンにします。 日付にはメールの最も古い日付と、もっとも新しい日付が初期値として入っているので、それを変更します。 1年単位、半年単位に分けてメールを保存したい場合には、便利な機能だと思います。

 機能5-2、差出人およびあて先アドレスでの指定

f0066555_16191399.jpg 「差出人アドレスの指定」あるいは「あて先アドレスの指定」をクリックすると、左のようにメールアドレスとその件数を表示したチェックボックスが表示されます。
 当初はすべて出力対象ですので、チェックが全部オンになっています。

f0066555_16243563.jpg メールアドレスの件数が多く、画面に収まりきらないときは右下に、「続き⇒」のボタンが表示されます。 チェックを外したいアドレスがその画面にない時は、このボタンをクリックします。
 なお、アドレスはアルファベット順にソートされています。 この機能は、メルマガなどから送られてきたメールを保存したくない時に、そのアドレスのチェックを外せばよく便利だと思います。
 機能5-1、機能5-2とも、上のほうの「選択開始」のボタンを押すと、日付範囲外あるいはチェックを外したメールアドレスを出力から除外し、件数を更新します。
 この機能は、一度出力を除外したメールを出力対象に戻す事ができません。 ただし、元のメールを削除していませんので、一度プログラムを終了させてやり直してください。

 機能6、名前をつけて保存

f0066555_14345415.jpg 蛇足ですが、メニューのファイル→名前をつけて保存をクリックすると、コモンダイアログが開き、保存するテキストファイルを指定できます。 ファイルを保存せずに終了あるいは右上隅の終了ボタンf0066555_14353122.jpgを押した時は、確認のため右のようなメッセージを出しています。
 一度保存した後、ファイルが変更になったときも確認のメッセージを出します。
[PR]
by t_ichib | 2006-03-15 16:46 | 今日もまた老年プログラマー
プログラムの行方は
 取りあえずの状況

f0066555_903598.jpg もう半月以上前に、ある程度まで進んでいるんだが、その後がなかなか進まない。
 一応、出力できたテキストファイルをメモ帳で見ると、左のようになる。 これで当初の目的のものはできたのだが、「こんな機能があればよいな」とか、色々欲が出て時間ができた時に、手を加え続けていて、最終版にはなかなかいたらない。 まあ、バージョンはマイナス1.0と言ったところか。

 メールファイルのオープンは

f0066555_917770.jpg 「ファイルを開く」をクリックすると、おなじみの右のような画面が出てくる。 ファイルの指定は、OEなら(OEの画面左のフォルダーの)受信トレイあるいは送信済みアイテムを右クリックし、プロパティを表示させると、ファイルの位置が分かるようになっている。(実に長い)
 このプログラムで、開くことができるファイルは、OutLook(*.dbx)、Becky(*.idx)、テキストファイル(*.txt)の3種類。 私が使える環境と言う制約上、やむをえない。
 テキストファイルを読めるようにしたのは、一度出力したメールを再度取り込み、新規のメールを追加したりできるようにするため。

 読み込み後の画面

f0066555_15404113.jpg 画面に表示されるのは、テキストファイルに出力した項目と同じです。 最初にインデックスを読み込み、そのインデックスのアドレスのメール本文を読み込んでいます。
 キーワードにあたる部分は、差出人、あて先、メールのタイトル、日付だけを出力しています。 ただし、他のキーワードも内部的には利用しています。(例えば、エンコードがUTFなのかJISなのか)
 単純なテキスト形式のメールであればいいんですが、添付ファイルがついていたり、HTMLメールの時は、Next-Partとかboundaryとかのキーワードで、メール本文の範囲を区別しています。 今困っているのは、返信などの時くっついてくるOriginal Message以下を何とか機械的にカットする方法はないかということです。 Original…が本文の後ろだけならいいけど、本文の前にあるときがあるので、Original…以下を削除すると、メール全体がなくなってしまいます。 いい方法があったら、教えてください。

 機能1、基本的な機能

f0066555_16475112.jpg 基本的な機能として、ツールボックスの→、←をクリックする事で、次のメールあるいは1件前のメールを見ることができます。 ついでに、先頭のメールを見たり、最後のメールを見ることができるようにしてあり、「おおよそ、1/3位の位置にあったな」と言う時のため、Jump(何件目かを指示)の機能もつけました。

 機能2、並び替え

 単純なf0066555_16201142.jpgテキスト変換だけでなく、いくつかの機能を付けて有りますが、どうしても実現したかったのが、この並び替えです。 受信メール、送信メールの両方を読み込み、日付でSORTすれば、メールのやり取りを順に追うことができます。
 差出人、あて先別の並び替えはついでにと言う程度ですが、あて先は複数指定されている場合があるので、Receivede… for以下あるいは、X-Hot… To以下のあて先を内部的に記憶しています。

 機能3、検索

f0066555_1713329.jpg 右の図では、いくつかの項目を入力してありますが、「○○さんから頂いたメール?」とか、「△△会の催しに関するメール?」とか単純な検索でいいはずです。(複数の検索項目を指示した時は、AND条件で検索します。)
 検索で見つかったメールが1件だけでない時の為、シフト+F3で次を検索できるようにしています。(シフト+F2なら1件前)
 この機能を付け加えたので、一度出力したテキストファイルを再読み込みできるようにしたのです。 単純なテキストファイルに検索の機能を加えられたのですから。(SORTなども)
[PR]
by t_ichib | 2006-02-22 20:54 | 今日もまた老年プログラマー