Страницы: | 1 |

Верхние Лужицы и Нижние Лужицы

19 апреля 2012 // Хельги

Вот такой фрагмент кода на C#:

var c = CultureInfo.GetCultureInfo("hsb");
var dt = new DateTime(2011, 2, 20, 15, 30, 0);
var fmt = dt.ToString("g", c);
DateTime pdt;

if (!DateTime.TryParse(fmt, c, DateTimeStyles.AllowWhiteSpaces, out pdt))
    Console.WriteLine("failed");

напечатает failed только для следующих культур: hsb, hsb-DE, dsb и dsb-DE. В fmt оказывается строчка 20. 2. 2011 15.30 hodź. для hsb или 20. 2. 2011 15.30 goź. для dsb.

Для всех остальных культур дотнет успешно парсит им же самим сформированную строку.

Да, hsb и dsb — это верхнелужицкий и нижнелужицкий языки.

Тэги: c#, wtf, работа, язык
Написать комментарий

Exception imminent

25 ноября 2009 // Хельги

/users/helgi/exception-imminent.png

Я, конечно, опечатался: не ==, а !=.

Тэги: c#, en, visual studio, wtf, работа
Написать комментарий

Кьюшки (cue banner) в контролах DevExpress

15 октября 2009 // Хельги

В Windows XP появились встроенные подсказки, которые выводятся в текстовом поле, пока пользователь не поставит туда курсор. По-английски они называются cue banners, а вот русский термин мне не известен (Language Portal не помог).

/users/helgi/cue-banner-vista.png

Необходимые действия для создания кьюшки в обычном дотнетовском текстовом поле уже подробно описаны до нас; нам нужно только применить рецепт для вытаскивания текстового поля из девэкспрессовских контролов.

Итак, необходимые объявления:

private const int EM_SETCUEBANNER = 0x1501;
private const int EM_GETCUEBANNER = 0x1502;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(
    IntPtr hWnd, 
    int msg,
    int wParam, 
    [MarshalAs(UnmanagedType.LPWStr)] string lParam);

Установка кьюшки на девэкспрессовский контрол (помним, что контролы DevExpress содержат текстовое поле в качестве дочернего контрола):

foreach (Control control in buttonEdit1.Controls)
{
    if (control is TextBox)
    {
        WinApi.SendMessage(control.Handle, WinApi.EM_SETCUEBANNER, 0, "Cue banner");
    }
}

Вот так выглядит результат:

/users/helgi/cue-banner.png

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

Тэги: c#, работа, советы
Комментарии (1)

DrawItemEventArgs: цвета и состояние

7 октября 2009 // Хельги

Загадка. Что напечатает следующий отрывок кода на языке си#?

var args = new DrawItemEventArgs(
    g, font, rect, 0, 
    DrawItemState.Selected, Color.Black, Color.Goldenrod);
Console.WriteLine("{0}, {1}", args.ForeColor, args.BackColor);

Если кто-то думает, что там будет Black или Goldenrod, он ошибается.

Color [HighlightText], Color [Highlight]

А вся фишка в том, что свойство BackColor в DrawItemEventArgs реализовано так:

public Color get_BackColor()
{
    if ((this.state & DrawItemState.Selected) == DrawItemState.Selected)
    {
        return SystemColors.Highlight;
    }
    return this.backColor;
}

Редакция от 15 октября 2009
Тэги: c#, wtf, работа
Написать комментарий

Кидаться какашками

17 июля 2009 // Хельги

class Poo : Exception
{
}

// ...

throw new Poo();

Редакция от 15 октября 2009
Тэги: c#, fun
Написать комментарий

Worse than failure: как обменять значения двух переменных?

29 июня 2008 // Хельги

Казалось бы, задача проще некуда, из тех, что сможет сделать даже студент-первокурсник. Но нет.

Мы с паре с моим непосредственным начальником разрабатывали участок кода, связанный с отрисовкой изображения. В какой-то момент возникла необходимость построить по двум точкам прямоугольник со сторонами, параллельными осям. Понятно, что для этого нужно проверить, что пары x и y-координат упорядочены, и обменять их, если это условие не выполнено. Я, не долго думая, написал следующий код:

