dragdrop files v CLR C++

Pavel Hudeček edizon na seznam.cz
Čtvrtek Září 22 22:59:42 CEST 2022


:-)
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