Megpróbálok létrehozni egy osztályt (egy Windows-alkalmazás kontextusában), amely képes frissíteni a folyamatot (vagy felhasználói üzenetet küldeni) a fő felületre a küldötteken keresztül. A problémám az, hogy a fordító nem engedélyezi az általam megkísérelt konstrukciók egyikét sem, mert hiányoznak az objektumhivatkozások. Ezt itt tárgyaltuk, de a válaszoknak nem volt köze ahhoz, hogy egy űrlapon lévő objektumra írjanak.
c++-ban ezt csinálnám:
void LogToUI(string s)
{
if(Form1)
Form1->update(s);
}
void TForm1::update(string s)
{
listbox->Items->Add(s);
}
// hogy bármely funkció bárhol frissíthesse a listboxot (a szál biztonságától eltekintve)
in C#:
namespace test
{
public delegate void callback(String msg);
public partial class Form1 : Form
{
public void writeToListbox(String s)
{
listbox.Items.Add(s);
}
public static void writeToConsole(String s)
{
System.Console.WriteLine(s);
}
public void createclass
{
callback ui_update = writeToConsole; // this is ok
callback ui_update = writeToListbox; // not allowed
someclass SC = new someclass(ui_update);
}
}
class someclass
{
callback cb;
void someclass(callback T)
{
this.cb = T;
}
void logthis(string s)
{
cb("it's me!");
}
}
}
Megértem a problémát, ha statikus metódust kell hozzárendelni a delegálthoz, és a Form1 metódus nem statikus. A delegált módszert szeretném használni, mert az tűnik a legtisztábbnak; Egyszerűen nem találom a módját, hogy ezt úgy írjam le, hogy működjön, csak egy mutatót viszek vissza az űrlapra, ami rendetlennek tűnik.