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.