0

複数のレベルでリンクをたどる DXL スクリプトを作成しています。モジュールが開いているときに、スクリプトがこれらのリンクを正しく反復処理することに気付きました。ただし、反復するモジュールが約 20 あり、これらすべてのモジュールを開きたくありません。リンクされたモジュールを手動で開かずにこれらのリンクを表示するにはどうすればよいですか?

これが私のコードの例です:

// Checks to see if the object exists or not.  If not returns a null.  
//  This will be eventually adapted to make sure the object is from a 
//  specific set of modules, but for now we're just checking for ability
//  to retrieve
Object getObject(Link obj_link) {
    ModuleVersion other_ver = null
    ModName_ other_mod = null
    Object other_obj

    other_ver = sourceVersion obj_link
    other_mod = module(other_ver)
    if (null other_mod || isDeleted other_mod) return null

    other_obj = source obj_link
    if (null other_obj) load(other_ver, true)
    other_obj = source obj_link
    if (isDeleted other_obj) return null

    return other_obj
}

// Displays the object from a specific link module if it's found
void showOut(Object o) {
    Link l_obj_link
    string s = null

    Item linkModItem = itemFromID(MODULE_ID)
    string linkModName = fullName(linkModItem)

    for l_obj_link in all(o <- linkModName) do {

        Object test_obj
        display("Test")
        test_obj = getObject(l_obj_link)
        if (null test_obj){
            display("Null Object Found")
        } else {
            s = probeRichAttr_(test_obj, "Object Identifier", false)
            displayRich(s)
        }
    }
}

// Call showOut for the object
showOut(obj)

繰り返しますが、これをレイアウト DXL スクリプトとして使用すると、リンクされたモジュールが開かれている場合にのみ、オブジェクト ID を確認できます。

4

2 に答える 2

2

まず、 を使用することをお勧めします。代わりにすべてのコードを生成する代わりにAnalysis -> Wizard、必ず のオプションを選択してください。必要なものが正確に得られない場合は、必要なものを表示するようにそのコードを変更してください。All ModulesAll Open Modules

ただし、既存のコードを更新するだけの場合は、getObject各モジュールをサイレント モードで開くように関数を変更する必要があります (情報を取得するには、モジュールが開いている必要がありますが、表示されている必要はありません)。

Object getObject(Link obj_link) {
  ModuleVersion other_ver = null
  ModName_ other_mod = null
  Object other_obj

  other_ver = sourceVersion obj_link
  other_mod = module(other_ver)
  Module m = read(fullName(other_ver), false)  // false, tells it to open silently.
  if (null other_mod || isDeleted other_mod) return null

  other_obj = source obj_link
  if (null other_obj) load(other_ver, true)
  other_obj = source obj_link
  if (isDeleted other_obj) return null

  return other_obj
}

これもうまくいくはずですが、代わりに分析ウィザードから始めることをお勧めします。

于 2015-05-12T13:39:00.347 に答える
0

loadリンク参照 ( ) を使用してモジュールにアクセスする必要がありますLinkRef。特定の LinkModule と Object のすべてのモジュールをロードする単純な関数を次に示します。

// Loads all incoming linked modules for the given link module and Object.  To load from 
//  ALL link modules use the linkModName = "*"
void LoadSourceModules(string linkModName, Object o) {
    ModName_ otherMod = null
    LinkRef lr

    // For each incoming link check to see if the moduel exists, isn't deleted and loaded
    //  if not loaded `(null data(sourceVersion lr))` then load the module.
    for lr in all(o<-linkModName) do {
        otherMod = module(sourceVersion lr)
        if (!null otherMod) {
            if ((!isDeleted otherMod) && (null data(sourceVersion lr))) {
                load((sourceVersion lr), false)
            }
        }
    }
}
于 2015-05-12T14:48:27.390 に答える