D7WS HOMEPAGE WORKSHOP NEUE XTRAS GALERIE WORKSHOP Automatic Translation LESERSERVICE BUCH NEWS

HowTo: Präsenz eines Xtras überprüfen

 

 

 

Home
Workshop-Seite

english version

Demo-Film anschauen

Es gibt einige Fälle, wo Sie als Director-Programmierer überprüfen müssen, ob ein von Ihnen benötigtes Xtra vorhanden ist, beispielsweise in Shockwave-Applikationen, oder wenn Sie Authoring-Tools oder "gebrauchsfertige" Behaviors erstellen, die Xtras nutzen, die nicht zur Standard-Director-Installation gehören. Wenn Sie Code erstellt haben, der grundsätzlich mit mehreren Xtras funktioniert, aber das auf dem Anwenderrechner vorhandene Xtra nutzen soll, ist ebenfalls ein Xtras-Check vonnöten.

Mein JPEG-Export-Behavior - Download hier - macht einen solchen Xtras-Check; das MacOS-gestalt-Beispiel (hier), das prinzipiell mit vier verschiedenen Xtras funktioniert, untersucht zunächst, welches Xtra es nutzen kann.

Diese Möglichkeiten haben wir, um die Verfügbarkeit eines Xtras zu überprüfen:

  1. the xtraList (alle Xtra-Typen, aber langsam)
  2. Check für Lingo-Xtras
  3. Check für Asset-Xtras
  4. symbol table
  5. Einige "kurzgeschlossene" Tests

Joachim Gola




 

 

 

 

The xtraList

Normalerweise nutzt man in Director 7 the xtraList, um die Verfügbarkeit von Xtras zu überprüfen. Das folgende Skript gibt TRUE zurück, wenn alles Xtras, die als Parameter übergeben werden, in der Systemproperty the XtraList enthalten sind. Übergabewert ist eine Liste von Xtra- (Datei-) Namen wie in diesem Aufruf: mytest = checkXtras (["JavaConvert", "Mix Services", "JPEG Export", "Image Translator Helper"]).

on checkXtras theXtras
  temp = the xtraList
  repeat with i = 1 to temp.count()
    -- der folgende Test ist case-sensitive:
    mytest = thextras.getpos(temp[i].name)
    -- bei Übereinstimmung den Xtra-Namen aus theXtras löschen
    if mytest > 0 then theXtras.deleteat(mytest)
  end repeat
  if theXtras = [] then return TRUE
  else

    -- Alert-text vorbereiten
    retval = ""
    repeat with i = 1 to theXtras.count()
      retval = retval & theXtras[i] & " "
    end repeat
    alert "Xtra(s) missing"&return&retval
    return FALSE
  end if
end

Einfacher wird's, wenn Sie nur ein Xtra überprüfen wollen und auf den Alert verzichten:

on checkXtra theXtra
  temp = the xtraList
  repeat with i = 1 to temp.count()
    if temp[i].name = theXtra then return true
  end repeat
  return false
end

Während des Authorings angewandt, dauert der Test relativ lange, da Director für das Erstellen von the xtraList bei der großen Zahl von Xtras Zeit benötigt.

Schauen wir uns die Alternativen an: mehr...




 

 

 

 

Check für Lingo-Xtras

Mit the number of xtras und the name of xtra n ließ sich bereits in früheren Director-Versionen die Existenz eines Lingo-Xtras überprüfen. Als Übergabewert dient in folgendem Skript eine Liste von (internen) Xtra-Namen - also denjenigen, die Sie beim Aufruf von showXlib bekommen:

on checkLingoXtras theXtras
  temp = the number of xtras
  repeat with i = 1 to temp
    mytest = thextras.getpos((xtra i).name)
    -- bei Übereinstimmung den Xtra-Namen aus theXtras löschen
    if mytest > 0 then theXtras.deleteat(mytest)
  end repeat
  if theXtras = [] then return TRUE
  else
return FALSE
end

Oder, wenn Sie nur ein einziges Lingo-Xtra überprüfen wollen:

on checkLingoXtra oneXtraName
  temp = the number of Xtras
  repeat with i = 1 to temp
    if (xtra i).name = oneXtraName then return true
  end repeat
  return false
end

put checkLingoXtra ("UiHelper")
-- 1




 

 

 

 

