Как Вы настраиваете OpenFileDialog для выбора папок?

Я согласен с более ранними ответами о том, что реальная случайность в небольших тиражах некоторых игр нежелательна - для некоторых случаев использования она кажется слишком несправедливой.

Я написал простую сумку в случайном порядке, как в Ruby, и сделал некоторые тесты. Реализация сделала это:

  • Если это все еще кажется справедливым или мы не достигли порога минимальных бросков, он возвращает справедливый удар, основанный на нормальной вероятности.
  • Если наблюдаемая вероятность прошлых рулонов делает ее нечестной, она возвращает «справедливый» удар.

Это считается несправедливым на основе граничных вероятностей. Например, для вероятности 20% вы можете установить 10% в качестве нижней границы и 40% в качестве верхней границы.

Используя эти границы, я обнаружил, что с прогонами 10 ударов 14,2% время, когда истинная псевдослучайная реализация дала результаты, которые были вне этих границ. Примерно в 11% случаев, 0 критических ударов были забиты в 10 попытках. 3,3% времени, 5 или более критических ударов были высажены из 10. Естественно, используя этот алгоритм (с минимальным количеством рулонов 5), гораздо меньшее количество (0,03%) пробелов «Fairish» было за пределами границ , Даже если приведенная ниже реализация не подходит (возможно, более умные вещи можно сделать, конечно), стоит отметить, что часто пользователи могут почувствовать, что это несправедливо с реальным псевдослучайным решением.

Вот мясо мой FairishBag написан на Ruby.

def fire!
  hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
    false
  elsif @rolls >= @min_rolls && observed_probability < @unfair_low
    true
  else
    rand <= @probability
  end
  @hits += 1 if hit
  @rolls += 1
  return hit
end

def observed_probability
  @hits.to_f / @rolls
end

Обновление: использование этого метода увеличивает общую вероятность получения критического удара, примерно до 22%, используя границы выше. Вы можете компенсировать это, установив свою «реальную» вероятность немного ниже. Вероятность 17,5% с помощью волшебной модификации дает наблюдаемую долгосрочную вероятность около 20% и сохраняет справедливость в краткосрочной перспективе.

246
задан Steve 26 January 2013 в 11:43
поделиться

10 ответов

У меня есть диалоговое окно, которое я записал, назвал диалоговое окно OpenFileOrFolder, которое позволяет Вам открывать или папку или файл.

, Если Вы устанавливаете его значение AcceptFiles ко лжи, затем она работает в, только принимают режим папки.

можно загрузить источник с GitHub здесь

58
ответ дан SSteve 23 November 2019 в 03:04
поделиться

Попробуйте этого от Codeproject (кредит к Нитрону):

я думаю, что это - то же диалоговое окно, о котором Вы говорите - возможно, помогло бы, добавляете ли Вы снимок экрана?

bool GetFolder(std::string& folderpath, const char* szCaption=NULL, HWND hOwner=NULL)
{
    bool retVal = false;

    // The BROWSEINFO struct tells the shell how it should display the dialog.
    BROWSEINFO bi;
    memset(&bi, 0, sizeof(bi));

    bi.ulFlags   = BIF_USENEWUI;
    bi.hwndOwner = hOwner;
    bi.lpszTitle = szCaption;

    // must call this if using BIF_USENEWUI
    ::OleInitialize(NULL);

    // Show the dialog and get the itemIDList for the selected folder.
    LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

    if(pIDL != NULL)
    {
        // Create a buffer to store the path, then get the path.
        char buffer[_MAX_PATH] = {'\0'};
        if(::SHGetPathFromIDList(pIDL, buffer) != 0)
        {
            // Set the string value.
            folderpath = buffer;
            retVal = true;
        }       

        // free the item id list
        CoTaskMemFree(pIDL);
    }

    ::OleUninitialize();

    return retVal;
}
1
ответ дан demoncodemonkey 23 November 2019 в 03:04
поделиться

Можно использовать код как это

  • , фильтр, скрывают файлы
  • , имя файла, скрываются, первый текст

К усовершенствованному скрываются текстового поля для имени файла, на которое необходимо посмотреть OpenFileDialogEx

код:

{
    openFileDialog2.FileName = "\r";
    openFileDialog1.Filter = "folders|*.neverseenthisfile";
    openFileDialog1.CheckFileExists = false;
    openFileDialog1.CheckPathExists = false;
}
10
ответ дан Alex Essilfie 23 November 2019 в 03:04
поделиться

Я предполагаю, что Вы находитесь на Vista с помощью VS2008? В этом случае я думаю, что опция FOS_PICKFOLDERS используется при вызове диалогового окна файла Vista IFileDialog. Я боюсь, что в.NET кодируют, это включило бы много непростого кода P/Invoke interop для получения работы.

5
ответ дан Duncan Smart 23 November 2019 в 03:04
поделиться

Хорошо, позвольте мне попытаться соединить первую точку ;-) Проигрывание немного со Шпионом ++ или Winspector показывает, что текстовое поле Folder в Месте Проекта VS является настройкой стандартного диалогового окна. Это не то же поле как текстовое поле имени файла в стандартном диалоговом окне файла, таком как то в Блокноте.

