dragdrop files v CLR C++

Pavel Hudeček edizon na seznam.cz
Pátek Září 23 08:29:28 CEST 2022


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



Další informace o konferenci Hw-list