[Notes/Domino] 設計解析講座: ノートクラスと $Flags
前回はノートを取得する処理を解説しました。今回は、取得したノートがどの設計要素かどうかを判別する方法を解説します。
ノートクラス
ノートは、まずノートクラスによって区別されています。ノートクラスは2バイトので管理されており、立っているビットによって、どのクラスかを判別できます。ノートクラスはアイテムではなく、ノートヘッダの一部です。
たとえば、NOTE_CLASS_DOCUMENT(&H0001)は文書、NOTE_CLASS_ICON(&H0010)はアイコンのことです。
ただし、必ずしも設計要素名と1対1ではなく、フォーム、ビュー、フィルタクラスの場合は、対応する設計要素が複数あります。たとえばフォームの場合、フォームのほかに、サブフォーム、フレームセット、ページ、イメージなどなど、多くの設計要素がフォームクラスに属しています。
ノートクラスの値は、ツールキットの stdnames.h の「NOTE_CLASS_~」で始まる定数で定義されています(後述のコードに LotusScript 化したものを掲載しています)。「NOTE_CLASS_FILTER」は何のことかよくわからないかもしれませんが、これは昔の名残りらしいです。フィルタはエージェントのことだと思ってください。
$Flags
フォーム、ビュー、フィルタクラスのノートを、さらに調べるには、$Flags アイテムを見ます($FlagsExt を調べないといけない場合もあります)。$Flags は単純なテキストアイテムですから、読むのも書き込むのも簡単です。
$Flags は半角英数記号の文字で表現されます(大文字小文字を区別します)。たとえば上図のように「fL3」という値の場合、「f」はエージェントであることを、「L」はコードが LotusScript であることを、「3」はR3クライアントのメニューに表示しないことを意味します。
$Flags には、設計要素を区別するためのフラグのほかに、プロパティの一部が含まれます。プロパティの場合は書き換えるのも簡単です。
たとえば、「更新時に再設計/設計の置換を禁止する」が無効の場合、有効にする、というコードは、以下のように書けます。(※アイコンやポリシー文書などの場合は違うコード(「R」無い場合が有効)になりますので注意してください。)
If InStr(1, doc.~$Flags(0), "P", 0) = 0 Then doc.~$Flags = doc.~$Flags(0) & "P" End If
(設計用の)$Flags の値は、ツールキットの stdnames.h の「DESIGN_FLAG_~」で始まる定数で定義されています(後述のコードに LotusScript 化したものを掲載しています)。途中から記号を使い出しているのが面白いトコロ。きっと途中で英数だけじゃ足りなくなっちゃったんでしょうね(^^;
設計要素を判断するコード
設計要素とノートクラス、$Flagsの対応表を書こうかと思いましたが、面倒くさくなってきたので(^^;;、判別コードだけ載せておきます。これを見ていただければ、どうやって判断するかは、おわかりになると思います。
※ 汎用性を持たせるために、ノートハンドルを渡す形式にしました。NotesDocument を渡すようにすれば、関数内のコードはもう少し簡単になります。
Public Const NOTEINFO_NOTE_DB = 0 Public Const NOTEINFO_NOTE_ID = 1 Public Const NOTEINFO_NOTE_OID = 2 Public Const NOTEINFO_NOTE_CLASS = 3 Public Const NOTEINFO_NOTE_MODIFIED = 4 Public Const NOTEINFO_NOTE_PRIVILEGES = 5 Public Const NOTEINFO_NOTE_FLAGS = 7 Public Const NOTEINFO_NOTE_ACCESSED = 8 Public Const NOTEINFO_NOTE_PARENT_NOTEID = 10 Public Const NOTEINFO_NOTE_RESPONSE_COUNT = 11 Public Const NOTEINFO_NOTE_RESPONSES = 12 Public Const NOTEINFO_NOTE_ADDED_TO_FILE = 13 Public Const NOTEINFO_NOTE_OBJSTORE_DB = 14 Public Const NOTE_CLASS_DOCUMENT = &H0001 Public Const NOTE_CLASS_DATA = NOTE_CLASS_DOCUMENT Public Const NOTE_CLASS_INFO = &H0002 Public Const NOTE_CLASS_FORM = &H0004 Public Const NOTE_CLASS_VIEW = &H0008 Public Const NOTE_CLASS_ICON = &H0010 Public Const NOTE_CLASS_DESIGN = &H0020 Public Const NOTE_CLASS_ACL = &H0040 Public Const NOTE_CLASS_HELP_INDEX = &H0080 Public Const NOTE_CLASS_HELP = &H0100 Public Const NOTE_CLASS_FILTER = &H0200 Public Const NOTE_CLASS_FIELD = &H0400 Public Const NOTE_CLASS_REPLFORMULA = &H0800 Public Const NOTE_CLASS_PRIVATE = &H1000 Public Const NOTE_CLASS_DEFAULT = &H8000 Public Const NOTE_CLASS_NOTIFYDELETION = NOTE_CLASS_DEFAULT Public Const NOTE_CLASS_ALL = &H7fff Public Const NOTE_CLASS_ALLNONDATA = &H7ffe Public Const NOTE_CLASS_NONE = &H0000 Public Const DESIGN_FLAG_ADD = "A" Public Const DESIGN_FLAG_ANTIFOLDER = "a" Public Const DESIGN_FLAG_BACKGROUND_FILTER = "B" Public Const DESIGN_FLAG_INITBYDESIGNONLY = "b" Public Const DESIGN_FLAG_NO_COMPOSE = "C" Public Const DESIGN_FLAG_CALENDAR_VIEW = "c" Public Const DESIGN_FLAG_NO_QUERY = "D" Public Const DESIGN_FLAG_DEFAULT_DESIGN = "d" Public Const DESIGN_FLAG_MAIL_FILTER = "E" Public Const DESIGN_FLAG_PUBLICANTIFOLDER = "e" Public Const DESIGN_FLAG_FOLDER_VIEW = "F" Public Const DESIGN_FLAG_V4AGENT = "f" Public Const DESIGN_FLAG_VIEWMAP = "G" Public Const DESIGN_FLAG_FILE = "g" Public Const DESIGN_FLAG_OTHER_DLG = "H" Public Const DESIGN_FLAG_JAVASCRIPT_LIBRARY = "h" Public Const DESIGN_FLAG_V4PASTE_AGENT = "I" Public Const DESIGN_FLAG_IMAGE_RESOURCE = "i" Public Const DESIGN_FLAG_JAVA_AGENT = "J" Public Const DESIGN_FLAG_JAVA_AGENT_WITH_SOURCE = "j" Public Const DESIGN_FLAG_MOBILE_DIGEST = "K" Public Const DESIGN_FLAG_XSPPAGE = "K" Public Const DESIGN_FLAG_CONNECTION_RESOURCE = "k" Public Const DESIGN_FLAG_LOTUSSCRIPT_AGENT = "L" Public Const DESIGN_FLAG_DELETED_DOCS = "l" Public Const DESIGN_FLAG_QUERY_MACRO_FILTER = "M" Public Const DESIGN_FLAG_SITEMAP = "m" Public Const DESIGN_FLAG_NEW = "N" Public Const DESIGN_FLAG_HIDE_FROM_NOTES = "n" Public Const DESIGN_FLAG_QUERY_V4_OBJECT = "O" Public Const DESIGN_FLAG_PRIVATE_STOREDESK = "o" Public Const DESIGN_FLAG_PRESERVE = "P" Public Const DESIGN_FLAG_PRIVATE_1STUSE = "p" Public Const DESIGN_FLAG_QUERY_FILTER = "Q" Public Const DESIGN_FLAG_AGENT_SHOWINSEARCH = "q" Public Const DESIGN_FLAG_REPLACE_SPECIAL = "R" Public Const DESIGN_FLAG_PROPAGATE_NOCHANGE = "r" Public Const DESIGN_FLAG_V4BACKGROUND_MACRO = "S" Public Const DESIGN_FLAG_SCRIPTLIB = "s" Public Const DESIGN_FLAG_VIEW_CATEGORIZED = "T" Public Const DESIGN_FLAG_DATABASESCRIPT = "t" Public Const DESIGN_FLAG_SUBFORM = "U" Public Const DESIGN_FLAG_AGENT_RUNASWEBUSER = "u" Public Const DESIGN_FLAG_AGENT_RUNASINVOKER = "u" Public Const DESIGN_FLAG_PRIVATE_IN_DB = "V" Public Const DESIGN_FLAG_IMAGE_WELL = "v" Public Const DESIGN_FLAG_WEBPAGE = "W" Public Const DESIGN_FLAG_HIDE_FROM_WEB = "w" Public Const DESIGN_FLAG_V4AGENT_DATA = "X" Public Const DESIGN_FLAG_SUBFORM_NORENDER = "x" Public Const DESIGN_FLAG_NO_MENU = "Y" Public Const DESIGN_FLAG_SACTIONS = "y" Public Const DESIGN_FLAG_MULTILINGUAL_PRESERVE_HIDDEN = "Z" Public Const DESIGN_FLAG_SERVLET = "z" Public Const DESIGN_FLAG_ACCESSVIEW = "z" Public Const DESIGN_FLAG_FRAMESET = "#" Public Const DESIGN_FLAG_MULTILINGUAL_ELEMENT = "!" Public Const DESIGN_FLAG_JAVA_RESOURCE = "@" Public Const DESIGN_FLAG_STYLESHEET_RESOURCE = "=" Public Const DESIGN_FLAG_WEBSERVICE = "{" Public Const DESIGN_FLAG_SHARED_COL = "^" Public Const DESIGN_FLAG_HIDE_FROM_MOBILE = "1" Public Const DESIGN_FLAG_HIDE_FROM_PORTAL = "2" Public Const DESIGN_FLAG_PROPFILE = "2" Public Const DESIGN_FLAG_HIDE_FROM_V3 = "3" Public Const DESIGN_FLAG_HIDE_FROM_V4 = "4" Public Const DESIGN_FLAG_HIDE_FROM_V5 = "5" Public Const DESIGN_FLAG_HIDE_FROM_V6 = "6" Public Const DESIGN_FLAG_HIDE_FROM_V7 = "7" Public Const DESIGN_FLAG_HIDE_FROM_V8 = "8" Public Const DESIGN_FLAG_HIDE_FROM_V9 = "9" Public Const DESIGN_FLAG_MUTILINGUAL_HIDE = "0" Public Const DESIGN_FLAG_WEBHYBRIDDB = "%" Public Const DESIGN_FLAG_READONLY = "&" Public Const DESIGN_FLAG_NEEDSREFRESH = "$" Public Const DESIGN_FLAG_HTMLFILE = ">" Public Const DESIGN_FLAG_JSP = "<" Public Const DESIGN_FLAG_DIRECTORY = "/" Public Const DESIGN_FLAG_PRINTFORM = "?" Public Const DESIGN_FLAG_HIDEFROMDESIGNLIST = "~" Public Const DESIGN_FLAG_HIDEONLYFROMDESIGNLIST = "}" Public Const DESIGN_FLAG_COMPOSITE_APP = "|" Public Const DESIGN_FLAG_COMPOSITE_DEF = ":" Public Const DESIGN_FLAG_XSP_CC = ";" Public Const DESIGN_FLAG_JS_SERVER = "." Public Const DESIGN_FLAG_STYLEKIT = "`" Public Const DESIGN_FLAG_WIDGET = "_" Public Const DESIGN_FLAGS_SUBCLASS = "UW#yi@GFXstmzk=K;g%[]{^" Public Const DESIGN_FLAGS_DISTINGUISH = "nw123456789" Const NOTESDLL = "nnotes.dll" Declare Sub NSFNoteGetInfo Lib NOTESDLL (ByVal hNote As Long, _ ByVal wNoteMember As Integer, pValue As Any) Declare Function NSFItemGetText Lib NOTESDLL (ByVal hNote As Long, _ ByVal ItemName As String, ByVal retItemText As String, TextLen As Long) As Integer Public Function APIGetDesignType(hNote As Long) As String Dim strFlg As String Dim strExt As String Dim strType As String Dim lngCls As Long Call NSFNoteGetInfo(hNote, NOTEINFO_NOTE_CLASS, lngCls) strFlg = Space(128) Call NSFItemGetText(hNote, "$Flags", strFlg, 127) strFlg = StrLeft(strFlg & Chr(0), Chr(0)) If (lngCls And NOTE_CLASS_FORM) = NOTE_CLASS_FORM Then If InStr(1, strFlg, DESIGN_FLAG_SUBFORM, 0) <> 0 Then strType = "サブフォーム" ElseIf InStr(1, strFlg, DESIGN_FLAG_FRAMESET, 0) <> 0 Then strType = "フレームセット" ElseIf InStr(1, strFlg, DESIGN_FLAG_WEBPAGE, 0) <> 0 Then strType = "ページ" ElseIf InStr(1, strFlg, DESIGN_FLAG_IMAGE_RESOURCE, 0) <> 0 Then strType = "イメージ" ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVA_RESOURCE, 0) <> 0 Then strType = "アプレット" ElseIf InStr(1, strFlg, DESIGN_FLAG_STYLESHEET_RESOURCE, 0) <> 0 Then strType = "スタイルシート" ElseIf InStr(1, strFlg, DESIGN_FLAG_XSP_CC, 0) <> 0 Then strType = "カスタムコントロール" ElseIf InStr(1, strFlg, DESIGN_FLAG_XSPPAGE, 0) <> 0 Then strType = "XPage" ElseIf InStr(1, strFlg, DESIGN_FLAG_STYLEKIT, 0) <> 0 Then strType = "テーマ" ElseIf InStr(1, strFlg, DESIGN_FLAG_WIDGET, 0) <> 0 Then strType = "コンポーネント" ElseIf InStr(1, strFlg, DESIGN_FLAG_FILE, 0) <> 0 Then strType = "ファイル" ElseIf InStr(1, strFlg, DESIGN_FLAG_JSP, 0) <> 0 Then strType = "JSP" ElseIf InStr(1, strFlg, DESIGN_FLAG_SACTIONS, 0) <> 0 Then strType = "共有アクション" ElseIf InStr(1, strFlg, DESIGN_FLAG_ACCESSVIEW, 0) <> 0 Then strType = "DB2 Acess ビュー" ElseIf InStr(1, strFlg, DESIGN_FLAG_COMPOSITE_APP, 0) <> 0 Then strType = "複合アプリケーション" ElseIf InStr(1, strFlg, DESIGN_FLAG_COMPOSITE_DEF, 0) <> 0 Then strType = "ワイヤリングプロパティ" Else strType = "フォーム" End If ElseIf (lngCls And NOTE_CLASS_INFO) = NOTE_CLASS_INFO Then strType = "データベースについて" ElseIf (lngCls And NOTE_CLASS_VIEW) = NOTE_CLASS_VIEW Then If InStr(1, strFlg, DESIGN_FLAG_SHARED_COL, 0) <> 0 Then strType = "共有列" ElseIf InStr(1, strFlg, DESIGN_FLAG_FOLDER_VIEW, 0) <> 0 Then strType = "フォルダ" ElseIf InStr(1, strFlg, DESIGN_FLAG_VIEWMAP, 0) <> 0 Then strType = "ナビゲータ" Else strType = "ビュー" End If ElseIf (lngCls And NOTE_CLASS_ICON) = NOTE_CLASS_ICON Then strType = "アイコン" ElseIf (lngCls And NOTE_CLASS_DESIGN) = NOTE_CLASS_DESIGN Then strType = "設計リスト" ElseIf (lngCls And NOTE_CLASS_ACL) = NOTE_CLASS_ACL Then strType = "ACL" ElseIf (lngCls And NOTE_CLASS_HELP_INDEX) = NOTE_CLASS_HELP_INDEX Then strType = "ヘルプインデックス" ElseIf (lngCls And NOTE_CLASS_HELP) = NOTE_CLASS_HELP Then strType = "データベースの使い方" ElseIf (lngCls And NOTE_CLASS_FILTER) = NOTE_CLASS_FILTER Then If InStr(1, strFlg, DESIGN_FLAG_SITEMAP, 0) <> 0 Then strType = "アウトライン" ElseIf InStr(1, strFlg, DESIGN_FLAG_V4AGENT, 0) <> 0 Then strType = "エージェント" ElseIf InStr(1, strFlg, DESIGN_FLAG_DATABASESCRIPT, 0) <> 0 Then strType = "データベーススクリプト" ElseIf InStr(1, strFlg, DESIGN_FLAG_SCRIPTLIB, 0) <> 0 Then strExt = Space(128) Call NSFItemGetText(hNote, "$FlagsExt", strExt, 127) strExt = StrLeft(strExt & Chr(0), Chr(0)) If InStr(1, strExt, "W", 0) <> 0 Then strType = "Web サービスコンシューマ" ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVA_AGENT_WITH_SOURCE, 0) <> 0 Then strType = "Java ライブラリ" Else strType = "LotusScript ライブラリ" End If ElseIf InStr(1, strFlg, DESIGN_FLAG_CONNECTION_RESOURCE, 0) <> 0 Then strType = "データコネクション" ElseIf InStr(1, strFlg, DESIGN_FLAG_JS_SERVER, 0) <> 0 Then strType = "サーバー JavaScript ライブラリ" ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVASCRIPT_LIBRARY, 0) <> 0 Then strType = "JavaScript ライブラリ" ElseIf InStr(1, strFlg, DESIGN_FLAG_WEBSERVICE, 0) <> 0 Then strType = "Web サービスプロバイダ" Else strType = "フィルタ" End If ElseIf (lngCls And NOTE_CLASS_FIELD) = NOTE_CLASS_FIELD Then strType = "共有フィールド" ElseIf (lngCls And NOTE_CLASS_REPLFORMULA) = NOTE_CLASS_REPLFORMULA Then strType = "複製式" End If APIGetDesignType = strType End Function
ずいぶんと面倒くさいですね……(x_x)。たぶん、最初にノーツを作った人も、こんなに設計要素が増えると思っていなかったんでしょうね。
ちなみに、DESIGN_FLAGS_SUBCLASS というのが何のためにあるかというと、「フォーム」や「ビュー」を一発で判断するためです。「フォーム」や「ビュー」は、「サブクラスのフラグがどれも含まれない場合」という条件で判断するものなので、サブクラスのフラグがすべて含まれている DESIGN_FLAGS_SUBCLASS を Like で判断してやれば、すぐに判別ができる、というわけです。
If doc.~$Flags(0) Like "*[" & DESIGN_FLAGS_SUBCLASS & "]*" Then '「フォーム」や「ビュー」でない Else '「フォーム」や「ビュー」である End If
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。