Script談話室バックナンバー2012

プラグインエディタ内の<ストリングの使い方   HiroMi
Sat Oct 6 8:29:12 2012

石男さん 有り難うございました。
PlugIn
本体に格納されているなどという事もあるんですね
次々と知らない事が出てくる感じです。
色々やってみます
疑問点が出てきたら聞くかもしれません
その時は 宜しくお願い致します。有り難うございました。


Re9:プラグインエディタ内の<ストリング...>の使い方    石男
Fri Oct 5 18:46:25 2012

PlugInを作る時にのみ出るメニュのようなので、おそらくPlugIn本体に格納されていると
思われます。どこにあるのかは分かりません。

話がもとに戻りますが、これを使ってStringを設定するより、
>予め テキストファイルとして準備すればよいかと思ったからです。
その通りだと思います。ヘルプ文用に用意されたものかもしれませんけど...


Re8:プラグインエディタ内の<ストリング...>の使い方   HiroMI
Fri Oct 5 13:46:01 2012

仕事に終われ、余裕もなく 失礼致しました。
Re7:
>でのscript Mac/VW12.5IDを設定の後 問題なく動きました。
ここで 次の疑問が起きました。
ここで設定したID3000~3004textはどこに格納されるのかという事です。
それを知ることができれば
予め テキストファイルとして準備すればよいかと思ったからです。
ライブラリ/Application Support/VectorWorks/12/Plug-ins/Common/Data/Notesにも
ないのでお教え戴けたらと思います。宜しくお願い致します。


Re7:プラグインエディタ内の<ストリング...>の使い方    石男
Mon Oct 1 17:10:26 2012

<ストリング...>でID3000~3004を設定してから試してください。
GetPluginString」はVer.12.5以前からあるようなので...

PROCEDURE DlogTest;
CONST
kAtPlugStr = 3000;
VAR
choiceStr : STRING;

FUNCTION RunEditDialog: BOOLEAN;
VAR
dialog : INTEGER;
cnt, index : INTEGER;
PROCEDURE dialog_Handler( VAR item : LONGINT; data : LONGINT );
BEGIN
CASE item OF
SetupDialogC: BEGIN
FOR cnt := 0 TO 4 DO BEGIN
InsertChoice( 5, cnt, GetPluginString( kAtPlugStr+cnt ) );
END;
END;
{OK}
1: BEGIN
GetSelChoice( 5, 0, index, choiceStr);
END;

END;{Case}
END;

BEGIN
RunEditDialog := FALSE;
dialog := CreateLayout( 'TestGetPlunginString', TRUE, 'OK', 'Cancel' );

{create controls}
CreateStaticText( dialog, 4, 'PlunginString :', 20 );
CreatePullDownMenu( dialog, 5, 24 );

SetFirstLayoutItem( dialog, 4 ) ;
SetRightItem( dialog, 4, 5, 0, 0 );

