dragdrop files v CLR C++

Nesvacil Jiri nesvacil na posys.eu
Pátek Září 23 08:48:18 CEST 2022


auto lst = e->Data->GetData(DataFormats::FileDrop, false);

Prekladac hlasi object a ne array. Object, ktery nelze prochazet pres 
index. Neboli object, ktery nema indexer tj. neni to pole. A bohuzel Vam 
tvrdi, ze to je System::Object. Mozna to tvrdi jen prekladac a dalo by 
se vypsat za provozu pres ToString() nebo GetType().ToString() nebo  
zkusit na to lst dat v debuggeru mysaka a on by vypsal, co je to zac. 
Pote by to slo castnout na dany typ a zbavil by jste se te chyby 
prekladace. Nebo to zjistovat pres dalsi metody ...

https://stackoverflow.com/questions/2850870/e-data-getdatapresent-not-working-in-winforms-drag-and-drop-handler

Jirka

Dne 23.09.2022 v 8:29 Pavel Hudeček napsal(a):
> Tak jsem udělal:
> auto lst = e->Data->GetData(DataFormats::FileDrop, false);
> array< String^ >^ test = gcnew array< String^ >(5);
>
> listBox1->Items->Add(lst->GetType());
> listBox1->Items->Add(test->GetType());
>
> test[2] = "bb";
> listBox1->Items->Add(test[2]);
> // listBox1->Items->Add(lst[2]);
>
> Výsledkem je
> System.String[]
> System.String[]
> bb
>
> Když ale použiju i ten poslední řádek, lst je červeně podtržený a 
> překladač hlásí:
> E2242
> Závažnost    Kód    Popis    Projekt    Soubor    Řádek    Stav potlačení
> Chyba (aktivní)    E2242    Výraz musí být typ ukazatele na objekt 
> nebo popisovače pole C++/CLI, má ale typ "System::Object ^".
> C3915
> Závažnost    Kód    Popis    Projekt    Soubor    Řádek    Stav potlačení
> Chyba    C3915    System::Object nemá žádnou výchozí indexovanou 
> vlastnost (indexer tříd).
>
> PH
>
> Dne 23.09.2022 v 8:10 Nesvacil Jiri napsal(a):
>> On to není list, collection,  ale array. Taky nevim jestli to mate 
>> jako CLR cely projekt a nebo jdete C binarnim do CLR. Pokud jdete C 
>> binarnim do CLR ci obracene vyplati se spis predavat primitivni typy 
>> postupne a na zaver zavola vykonnou metodu. Takovy universalni 
>> prevadec nez delat tyhle silenosti. Jinak clipboard ma uvnitr ruzne 
>> typy a nebyva to vzdy jen text.
>>
>> Jirka
>>
>> https://learn.microsoft.com/en-us/cpp/dotnet/how-to-use-arrays-in-cpp-cli?view=msvc-170 
>>
>>
>> https://stackoverflow.com/questions/995434/arrays-of-strings-in-managed-c 
>>
>>
>> Dne 22.09.2022 v 22:59 Pavel Hudeček napsal(a):
>>> :-)
>>> No to už je trochu zmatení. To s tím collection vypadá funkčně, až 
>>> na to, že jen s clipboardem. Mám to schovaný jako zálohu, že bych 
>>> místo hození souborů na program udělal ctrl+C a pak stisknul tlačítko.
>>>
>>> Jenže ten lst z dragdrop je System.String[]
>>>
>>> Pokusy s for each, nebo for( : vedou k chybovým hláškám, že objekt 
>>> nemá begin a end, nebo že nejde pracovat s každým.
>>>
>>> Vtipný je, že ve VS nikdy to C++ pořádně nefungovalo, vždycky s tím 
>>> byly nějaké složitosti, přitom v Builderu s tím problém nebyl a 
>>> není, v QT taky ne a ještě je výsledek multiplatformní. Jako kdyby 
>>> pánové z MS chtěli naznačit "používejte jiný jazyk, nebo jiné než 
>>> naše IDE" :-)
>>>
>>> PH
>>>
>>> Dne 22.09.2022 v 20:09 Ladislav Vaiz napsal(a):
>>>> Když tak koukám na
>>>> > Collections::Specialized::StringCollection ^ list = 
>>>> (Collections::Specialized::StringCollection 
>>>> ^)e->Data->GetData(DataFormats::FileDrop,
>>>> tak i ta příroda se vám snaží naznačit, že je to špatná cesta :-)
>>>>
>>>> V C# je univerzální foreach, tady by to mohlo být:
>>>>
>>>> auto lst = e->Data->GetData(DataFormats::FileDrop, false);
>>>>
>>>> for each(String ^ s in lst){
>>>>
>>>>     Debug.Print("{0}\n", s);
>>>>
>>>> }
>>>>
>>>> L.
>>>>
>>>> P.S. Snažím se teď v už dříve zmiňovaném projektu používat 
>>>> "pokročilé" vlastnosti, co znám z C# používat v C++. Konkrétně 
>>>> procházení a řazení kolekcí, lambda funkce. V C++ je to šílenost. I 
>>>> ve "starém" C# to všechno funguje jednoduše a logicky, o LINQ v 
>>>> aktuálních verzích ani nemluvě. Bohužel dělat pod ESP32 v C# asi 
>>>> bude stejně okrajový případ jako vaše C++ CLR.
>>>>
>>>>
>>>> On 22.09.2022 17:54, Pavel Hudeček wrote:
>>>>> Tak z tohodle jsem nic rozumného nevyzískal.
>>>>>
>>>>> Ale už předtím mi selhala snaha dostat to do
>>>>> 1. List<String^>^ - ani nešla deklarovat proměnná takového typu
>>>>> 2. std::vector<std::string> o kterých se tam zmiňují
>>>>>
>>>>> jediné co jse, je
>>>>> auto lst = e->Data->GetData(DataFormats::FileDrop, false);
>>>>> (je jedno zda fale/true)
>>>>>
>>>>> lst->GetType() vyplivne samořejmě zase System.String[]
>>>>>
>>>>> ale nemá žádný ->Items, nebo něco takovýho, přes co bych z něj 
>>>>> dostal ty stringy
>>>>>
>>>>> PH
>>>>>
>>>>> Dne 22.09.2022 v 16:49 Nesvacil Jiri napsal(a):
>>>>>> https://stackoverflow.com/questions/32786187/passing-an-array-of-strings-from-c-to-c-sharp 
>>>>>>
>>>>>>
>>>>>> Dne 22.09.2022 v 16:43 Pavel Hudeček napsal(a):
>>>>>>> Trochu jsem s tím pohnul:
>>>>>>> Collections::Specialized::StringCollection ^ list = 
>>>>>>> (Collections::Specialized::StringCollection 
>>>>>>> ^)e->Data->GetData(DataFormats::FileDrop, true);
>>>>>>> for (int n=0; n<list->Count; n++) listBox1->Items->Add(list[n]);
>>>>>>> To jde aspoň přeložit:-)
>>>>>>> Ale stejně to skončí na chybě, že System.String[] nelze 
>>>>>>> přetypovat na System.Collections.Specialized.StringCollection.
>>>>>>> Takže je ten výstup jinej než z Clipboard.GetFileDropList
>>>>>>>
>>>>>>> Pořád tedy to samé: Jak v c++ udělat System.String[]?
>>>>>>>
>>>>>>> PH
>>>>>>>
>>>>>>>
>>>>>>> Dne 22.09.2022 v 16:25 Pavel Hudeček napsal(a):
>>>>>>>> No to přepínátko funguje jen částečně, asi podle toho, které 
>>>>>>>> části mají udělané a když stránka neobsahuje alternativní 
>>>>>>>> jazyk, tak ho nezobrazí vůbec. Např. u toho clipboardu se tím 
>>>>>>>> do c++ přepne definice, ale example už ne. Ten jde přepnout 
>>>>>>>> třeba do vb.
>>>>>>>>
>>>>>>>> PH
>>>>>>>>
>>>>>>>> Dne 22.09.2022 v 16:04 Ladislav Vaiz napsal(a):
>>>>>>>>> Asi nechcete slyšet knížecí radu, ale já bych přešel na C# :-(
>>>>>>>>> V MSDN se někdy dají jazyky přepnout, např. v 
>>>>>>>>> https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.clipboard.getdata?view=netframework-4.0
>>>>>>>>> je přepínátko nad nadpisem vpravo.
>>>>>>>>> L.
>>>>>>>>>
>>>>>>>>> On 22.09.2022 15:55, Pavel Hudeček wrote:
>>>>>>>>>> Dobrý den všem,
>>>>>>>>>>
>>>>>>>>>> tady
>>>>>>>>>> Provide file drag and drop functionality - Visual C++ | 
>>>>>>>>>> Microsoft Learn 
>>>>>>>>>> <https://learn.microsoft.com/en-us/troubleshoot/developer/visualstudio/cpp/language-compilers/provide-file-drag-drop-functionality>
>>>>>>>>>> je popis jak udělat, aby se v listboxu zobrazil seznam na něj 
>>>>>>>>>> hozeých souborů.
>>>>>>>>>> To funguje.
>>>>>>>>>>
>>>>>>>>>> Jak totéž udělat v C++ CLR?
>>>>>>>>>>
>>>>>>>>>> První část s DragEnter funguje:
>>>>>>>>>> private: System::Void listBox1_DragEnter(System::Object^ 
>>>>>>>>>> sender, System::Windows::Forms::DragEventArgs^  e) {
>>>>>>>>>>             if (e->Data->GetDataPresent(DataFormats::FileDrop))
>>>>>>>>>>                 e->Effect = DragDropEffects::All;
>>>>>>>>>>             else
>>>>>>>>>>                 e->Effect = DragDropEffects::None;
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>> Ale všechny pokusy o DragDrop selhaly na tom, že nem;žu najít 
>>>>>>>>>> C ekvivalent pro
>>>>>>>>>> string[] s = (string[]) e.Data.GetData(DataFormats.FileDrop, 
>>>>>>>>>> false);
>>>>>>>>>> Nějaké nápady?
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list