dragdrop files v CLR C++

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


Tak asi misto tohoto:

auto lst = e->Data->GetData(DataFormats::FileDrop, false);
array< String^ >^ test = gcnew array< String^ >(5);

dat

array< String^ >^ lst = (array< String^ 
 >^)e->Data->GetData(DataFormats::FileDrop, false);
array< String^ >^ test = gcnew array< String^ >(5);

a je to ne ?

Jirka

Dne 23.09.2022 v 11:05 Pavel Hudeček napsal(a):
> Debuger o obou říká, že jsou array<String^> a u obou zobrazí seznam se 
> [0], [1], ... a dá se do něj kouknout a v lst je opravdu seznam cest.
>
> PH
>
> Dne 23.09.2022 v 8:48 Nesvacil Jiri napsal(a):
>> 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
>> _______________________________________________
>> 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