{run test dialog}
IF RunLayoutDialog( dialog, dialog_Handler ) = 1 Then BEGIN
RunEditDialog := TRUE;
END;
END;
{////////////////////////////// Main ////////////////////////////}
BEGIN
IF RunEditDialog THEN AlrtDialog( Concat( 'PlunginString =', choiceStr ) );
END;
RUN( DlogTest );

2009
 Macで試しましたので、win用に書き直してみてください。


Re6:プラグインエディタ内の<ストリング...>の使い方    与太郎
Sat Sep 29 2:35:07 2012

>石男さん
GetPluginString
でしたか!
Reference Manual
Pluginで検索したつもりですが気付きませんでした。


Re5:プラグインエディタ内の<ストリング...>の使い方    石男
Thu Sep 27 20:13:56 2012

HiroMiさん

やはり、気になり、もう一度調べ直しました。
FUNCTION GetPluginString(stringIndex :INTEGER) : STRING;
ご指摘のように、stringIndex=3000+Indexのようです。
それでは...


Re3:Re:プラグインエディタ内の<ストリング...>の使い方   HiroMi
Thu Sep 27 10:17:47 2012

石男さん、与太郎さん 有り難うございます。

そもそもの始まりは、私の廻りで<引出し線ツール>を使い、仕様を書込んだ際
プリントする時 文字の反転や文字化けが起こるので 
以前のツール<順引出し線ツール+文字>という形で入力を と指示され、
今迄のデータベースを使って 入力作業の省力化が出来ないか
と思ったのが始まりです。
色々探っていたところ この<ストリング>というコマンドに目が止まり
使った事もなく、ガイドにもなく 知りたくなりお聞きしました。

仕様を書込む際、<引出し線ツール>で仕様を選択して表記するように
データベースから選択した文字を文字列として図面上に表記できる様なscript
考えようと思っています。
進めていく中 又相談させて頂く事も在ろうかと思います。
その時は宜しくお願い致します。


Re3:プラグインエディタ内の<ストリング...>の使い方    石男
Wed Sep 26 20:33:08 2012

エディタ内の<ストリング...>で設定したSTRINGは普通の使い方では出来なかったような
気がします。記憶が不確かなのでアシカラズ。
GetResourceStringSetVSResourceFile
ですが、昔のMacの遺産を使う場合に使用します。ResourceFileというWindowsで使うリソー
スファイルとは別のものを作り、その中で設定してあるSTRINGPICTリソース、PINGといっ
たデータを使う時のものです。

HiroMi
さんが考えているものとは違うかもしれません、それよりもSTRINGを返すサブルー
チンを作った方が良いかも知れません。


Re:Re:プラグインエディタ内の<ストリング...>の使い方   HiroMi
Tue Sep 25 17:50:46 2012

早々の返答有り難うございます。
私も Nemetschekでしょうか VectorScript CommunityBoardの中に
GetResourceString
SetVSResourceFileを見つけたのですが
英文ですので いまいち理解できず。メールした次第です。
有り難うございました。
ちょっと長くなりますが 掲載されていたモノを載せます。

Procedure LocalTest;
const
kMyDialogStrings= 11000;{ res id of 'STR#' resource with dialog strings }
kOKItem= 1;{ string index = item number of dialog control }
kCancelItem= 2;
kListBrowserItem= 4;
kTitleIndex= 5;

kMyMiscStrings= 11001;{ res id of 'STR#' resource with misc strings }
kHelloString= 1;{ string index }
kTestString= 2;

var
resFileOpen : BOOLEAN;
promptString : STRING;

{----------------------------------------}
function OpenMyResourceFile :BOOLEAN;
const
kMyResourceFilename = 'MyTestResources';
BEGIN
IF SetVSResourceFile(kMyResourceFilename) THEN
OpenMyResourceFile := TRUE
ELSE
Begin
Message('The resource file ', kMyResourceFilename, ' was not found.');
OpenMyResourceFile := FALSE;
End;
END;

{----------------------------------------}
FUNCTION GetLocalDialogString(strIndex :INTEGER) :STRING;
VAR
theString : STRING;

BEGIN
{ Attempt to get strings from the resource file. }
{ Localizing distributors can translate strings within the resource file. }
if (resFileOpen = true) then
GetResourceString(theString, kMyDialogStrings, strIndex);

{ If localized string not found, use english. }
if (theString = '') then
CASE strIndex OF
kOKItem: theString := 'OK';
kCancelItem: theString := 'Cancel';
kListBrowserItem: theString := 'Description';
kTitleIndex: theString := 'LB Test';
END;

GetLocalDialogString := theString;
END;

{----------------------------------------}
FUNCTION GetLocalMiscString(strIndex :INTEGER) :STRING;
VAR
theString : STRING;

BEGIN
{ Attempt to get strings from the resource file. }
{ Localizing distributors can translate strings within the resource file. }
if (resFileOpen = true) then
GetResourceString(theString, kMyMiscStrings, strIndex);

{ If localized string not found, use english. }
if (theString = '') then
CASE strIndex OF
kHelloString: theString := 'Hello World!';
kTestString: theString := 'This string is hardcoded in the script.';
END;

GetLocalMiscString := theString;
END;

BEGIN
resFileOpen := OpenMyResourceFile;
promptString := GetLocalMiscString(kTestString);
AlrtDialog(promptString);
END;
Run(LocalTest);


Re:プラグインエディタ内の<ストリング...>の使い方    与太郎
Tue Sep 25 17:03:36 2012

簡単に試せないので確認してませんが、
GetResourceString
で文字列を取得するのではないでしょうか。


プラグインエディタ内の<ストリング...>の使い方   HiroMi
Tue Sep 25 11:03:27 2012

以前ヒントを戴き、何とかscriptも動いてくれています。有り難うございました。
iMaOX5.8
で VectorWorks12.5、を使っています。
今回メールしましたのは、文字列をコントロールするscriptを考えていた際
プラグインエディタに<コマンド編集><プロパティ><パラメータ...
<ストリング....>とコマンドがあるのですが
この<ストリング....>というコマンドの使い方を 
教えていただきたいと思ったからです。

このコマンドを追加で開くと <ID3000、カテゴリ>
その中に入ると<ID3000、ストリング>とあり
前者は1000番づつ、後者は1番づつ増える様で、
データベースのようであるという感じです。
ガイドにも説明がないので 宜しくお願い致します。


Re:Re:bottomRangeSubrow  manabu
Sun Aug 5 21:15:14 2012

さっそくの回答ありがとうございます。
データベース行のもあるワークシートで確認してみましたところ、だいたいわかりました。
データベース行がない場合は無視した方が良さそうです。

ワークシートのデータベース機能で取れない値でも、スクリプトでは取れたりするので上手く使えると便利ですね。


Re.:bottomRangeSubrow   与太郎
Sun Aug 5 17:09:09 2012

役に立つかどうか判りませんが...

Warning: XXX XXX - Attempt to access a cell outside the worksheet bounds.」は以前私も遭遇しました。
※2004年のScript談話室バックナンバーを「GetWSSelection」で検索)
xxxRangeSubrow
というパラメータはワークシートのDB機能と関係あるはずですが、深く追求しませんでした。
DB
機能で図形を抽出したワークシートなら違う結果になるのかも知れません。


bottomRangeSubrow  manabu
Sun Aug 5 11:40:55 2012

お世話になります。

GetWSSelection
でセルの範囲を取得したいのですが、「Warning: GET2DSIZE BOTTOMRANGESUBROW - Attempt to access a cell outside the worksheet bounds.」という警告が出ます。
スクリプト自体は上手くいっているのですが、topRangeSubrowbottomRangeSubrowが具体的に何の値を取ってくるのかよくわかりません。
数値自体は0で返ってきています。

詳しい方いらっしゃたら、よろしくお願いします。


グループのクラス(2)の訂正    与太郎
Fri Jun 1 10:58:34 2012

管理人さん、削除依頼の件ありがとうございました m(_ _)m 。

>クラスを削除している場合は「ClassNum=クラスの数」かどうかは定かではありません。
と書きましたが、私の勘違いでした。
ClassNum
はクラスの数で間違いありません。
下のスクリプトでクラス名のリストを書き出せます。
出力先は、Ver.11.5以前ならアプリケーションフォルダ内のVectorWorksフォルダの中、
Ver.12
以降ならユーザーフォルダの奥にあるVectorWorksフォルダの中のVersion別フォルダの中です。

procedure test;
{
クラス名を書き出す。 }
var
__i, n:integer;
begin
__n:= ClassNum;
__for i:= 1 to n do begin
____Write(i); Tab(1); WriteLn(ClassList(i));
__end;
__Message('クラス名を書き出しました!');
end;
Run(test);

クラスを削除しても空き番号が生じないからと言っても、
その度に図形のクラスIDを書き替えるようなことをするとは思えないので、
結局のところ、ClassList(番号) の「番号」はクラスIDそのものではないのでしょう。


グループのクラス(2)    与太郎
Mon May 28 22:54:21 2012

「一般」クラスの名前を変更している場合たとえば「無し」に変えていたり、
英語版で「一般」が「None」になっていたりするときは、
前回のスクリプトではグループのクラスは「無し」や「None」にはなりません。
新しく「一般」クラスが作られて、グループはその「一般」クラスになってしまいます。
「一般」クラスを作らずに、「無し」や「None」などのクラスでグループ化する方法はあるでしょうか?

新しく作った「一般」クラスと元々の「一般」クラスの違いは、削除が可能か否かです。
元々の「一般」クラスは削除出来ません。別の名前に変えても削除出来ません。
しかし、この仕様をスクリプトで応用するのは難しいです。
もうひとつの方法は、クラスIDを使うことです。
クラス関係の標準サブルーチンではパラメータにクラス名を使いますが、
VW
の内部ではクラスは名前でなく番号で管理されているはずです。
クラス名はユーザーの目に触れるレベルでしか使われていないでしょう。
そうでなければクラス名を変えるたびに大量のクラス名の書き替えが必要になります。
実際は大量のデータがあってもクラス名の変更は一瞬で終わるので、
番号クラス名のテーブルを書き替えているだけだと推測できます。
その番号をここではクラスIDトぶことにします。
クラスIDの1は「一般」、2が「寸法」に決まっていて、3以降がユーザーが作ったクラスです。
「寸法」クラスも名前の変更は可能ですが、削除は出来ません。
名前を変えてもクラスIDは変わらないので、元々の「一般」クラスを特定出来ます。

procedure test;
{
一般クラス(ClassList(1))でグループ化する。 }
var
__actCls :string;
begin
__actCls:= activeClass;
__NameClass(ClassList(1));
__DoMenuTextByName('Group Chunk', 1);
__NameClass(actCls);
end;
Run(test);

クラスIDに関係する標準サブルーチンは、クラス名を返すClassListと、
クラスIDの上限を返すClassNumだけです。
クラスを削除している場合は「ClassNum=クラスの数」かどうかは定かではありません。


グループのクラス(1)    与太郎
Tue May 8 16:08:40 2012

確かVW10くらいまでは、グループは「一般」クラスで作成されました。
それがVW11からは、グループ化したときのアクティブクラスに変更されました。
このせいで、クラスで図形表示を制御している場合にグループ内の図形が表示されないことがあります。
「一般」クラスを非表示にすることはほとんど無いのですが、
「補助線」のようなクラスは作図中は表示しても最終的には非表示になります。
そのようなクラスがアクティブな状態でうっかりグループ化してしまうと、
そのクラスが非表示になった瞬間にグループ内の図形も表示されなくなります。
原因(グループ化)と結果(不可視化)のタイムラグのせいですぐには気付かなかったり、
最後まで気付かなかったりするので厄介です。
これは、グループに表示属性が適用されるからいけないという考え方もありますが、
ユーザーにどうこう出来ることではありません。
しかし、スクリプトで旧バージョンのようにグループを常に「一般」クラスにすることは出来ます。
最も簡単なのは、下の2行スクリプトです。

