Re: dragdrop files v CLR C++ vyřešeno

Pavel Hudeček edizon na seznam.cz
Pátek Září 23 13:36:14 CEST 2022


Byl jsem si jist, že jsem přesně tohle zkoušel už včera, i s static_cast 
a pod.
Výsledkem bylo vždy podtržené =

No ale asi jsem měl ještě něco jiného špatně.
Takže díky, chodí:-)

A tím taky začlo chodit:
for each(String ^ path in lst) listBox1->Items->Add(path);
ale nechodí:
for (String^ path : lst) listBox1->Items->Add(path);

V tomhle sice nemám moc jasno, ale praktickému použití to nebrání:-)

PH


Dne 23.09.2022 v 11:47 Nesvacil Jiri napsal(a):
> 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?


Další informace o konferenci Hw-list