NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
HONZ4
Člen
Avatar
HONZ4:10.9.2017 16:36

Zdravím.
Potřebuji vytvořit vlastní formát schránky (prakticky se do ní snažím vložit proměnné třídy).

Tento testovací kód funguje v rámci vlastní aplikace, i mezi jejími instancemi.

Ale já potřebuji obsah schránky vložit do jiné aplikace (jde o jiný projekt).
Ale v ní to nejde schránka načíst - data jsou null. (místo je popsáno v kódu)

[Serializable]
internal class MyClass
{
    private String[] lines;

    public MyClass(string a, string b, string c)
    {
        lines = new String[3];
        lines[0] = a;
        lines[1] = b;
        lines[2] = c;
    }

    public string GetString(int index)
    {
        return lines[index];
    }
}

internal static class MyClassExt
{
    public static MyClass FromClipboard()
    {
        IDataObject data_object = Clipboard.GetDataObject();
        if (data_object.GetDataPresent("§nejakynazev§"))
        {
            //toto se nepodaří:
            MyClass mc = data_object.GetData("§nejakynazev§") as MyClass; // << vždy null
            if (mc == null) throw new Exception("Data ve schránce se nepodařilo načíst!");
            return mc;
        }
        else throw new Exception("Schránka neobsahuje podporovaná data!");
    }

    public static void CopyToClipboard(MyClass mc)
    {
        DataFormats.Format format = DataFormats.GetFormat("§nejakynazev§");

        IDataObject dataObj = new DataObject();
        dataObj.SetData(format.Name, mc);
        Clipboard.SetDataObject(dataObj, true);
    }
}

Už jsem to zkoušel různými způsoby, které jsem na netu našel, ale výsledek je vždy stejný (v rámci jednoho sestavení to funguje, v jiném ne).

 
Odpovědět
10.9.2017 16:36
Avatar
HONZ4
Člen
Avatar
HONZ4:10.9.2017 18:39

Ještě jsem to trochu změnil.. (bych to zpřehlednil) Podstatné je, že pokud se použije místo as přetypování, tak to vypisuje hlášku:
Objekt typu System.IO.Memo­ryStream nelze přetypovat na typ CLPRD.MyClass

[Serializable]
internal class MyClass
{
    public static string FORMAT_ID = "MyClassData";
    private String[] lines;

    public MyClass(string a, string b, string c)
    {
        lines = new String[3] {a, b, c};
    }

    public string this[int index]
    {
        get { return lines[index]; }
    }

    public static MyClass FromClipboard()
    {
        IDataObject obj = Clipboard.GetDataObject();
        if (obj.GetDataPresent(MyClass.FORMAT_ID))
        {
            MyClass mc = (MyClass)obj.GetData(MyClass.FORMAT_ID, false);

            if (mc == null) throw new Exception("Data ve schránce se nepodařilo načíst!");
            return mc;
        }
        else throw new Exception("Schránka neobsahuje podporovaná data!");
    }

    public void SendToClipboard()
    {
        IDataObject dataObj = new DataObject(MyClass.FORMAT_ID, this);
        Clipboard.SetDataObject(dataObj);
    }
}
 
Nahoru Odpovědět
10.9.2017 18:39
Avatar
David Oczka
Tvůrce
Avatar
Odpovídá na HONZ4
David Oczka:11.9.2017 8:11

Ahoj. A s klasickým textem Ti to funguje? Což takhle ten objekt serializovat do XML a předat jako string? :)

 
Nahoru Odpovědět
11.9.2017 8:11
Avatar
HONZ4
Člen
Avatar
Odpovídá na David Oczka
HONZ4:11.9.2017 17:41

S textem není problém. Ale u textu se mě nelíbí, že uživatel může vložit jiný, nebo pozměněný text.

ps, Zkoušel jsem text i serializovat binárně, ale vkládání do jiné aplikace se taky nepodařilo, hlásilo to chybu, že aplikace nemůže najít.. - byl tam název namespace a verze aplikace

 
Nahoru Odpovědět
11.9.2017 17:41
Avatar
HONZ4
Člen
Avatar
HONZ4:11.9.2017 20:15

Takže prozatím jsem to vyřešil tak, že jsem třídu MyClass dal tak jak je, do DLL a importuji do obou aplikací.
Schránka funguje sice pouze dokud je zdrojová aplikace spuštěna, ale to mi moc nevadí.

Ale prozatím nebudu označovat toto vlákno jako vyřešené, snad někdo najde lepší řešení.
Díky každému, kdo nad mým problémem přemýšlel.

 
Nahoru Odpovědět
11.9.2017 20:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.