NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Re: [ap-list:1396] Re:Re: 配列プロパティ

差出人: たけ(tk)さん " たけ (tk)"<ggb03124…>
送信日時 2001/04/12 23:33
ML.NO [ap-list:1400]
本文:

たけ(tk)です。

Kazuhiro Yoshida さん曰く。
》もりきゅうです。

》"たけ(tk)" <ggb03124@…> wrote:
》>  もう少し、Delphi レベルで作りやすそうなプラン。

》これにインスピレーションを得て作ってみたら,見事に
》成功! ^^

》とりあえず uGrid.pas に実装してみました。添付します。

》 vreader := rb_iv_get(rb_class_of(obj), _index_reader);

これだと一つしか作れないのでは?。

function Indexer_new(This: Tvalue): Tvalue; cdecl;
begin
result := rb_data_object_alloc(cIndexer, nil, nil, nil);
rb_iv_set(result, _owner, This);
rb_iv_set(This, _indexer, result);

rb_iv_set(result, _name, ap_String(rb_id2name(rb_frame_last_func)));
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
end;


function Indexer_aref(argc: Integer; argv: Pointer; This: Tvalue): Tvalue; cdecl;
var
・・・
name:String;
begin
obj := rb_iv_get(This, _owner);
name := dl_String(rb_iv_get(This, _name));
vreader := rb_iv_get(rb_class_of(obj), PChar(name+_index_reader));
++++++++++++
reader := ap_data_get_struct(vreader);
result := reader(argc, argv, obj);
end;

function Indexer_aset(argc: Integer; argv: Pointer; This: Tvalue): Tvalue; cdecl;
・・・ aref と同様 ・・・

procedure DefineIndexer(klass: Tvalue; name: PChar; reader, writer: TFunc1);
var
vreader: Tvalue;
vwriter: Tvalue;
begin
vreader := rb_data_object_alloc(cIndexer, @…, nil, nil);
vwriter := rb_data_object_alloc(cIndexer, @…, nil, nil);

rb_define_method(klass, name, @…_new, 0);

rb_iv_set(klass, PChar(String(name)+_index_reader), vreader);
rb_iv_set(klass, PChar(String(name)+_index_writer), vwriter);
++++++++++++++++++++
end;

 −−

 デルファイの関数をラップして保存し、取り出してデルファイレベルの関数と
して実行しているようだけれど、Rubyのメソッドを実行するようにすれば、
Rubyで再定義できるようになる。

 結局[ap-list:1335] の

class Foo
def bar_aref(i)
print "bar[#{i}]n"
end
def bar_aset(i,v)
print "bar[#{i}]=#{v}n"
end
attr_indexer :bar
end

に落ち着くかも・・。

たけ(tk) ggb03124@…
http://member.nifty.ne.jp/take_tk

このエントリーをはてなブックマークに追加
添付:

このメールは下記のメールに対する返信です:

このメールには下記のメールが返信されています:

更新順メールリスト