dragdrop files v CLR C++
Pavel Hudeček
edizon na seznam.cz
Pátek Září 23 11:05:11 CEST 2022
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
Další informace o konferenci Hw-list