int t = y1;
y1 = t;
y2 = y1;

Мы запустили тестовое приложение и поняли, что что-то пошло не так. Мой начальник сказал: «А, ясно, да ты тут ошибся в обмене!» — и исправил мои три строчки на вот такой вариант:

int t = y2;
y1 = t;
y2 = y1;

Программа снова не заработала. Тут мы наконец остановились и поняли, что оба не смогли с первого раза правильно написать обмен двух переменных. Для очистки совести мы подозвали коллегу и попросили его быстро, не проверяя себя, написать на бумажке решение злополучной задачи. Вот что у него получилось:

int t = y2;
y1 = y2;
y2 = t;

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

Редакция от 15 октября 2009
Тэги: c#, wtf, работа
Комментарии (2)

Автодополнение в текстовых полях (.NET)

29 мая 2008 // Хельги

В текстовых полях, предназначенных для ввода имён файлов, в Windows, как правило, включено автодополнение, позволяющее быстро ввести имя файла с клавиатуры, не боясь ошибиться.

/users/helgi/autocomplete.png

Для реализации аналогичной функциональности в .NET-приложении можно воспользоваться функцией SHAutoComplete.

Для использования функции потребуется объявить её, как описано на pinvoke.net:

[Flags]
public enum AutoCompleteFlags : uint
{
    SHACF_DEFAULT = 0x00000000,
    SHACF_FILESYSTEM = 0x00000001,
    SHACF_URLALL = (SHACF_URLHISTORY | SHACF_URLMRU),
    SHACF_URLHISTORY = 0x00000002,
    SHACF_URLMRU = 0x00000004,
    SHACF_USETAB = 0x00000008,
    SHACF_FILESYS_ONLY = 0x00000010,
    SHACF_FILESYS_DIRS = 0x00000020,
    SHACF_AUTOSUGGEST_FORCE_ON = 0x10000000,
    SHACF_AUTOSUGGEST_FORCE_OFF = 0x20000000,
    SHACF_AUTOAPPEND_FORCE_ON = 0x40000000,
    SHACF_AUTOAPPEND_FORCE_OFF = 0x80000000, 
}

[DllImport("shlwapi.dll", ExactSpelling = true, PreserveSig = false)]
public static extern Int32 SHAutoComplete(
    IntPtr hwndEdit,
    AutoCompleteFlags dwFlags
);

Для активации автодополнения в обычном текстовом поле достаточно такого вызова:

SHAutoComplete(textBox1.Handle, AutoCompleteFlags.SHACF_FILESYSTEM);

Если же необходимо включить автодополнение в элементах управления ButtonEdit или TextEdit из библиотеки DevExpress, то код будет немного сложнее:

foreach (Control control in buttonEdit1.Controls)
{
    if (control is TextBox)
    {
        SHAutoComplete(control.Handle, AutoCompleteFlags.SHACF_FILESYSTEM);
    }
}

Дело в том, что элементы DevExpress не являются текстовыми полями, а включают их в качестве дочерних элементов.

Вот так выглядит автодополнение в элементе ButtonEdit:

/users/helgi/autocomplete2.png

Редакция от 15 октября 2009
Тэги: c#, screenshots, советы
Написать комментарий

ReSharper

12 ноября 2007 // Хельги

С «решарпером» программирование стало напоминать тетрис. Перейти к нужному слову, Alt+Enter, выбрать нужную опцию, подумать, повторить. Набирать вслепую я не могу, но на стрелки, Alt и Enter попадаю не глядя.

Редакция от 15 октября 2009
Тэги: c#, visual studio, работа
Написать комментарий

.NET Compact Framework 2.0

30 марта 2007 // Хельги

Впечатлился возможностями сабжа и решил что-нибудь накорябать. Первый кандидат, конечно же, Jack-in-the-Box, тем более что я и так на него убил порядочно времени. Можно и ещё кое-что придумать.

  • Jack-in-the-Box, многооконный редактор исходников
  • Многооконный браузер на основе PIE (вряд ли получится хорошо)
  • Простенький графический редактор со страницами
  • Старый remote control (стоит ли его доделывать?)

Редакция от 21 марта 2010
Тэги: c#, todo
Написать комментарий

Страницы: | 1 |