DoMenuTextByName('Group Chunk', 1);
SetClass(FSActLayer, '
一般');

グループ化の直後はそのグループ図形しか選択されてないので、
FSActLayer
で得られたハンドルはグループ図形のハンドルのはずです。
ただし、FSActLayerではグループ内やシンボル内のような深い階層の図形ハンドルは得られません。
どんな階層でも新しいグループのハンドルを得る方法は、いくつかあります。
(1)
アクティブクラスを「一般」に変更してからグループ化。
(2) ForEachObjectInLayer
を使う。
(3)
現在の階層にある図形のハンドルを辿ってグループのハンドルを探す。
以上の三つの内、一番簡単なのは(1)です。
アクティブクラスを一旦「一般」にしてからグループ化して、
そのあとでアクティブクラスを元に戻します。
元のアクティブクラスを変数に記憶する必要があるので、
コマンドの羅列ではなくprocedureにしないといけません。

procedure test;
{
「一般」クラスでグループ化する。 }
var
__actCls :string;
begin
__actCls:= activeClass;
__NameClass('一般');
__DoMenuTextByName('Group Chunk', 1);
__NameClass(actCls);
end;
Run(test);


Re:ツールのモードを選択    与太郎
Thu Apr 26 15:01:03 2012

VWでは無理みたいです。
AutoCAD
みたいにコマンド入力があれば、ツールマクロみたいなのは簡単に出来そうですね。


ツールのモードを選択   FREEHAND
Wed Apr 18 20:39:26 2012

質問させてください。
VectorScript
で任意のツールを選択することができますが、選択したツールのモードを指定することはできないのでしょうか。
例えば、フィレットツールで、トリミングモードにして、尚かつ、フィレット半径を1000にすることができないかということです。
よろしくお願いします。


Re.:用紙全体を見る」してから「保存」    与太郎
Mon Apr 16 7:55:24 2012

「スクリプトエディタ」は、いつの間にか名前が「AppleScriptエディタ」に変わってますよ。


Re.:用紙全体を見る」してから「保存」    石男
Sun Apr 15 21:52:50 2012

何か蛇足ですが、miVSモードのVS実行のメニュはAppleScriptで行っています。
ですので、直接AppleScriptVectorScriptを実行させても一緒です。
こんな感じです...
on run
tell application "Vectorworks 2011"
activate
try
DoScript "
PROCEDURE FitToWindow_SAVE_Close;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
DoMenuTextByName('Close',0);
END;
RUN(FitToWindow_SAVE_Close);
"
on error number 1
end try
beep
end tell
end run

これをスクリプトエディタでアプリケーションとして保存しておけば、同じ結果がえられ
ます。


re:用紙全体を見る」してから「保存」   FREEHAND
Sun Apr 15 17:00:34 2012

件のVectorScriptですが、懸案だった素早く実行することが解決しました。
VectorScript
をプラグインコマンドにして、それをメニューに登録したのです。
プラグインコマンドにしておけば、保存先が図面ファイルではなく、システム(VectorWorks)になりますので、「閉じる」も実行できます。
また、図面ファイルごとにVectorScriptを取り込んでおかなくても済むという利点があります。

その手順を大まかに書いておきます。

1.
 あらかじめテキストエディタなどを使ってVectorScriptを作成しておく。
2.
 VectorWorksのメニューで、[ツール][スクリプト][プラグインコマンド...
3.
 新規作成ダイアログボックスで、プラグインコマンドの名称を入力。(半角の場合は27文字以内)
4.
 プラグインコマンドの新規作成ダイアログボックスの 一覧から「メニュー」を選択するとプラグインコマンドが作成される。
5.
 作成されたプラグインコマンドを選択して[コマンド編集]→VectorScriptをコピペ。
6.
 念のためコンパイル。成功したら[OK
7.
 [カテゴリ]をクリックすると、次の「作業画面の設計」のときに分類されるカテゴリが表示される。デフォルトでは「その他」になっている。
8.
 作業画面の設計の「メニュー」で、左側の一覧の中の「その他」の中に、先ほど作成したプラグインコマンドがあるので、それを任意の場所に登録する。

【その他メモ】
・上記4のとき、「メニュー」ではなく「ツール」を選択することもできる。
この場合、作成したプラグインコマンドは、作業画面の設計で「メニュー」ではなく「ツール」に表示され、ツールとして登録できる。

・作成されたプラグインコマンドは、HD/ユーザ/ホーム/ライブラリ/Application Support/VectorWorks/2011.noindex/Plug-ins内に保存される。
拡張子はメニューの場合vsn。ツールの場合vst

vsnファイルをmiで編集すると、VectorWorksから実行できなくなったり、実行しようとするとVectorWorksがクラッシュしたりする。
プラグインコマンドを編集するには、[ツール][スクリプト][プラグインコマンド...[コマンド編集...]とした方がよい。

・プラグインコマンドの編集で,[名称変更]をすると、作業画面の設計で再度プラグインコマンドを登録し直さなければならない。

・「メニュー」に登録して問題なく動作したスクリプトを「ツール」に登録すると、うまく動作しない場合がある。


というわけで、とりあえず、当初の目的は達成できました。
みなさん、ありがとうございました。


re:用紙全体を見る」してから「保存」   FREEHAND
Fri Apr 13 23:48:56 2012

少し進展がありましたのでお知らせします。
件のVectorScriptを実行することができました。

私はVectorScriptをテキストエディタのmiで書いて、vss形式で保存しています。
mi
で書いたテキストを、VectorWorksのリソースブラウザから新規作成した
VectorScript
にコピペして作ります。
それをコマンドパレットから実行していました。

ところで、VectorWorksのメニューで「ツール」「スクリプト」「コマンドを実行」
というのものがあります。
そこから、vssを選択したところ、スクリプトを実行することができました。
図面ファイル外のスクリプトの実行ですから、「閉じる」も動作しました。
「保存しますか?」ダイアログも出ませんでした。
もちろん、保存されてました。
スクリプトの内容は下記を参照してください。

さらに、ところで、miは、メニューで「ドキュメント」「モード」VectorScript
にしています。
mi
のウインドウの上部のツールバーにはいくつかボタンがありますが、
このモードでは、その中に「2011で実行」ボタンがあります。
それで、VectorWorksで図面ファイルを開いた状態で、
かつ、mivssを開いた状態で「2011で実行」ボタンをクリックすると、
スクリプトが動作しました。
VectorWorks
で複数の図面ファイルを開いていた場合は、
最前面(アクティブ)のものに対して動作しました。

というわけで、VectorScriptを図面外部から実行する方法が二つ見つかりました。
ただし、コマンドパレットから実行することと比べると、素早さの点で劣りますが。


**************************

{
用紙全体を見る_保存_閉じる}
PROCEDURE FitToWindow_SAVE_Close;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
DoMenuTextByName('Close',0);
END;
RUN(FitToWindow_SAVE_Close);


こちらが新規談話室です。    管理人
Wed Apr 11 0:23:18 2012

こちらが新規談話室です。
お手数をおかけしました。
不具合がありましたらお知らせ下さい。


テストです    管理人
Wed Apr 11 0:09:10 2012

書き込みテストです。


業務連絡    管理人
Tue Apr 10 21:59:29 2012

FREEHANDさん、御心配なく。
そのためにいる管理人です。
会員登録のアップを確認されてから質問されたのですね。
お待たせして、すみませんでした。


re:用紙全体を見る」してから「保存」   FREEHAND
Tue Apr 10 21:55:53 2012

ごめんなさい。同じものを二度書き込んでしまいました。
送信ボタンを押した後、リロードしても画面に反映されていなかったもので・・・
キャッシュを空にしたら、見えました。


用紙全体を見る」してから「保存」   FREEHAND
Sun Apr 8 23:00:45 2012

みなさん、初めまして。
アドバイスお願いします。
環境は、MacOS X 10.7.3  v2011です。

開いている図面ファイルを、「用紙全体を見る」してから「保存」するスクリプトを作りたいのです。
そこで、下記のスクリプトを作りました。
コンパイルは成功し、実行してもエラーは出ませんでした。
実行した時の動作を観察すると、「用紙全体を見る」は動作しました。
そして「保存」も、ファインダで図面ファイルのタイムスタンプ(変更日)を見ると、
スクリプトを実行した時刻になってます。
しかし、図面ファイルのウインドウの左上の赤い丸の中央に黒い点が現れたままなのです。
つまり、このまま図面ファイルを閉じると「保存しますか?」ダイアログボックスが出る状態なわけです。
そのダイアログボックスで「保存しない」を選択しても、一度保存はできてるので、
内容が失われることはないのですが、やはり黒い点が消えた状態=そのまま閉じてもダイアログボックスが出ない状態にしたいのです。

下記のBEGINENDの間にDoMenuTextByNameが二行ありますが、
Save
の方の一行だけのスクリプトを作って実行させると、黒い点が消えた状態にすることはできたのですが、
DoMenuTextByName
を二つ続けて実行させると、黒い点が出た状態になってしまうのです。

よろしくお願いします。

**************************

PROCEDURE FitToWindow_SAVE;
VAR
subMenu:STRING;
index:INTEGER;
BEGIN
DoMenuTextByName('Fit To Window',0);
DoMenuTextByName('Save',0);
END;
RUN(FitToWindow_SAVE);

**************************


談話室復活!    管理人
Tue Mar 6 16:53:46 2012

ご迷惑をおかけしました。談話室復活です!


re.8:論理型について(VW談話室より)    管理人
Tue Jan 31 14:45:32 2012

はてさて、薔薇の騎士ロードス殿?
管理人は直接存じ上げませんが、ひょっとしてワラワ姫のお知り合いでいらっしゃる?
さすれば、お説はごもっとも、探求の道はまさにサーガのごとしでござる。あれ?ござる?
はっ!ここはScript談話室。
ハシゴしたあげく、迷い込んでしまったようです。
ここは与太郎さんにお返しして、iMacSagaの他の一行が乱入する前に、ええと、喫茶室へでも。


re.2:論理型について(VW談話室より)    与太郎
Sun Jan 29 21:15:43 2012

BASICを学び始めた頃、IF 1=1 THEN .... という記述を見て、
>????となりましたが、

私もその頃に与太郎さんの説明を聞きたかったです...


論理型について(VW談話室より)    与太郎
Wed Jan 11 16:24:41 2012

今年もよろしくお願いします。
途中で止まってるお題をなんとかしようと思うのですが、
年明け最初の書き込みは、いきなりVS談話室の話題への補足です。

たとえば書類の表示モードを切り替える場合、
元の設定値をGetPrefで調べてSetPrefで逆の値を設定するので、
if GetPref(10) = true then
__SetPref(10, false)
else
__SetPref(10, true);
と書くことができます。
このif文の書き方は冗長なのですが、初心者にはありがちです。
if
文の文法は if 条件式 then 処理1 else 処理2; であり、
条件式の結果が真(true)のときに処理1を、偽(false)のときに処理2を実行するのですが、
条件式の部分は必ずしも「式」である必要はありません。
if
文では条件式というより条件式の計算結果でもある論理値によって分岐処理を行ないます。
論理値を返す式とは論理式のことですが、
これには単独の論理型定数、論理型変数、論理型関数も含まれます。
上のif文のGetPref(10)を戻り値であるtruefalseに置き換えれば、
条件式の計算結果は true = true なら truefalse = true なら false となります。
これはGetPref(10)の値そのままです。
GetPref
は論理型の関数なので、単体で条件式として使えます。
ですから上のif文の「= true」は必要なく、スクリプトは
if GetPref(10) then
__SetPref(10, false)
else
__SetPref(10, true);
で良いことになります。
しかし実はif文を使うまでもなく、GetPref(10)の値を逆にするのはnot演算で可能です。
not」演算子は、算術演算の「-」演算子に相当するもので、論理値を反転します。
この場合はSetPrefの第2パラメータにnot GetPref(10)を入れれば済みます。
つまり、
SetPref(10, not GetPref(10));
が一番短いスクリプトになります。

この例に限らず、論理型を上手く使えばスクリプトを簡潔に書けることがあります。


本年もよろしくお願いいたします。    管理人
Sun Jan 1 0:00:13 2012

昨年の書き込みはバックナンバーに移動しました。
Script
満載の充実した資産ですので、ご活用頂けると幸いです。
回答者の皆さんに感謝!
本年もよろしくお願いいたします。