hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ソフト開発/HSPLet3拡張ライブラリ/Tips - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

Tips

内容を保証するものではありません。

Operand.java

変数の値を取得

変数の値はOperandクラスおよびそのサブクラスに定義されているtoInt()メソッド、toDouble()メソッド、toByteString?()メソッドを呼び出して戻り値として得ることができます。

例えばHSPの整数型変数v(cnt)の内容を取得したい時は、

  1
  2
  3
-
|
!
public static int sampleFunc(final Operand o, final int oi){
    return o.toInt(oi);
}

としてHSP側から

  1
 
    mes sampleFunc(v(cnt)) // == mes v(cnt)

とすれば良いでしょう。

このように、Operand を受け取るときは、必ず次の引数を int にして配列のインデックスを受け取る必要があります(winmm.javaから引用)。

変数に値を代入

オペランドへの代入にはassign()メソッドを利用します。

void assign(final int index, final Operand rhs, final int rhi)
「自分自身のindex番目の要素」に、「rhsのrhi番目の要素が格納する値」を代入する。

このように代入したい値が格納されたオペランドを用意しておく必要がありますが、この際Scalarクラスを利用すると便利です。
ScalarクラスはOperandクラスのサブクラスで、単一の要素だけを持つオペランドをあらわす基本クラス(Scalar.javaより引用)です。staticなメソッドfromValue()にint,double,ByteString?などの型を持つ引数を渡すことで、0番目の要素に引数の内容を格納したオペランドを得ることができます。

例えば、オペランドvの2番目の要素に定数100を代入したい場合は

  1
 
    v.assign(2, Scalar.fromValue(100), 0);

とします。vが整数型であることを確認するべきでしょう。

変数の型を取得(動作確認済)

変数の型を調べたい時はgetType()メソッドを利用し、Typeクラスの持つ定数と比較します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
-
|
-
|
|
|
|
|
|
!
|
!
public static String sampleFunc(final Operand o, final int oi){
    String ret;
    switch(o.getType()){
        case Operand.Type.LABEL   : ret="ラベル型ですね。";     break;
        case Operand.Type.STRING  : ret="文字列型ですね。";     break;
        case Operand.Type.INTEGER : ret="整数型ですね。";       break;
        case Operand.Type.DOUBLE  : ret="実数型ですね。";       break;
        case Operand.Type.MODULE  : ret="用途不明の型ですね。"; break;
        default : ret="未知の型ですね。"; break;
    }
    return ret;
}
  1
  2
 
 
    tmp = 1.0
    mes sampleFunc(tmp)  // => "実数型ですね。"

Context.java

システム変数に値を代入

  1
  2
  3
  4
  5
  6
-
|
|
|
|
!
public static void clear_all_sysvals(Context context){
    context.stat.value    = 0;
    context.refdval.value = 0.0;
    context.refstr.value.assign( "" );
    context.strsize.value = 0;
}

エラーを出す

各エラーを表す数値(int型)は定数としてHSPErrorクラス(HSPError.java)内に定義されています。

  1
  2
  3
  4
  5
  6
-
|
|
|
|
!
public static void create_error(Context context){
    // システムエラーを出す
    context.error(HSPError.SystemError, "error");
    // メッセージを付加することも可能
    context.error(HSPError.SystemError, "error", "error message sample");
}

FunctionBase?.java

FunctionBase?関数群クラスの実装に便利ないくつかのスタティックメソッドを持ったクラスFunctionBase?.javaから引用)です。
関数群クラス作成の際は、このクラスを拡張すると良いかも知れません。

パラメータ省略時のデフォルト値を指定する

パラメータの省略を許す場合、そのパラメータはint型やdouble型などではなく、Operand型で受け取りましょう。
こうすることで、デフォルト値の指定が可能になります。

例えばpos命令はGuiCommand?クラス内で次のように定義されています。

  1
  2
  3
  4
  5
  6
  7
-
|
|
|
|
|
!
public static void pos(final Context context, final Operand xv, final int xvi, final Operand yv, final int yvi) {
 
    final Bmscr win = (Bmscr) context.windows.get(context.targetWindow);
 
    win.cx = toInt(xv, xvi, win.cx);
    win.cy = toInt(yv, yvi, win.cy);
}

このように記述すると第1パラメータをxv、第2パラメータをyvで受け取ることになります。
FunctionBase?クラスで定義されているtoInt()メソッドを利用している点に注目してください。

protected static int toInt(final Operand v, final int vi, final int ifnull)
Operand型の引数vがnull以外の場合、v.toInt(vi)を返します。nullの場合、ifnullを返します。

このメソッドを利用することで、省略時のデフォルト値の指定が1行で可能になります。同様にdouble型ならtoDouble()メソッド、String型ならtoString()メソッドが利用できます。

ByteString?.java

HSP の文字列が MS932 なのに対して Java は UCS-2、また HSP の文字列が可変に対して、Java の文字列は不変など、多くの場面で Java の文字列をそのまま使用することが出来ないので、代わりにこのクラスを使用します(ByteString?.javaより引用)。
文字列の長さを返すlength()メソッドや文字列の比較を行うcompareTo()メソッド、文字列の置換を行うreplace()メソッドなど文字列操作に必要なメソッドはひと通り備わっています。

コンストラクタ

コンストラクタは複数用意されていますが、既存文字列からオブジェクトを構築するものが最も簡単でよく使う方法でしょう。
引数にString型で初期値を指定するだけでオブジェクトを生成できます。

  1
 
    ByteString bs = new ByteString("このオブジェクトの初期値になる文字列");

代入はOperandクラス同様、assign()メソッドを利用します。代入する文字列はByteString?型でもString型でもかまいません。

  1
  2
 
 
    ByteString bs = new ByteString("このオブジェクトの初期値になる文字列");
    bs.assign( "代入する文字列" );

その他

その他 書いてるのはellerさんじゃないです 変数の値を取得 はint型とdouble型は普通に取得できます 表記は 文字列 変数 配列 文字列配列 byte配列 を取得したい時だと思います 値を返すのもint double を普通に返した方が楽そうです

dll 作成 classファイルを作って拡張子をdllにすればいけるはず (拡張子を変更するとは、ツールみたいな処理ではなく、単純に名前の変更をします) classファイルまんまだと数が増えすぎるのですが その場合はellerさんのように 一つのclassに委譲しましょう

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-10-12 (土) 22:08:39 (56d)