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