WebHU - Programozási kérdések és válaszok

C# visszahívások Windows űrlapokba

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.

05.08.2015

Válaszok:


1

Azt hiszem, most jöttem rá a válaszra. Meg kell tenni egy statikus hivatkozást egy UI objektumra, ebben az esetben egy ListBoxra. Ezután hozzárendelheti a visszahívási delegált egy olyan funkcióhoz, amely biztosítja, hogy a listbox hivatkozás ne legyen nulla. Csak győződjön meg arról, hogy hozzárendeli a statikus hivatkozást az űrlap létrehozásakor:

namespace test
{
    public delegate void callback(String msg);


    public partial class Form1 : Form
    {
        public static ListBox callbackListBox;       //  add this

        public void writeToListbox(String s)
        {
            if(null == callbackListBox)return;       // add this check

            // also make this threadsafe:
            if (callbackListBox.InvokeRequired)
            {
                callbackListBox.Invoke(new MethodInvoker(() => { writeToListbox(s); }));
            }else{
                callbackListBox.Items.Add(s);
                callbackListBox.TopIndex = callbackListBox.Items.Count - (callbackListBox.Height / callbackListBox.ItemHeight);
            }
        }

        public static void writeToConsole(String s)
        {
            System.Console.WriteLine(s);
        }
        public void createclass
        {
            callback ui_update = writeToListbox;     // now OK
            someclass SC = new someclass(ui_update);
        }

        // and add this to the form's constructor:
        public Form1()
        {
            InitializeComponent();
            callbackListBox = listbox1;
        }

    }

    class someclass
    {
        callback cb;
        void someclass(callback T)
        {
            this.cb = T;
        }       
        void logthis(string s)
        {
            cb("it's me!");
        }
    }
}

Ezt még ki kell próbálnom, de legalább a fordító nem panaszkodik.

05.08.2015
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..