On Tuesday, 17 April 2018 at 03:55:55 UTC, Chris Katko wrote:
What I want:

class viewport_t
  {
  int x,y,w,h;
  }

class dialog_t
  {
  int x,y;

  this( int x, int y, delegate void (viewport_t) on_draw )
    {
    this.x = x;
    this.y = y;
    this.execute = execute;
    }

  void draw_text(string text)
    {
    }

  delegate void (viewport_t) on_draw;
  }

void function()
  {
  viewport_t v;
  dialog_t (15, 15,
        delegate void (viewport_t)
          {
          draw_text("hello world"); //calls dialog_t function
          }
        )
  }

Is this possible? Pass to a class, the code to run. But the code has to somehow know about the class methods.

I don't think you can pass "dialog_t.this" as it's being constructed!

First of all your code is not valid D code.

To construct a delegate you use the following syntax:

RETURN_TYPE delegate(PARAMS);

Ex. in your case:

void delegate(viewport_t);

Secondly, classes are reference types and thus you cannot construct just like:

viewport_t v;

It must be assigned using "new".

Ex.

auto v = new viewport_t;

The same goes for your dialog_t instance.

What you can do to avoid double allocation of dialog_t is to initially set it to void and thus you can point to the initial variable within your delegate that is constructed when dialog_t is actually constructed.

Ex.

    dialog_t d = void;
    d = new dialog_t (15, 15,
              delegate void (viewport_t)
              {
d.draw_text("hello world"); //calls dialog_t function
              }
    );

I could go into more details, but that would be completely unrelated to your issue at hand.

Reply via email to