Check für Asset-Xtras

Um Asset-Xtras zu überprüfen, hat Bruce Epstein in Lingo in a Nutshell folgende Methode vorgeschlagen: Versuchen Sie, einen Darsteller des entsprechenden Typs zu erzeugen; falls die fehlschlägt, so existiert das benötigte Xtra nicht (LIAN Seite 524). Übergabewert ist ein Darstellertyp wie #flash oder #alpha:

on checkAssetXtra oneAssetType
  testmember = new(oneAssetType)
  if ilk(testmember) = #member then
    erase testmember
    return true
  else
    return false
  end if

end

put checkAssetXtra (#flash)
-- 1




 

 

 

 

Den symbol table nutzen

Bruce Epsteins Ausführungen zum Director-internen Symbol Table (LIAN Seite 521-525), insbesondere seine Skriptlösung, um zu erkennen, ob ein Symbol (das ist z.B. ein Lingo-Begehl, ein Darstellertyp, ein Variablenname, ein Lingo-Symbol, vom Anwender definierte Symbole, Handlernamen etc...) in Directors Symbol-Inventar existiert, lassen sich mit Einschränkungen ebenfalls für einen Xtras-Test nutzen. Das folgende Skript ermittelt, ob ein Symbol bereits existiert:

on existingSymbol symbolName
  global gInitialSymbolCount
  -- ein Symbol neu erzeugen, um die Länge des Symbol
  --
Tables zu ermitteln
  if voidP(gInitialSymbolCount) then
    newsymbol = symbol("uniqueSymbol" & the ticks)
    gInitialSymbolCount = (newSymbol + 0)

  end if
  -- den Ort des zu testenden Symbols mit gInitialSymbolCount
  -- vergleichen

  checkSymbol = (symbol(symbolName) + 0)
  if checkSymbol < gInitialSymbolCount then return TRUE
  else return FALSE
end

Erst wird ein neues, auf jeden Fall unikes Symbol erzeugt, um die Länge des Symbol Tables zu ermitteln (das neue Symbol ist auf dem letzten benutzten Platz des Tables).
Falls der Parameter symbolName, der als String übergeben wird,
ein vordefiniertes Director-Symbol ist, erhalten wir eine Position kleiner als gInitialSymbolCount; falls es noch nicht im Symbol Table vorhanden war, wird es durch den test neu erzeugt und seine Position wird größer sein als gInitialSymbolCount.

Es gibt gute Gründe, diesen Code NICHT für einen Xtras-Check zu benutzen. Wird nämlich in irgendeinem Zusammenhang das zu prüfende Symbol vor der Prüfung benutzt (z.B. als Name einer Globalen, oder in einer früheren Session), so ist es vorhanden - und die Prüfung ergibt TRUE, auch wenn das Xtra nicht vorhanden ist. Der Beispielfilm enthält diese Option – for fun, nicht als ernstgemeinter Xtratest!

Es funktioniert mit og. Einschränkung, wenn man einen Handler-Namen (bei Lingo-Xtras) oder einen Darstellertyp (bei Asset-Xtras) als Testparameter übergibt. Dieser Parameter muß ein String sein!

put existingSymbol ("flash")
-- 1
put existingSymbol ("vectorshape")
-- 1
put existingSymbol ("closed") -- eine #vectorshape-Property
-- 0      -- bei Asset-Xtras Darstellertyp nutzen!!
put existingSymbol ("ExportMedia") -- Funktion d. JavaConvert-Xtras
-- 1

ich sehe allerdings keinen Weg, mit dieser Methode Agent-Xtras oder MIX-Xtras wie "Mix Services", "JPEG Export", "Image Translator Helper" zu überprüfen.




 

 

 

 

Für einige Xtras gibt es "kurzgeschlossene" Tests (nur Windows):

if (the soundDeviceList).getpos("QT3Mix") > 0
   -- QuickTime 3 Asset Xtra UND QuickTime >= 3 sind vorhanden

if (the soundDeviceList).getpos("DirectSound") = 1
   -- DirectSoundXtra ist vorhanden UND DirectSound-Version ist >= 5





Directorworkshop.de ist © Joachim Gola & Gerd Gillmaier 1998-2002. Alle Rechte vorbehalten.