Оттуда на, я фигурирую, VS скрывает текстовые поля/поля комбинированного списка имени файла и типа файла и использует пользовательский диалоговый шаблон для добавления его собственной части в нижней части диалогового окна.

РЕДАКТИРОВАНИЕ: вот пример такой настройки и как сделать это (в Win32. не.NET):

m_ofn является структурой OPENFILENAME, которая лежит в основе диалогового окна файла. Добавьте эти 2 строки:

  m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
  m_ofn.Flags |= OFN_ENABLETEMPLATE;

, где IDD_FILEDIALOG_IMPORTXLIFF является пользовательским диалоговым шаблоном, который будет добавлен в нижней части диалогового окна. Посмотрите часть красного цвета ниже. alt text
(источник: apptranslator.com )

В этом случае, специализированная часть является только маркировкой + гиперссылка, но это могло быть любое диалоговое окно. Это могло содержать кнопку OK, которая позволит нам проверить папку только выбор.

, Но как мы избавились бы от некоторых средств управления в стандартном компоненте диалогового окна, я не знаю.

[еще 1113] деталь в эта статья .

MSDN

17
ответ дан Glorfindel 23 November 2019 в 03:04
поделиться

Точная Аудио Копия прокладывает себе путь на Windows XP. Стандартный файл открывается, диалоговое окно показывают, но поле имени файла содержит текст "Имя файла, будет проигнорирован".

Просто предположение здесь, но я подозреваю, что строка введена в средства редактирования поля комбинированного списка каждый раз, когда существенное изменение внесено в диалоговое окно. Пока поле не является пробелом, и диалоговые флаги установлены не проверить существование файла, диалоговое окно может обычно закрываться.

Редактирование: это намного легче, чем я думал. Вот является код в C++ / MFC, можно перевести его в среду по Вашему выбору.

CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();

Редактирование 2: Это должно быть переводом в C#, но я не бегло говорю на C#, так не стреляйте в меня, если он не работает.

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // openFileDialog1.FileName should contain the folder and a dummy filename
}

Редактирование 3: Наконец посмотрел на фактическое рассматриваемое диалоговое окно, в Visual Studio 2005 (у меня не было доступа к нему ранее). Это не стандартный файл открытое диалоговое окно! , Если Вы осматриваете окна в Шпионе ++ и сравниваете их со стандартным открытым файлом, Вы будете видеть, что структура и имена классов не соответствуют. Когда Вы смотрите тесно, можно также определить некоторые различия между содержанием диалоговых окон. Мое заключение состоит в том, что Microsoft полностью заменила стандартное диалоговое окно в Visual Studio, чтобы дать ему эту возможность. Мое решение или что-то подобное будут так близки, как можно добраться, если Вы не готовы кодировать свое собственное с нуля.

17
ответ дан Mark Ransom 23 November 2019 в 03:04
поделиться

Лучше использовать FolderBrowserDialog для этого.

using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
    dlg.Description = "Select a folder";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show("You selected: " + dlg.SelectedPath);
    }
}
27
ответ дан Ryan Farley 23 November 2019 в 03:04
поделиться

Ookii. Диалоговые окна пакет содержат управляемую оболочку вокруг нового (стиль Vista) диалоговое окно браузера папки. Это также ухудшается корректно в более старых операционных системах.

35
ответ дан Caio Proiete 23 November 2019 в 03:04
поделиться

Можно использовать FolderBrowserDialogEx - допускающая повторное использование производная встроенного FolderBrowserDialog. Этот позволяет Вам вводить в пути, даже пути UNC. Можно также просмотреть для компьютеров или принтеров с ним. Работы точно так же, как встроенный FBD, но... лучше.

(РЕДАКТИРОВАНИЕ: Я должен был указать, что это диалоговое окно может быть установлено выбрать файлы или папки.)

Полный Исходный код (один короткий модуль C#). Свободный. Общедоступная MS лицензия.

Код для использования его:

var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
dlg1.Description = "Select a folder to extract to:";
dlg1.ShowNewFolderButton = true;
dlg1.ShowEditBox = true;
//dlg1.NewStyle = false;
dlg1.SelectedPath = txtExtractDirectory.Text;
dlg1.ShowFullPathInEditBox = true;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;

// Show the FolderBrowserDialog.
DialogResult result = dlg1.ShowDialog();
if (result == DialogResult.OK)
{
    txtExtractDirectory.Text = dlg1.SelectedPath;
}
48
ответ дан Cheeso 23 November 2019 в 03:04
поделиться

Можно разделить диалоговое окно файла на подклассы и получить доступ ко всем его средствам управления. У каждого есть идентификатор, который может использоваться для получения его дескриптора окна. Можно затем показать и скрыть их, получить сообщения от них об изменениях выбора и т.д. и т.д. Все это зависит, сколько усилий Вы хотите приложить.

Мы сделали наш использование поддержка класса WTL и настроили диалоговое окно файла для включения пользовательской панели мест и сменных представлений COM.

MSDN предоставляет информацию о том, как сделать это использование Win32, , эта статья CodeProject включает пример , и , эта статья CodeProject предоставляет пример.NET .

10
ответ дан Jeff Yates 23 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: