Можете ли вы получить указатель на {System.Array}, который находится внутри System :: Object ^? - PullRequest
0 голосов
/ 27 сентября 2011

Хорошо, поэтому у меня есть эта программа, которая принимает файлы, которые пользователь перетаскивает на ярлык. В настоящее время программа может принимать удаленные файлы. Затем я сохраняю файлы в System :: Object ^. Внутри System :: Object ^ находится {System.Array}, содержащий путь к файлам, перетаскиваемым на поле метки.

Мне нужно иметь доступ к путям к файлам в {System.Array} внутри System :: Object ^. Я конвертирую другую программу, написанную на Visual Basic, в C ++; поэтому я стараюсь держать код обеих программ довольно близко друг к другу. Я немного посмотрел на OLE для перетаскивания и думаю, что должен быть в состоянии выполнить перетаскивание, как я начал в этом коде. Я чувствую, что OLE - это слишком много для того, что мне нужно, мне просто нужны пути к файлам. Любые идеи о том, как я могу получить пути к файлам?

private: System::Void lblDragHere_DragEnter(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
{
    if (e->Data->GetDataPresent(System::Windows::Forms::DataFormats::FileDrop))
        e->Effect = System::Windows::Forms::DragDropEffects::All;
    else
        e->Effect = System::Windows::Forms::DragDropEffects::None;

    lblError->Visible = false;

    blnSaveSuccessful = false;
}

private: System::Void lblDragHere_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
{
    bool blnContinue = false;

    // Checks if the user has not set a save location for the files.
    if (lblSaveLocation->Text == "Current Save Location")
    {
        lblError->ForeColor = Color::Red;
        lblError->Text = "Please select a save location first.";
        lblError->Visible = true;
    }
    else
    {
        lblError->Visible = false;

        // Checks to see if the user actually dropped anything onto lblDragHere
        if (e->Data->GetDataPresent(DataFormats::FileDrop))
        {
            System::Object ^ MyFiles;

            // Assign the files to the array.
            MyFiles = e->Data->GetData(DataFormats::FileDrop);
        }
    }
}

1 Ответ

1 голос
/ 27 сентября 2011

Вы должны иметь возможность напрямую получать данные в виде cli-массива имен файлов с помощью приведения:

if(e->Data->GetDataPresent(DataFormats::FileDrop))
{
    // Assign the files to the array.
    array<String^>^ myFiles = (array<String^>^)e->Data->GetData(DataFormats::FileDrop);

    // Do something with the files
    for each(String^ file in myFiles)
    {
        ...
    }
}

(Вы должны использовать void вместо System :: Void, это более читабельно)

...