Вот такой фрагмент кода на 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, работа, язык
Написать комментарий
В Windows XP появились встроенные подсказки, которые выводятся в текстовом поле, пока пользователь не поставит туда курсор. По-английски они называются cue banners, а вот русский термин мне не известен (Language Portal не помог).
Необходимые действия для создания кьюшки в обычном дотнетовском текстовом поле уже подробно описаны до нас; нам нужно только применить рецепт для вытаскивания текстового поля из девэкспрессовских контролов.
Итак, необходимые объявления:
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");
}
}
Вот так выглядит результат:
К сожалению, кьюшки абсолютно стандартны и ничего не знают о темах девэкспресса, поэтому на инверсной теме они выглядят довольно убого.
Тэги: c#, работа, советы
Комментарии (1)
Загадка. Что напечатает следующий отрывок кода на языке си#?
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, работа
Написать комментарий
class Poo : Exception
{
}
// ...
throw new Poo();
Редакция от 15 октября 2009
Тэги: c#, fun
Написать комментарий
Казалось бы, задача проще некуда, из тех, что сможет сделать даже студент-первокурсник. Но нет.
Мы с паре с моим непосредственным начальником разрабатывали участок кода, связанный с отрисовкой изображения. В какой-то момент возникла необходимость построить по двум точкам прямоугольник со сторонами, параллельными осям. Понятно, что для этого нужно проверить, что пары 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)
В текстовых полях, предназначенных для ввода имён файлов, в Windows, как правило, включено автодополнение, позволяющее быстро ввести имя файла с клавиатуры, не боясь ошибиться.
Для реализации аналогичной функциональности в .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:
Редакция от 15 октября 2009
Тэги: c#, screenshots, советы
Написать комментарий
С «решарпером» программирование стало напоминать тетрис. Перейти к нужному слову, Alt+Enter, выбрать нужную опцию, подумать, повторить. Набирать вслепую я не могу, но на стрелки, Alt и Enter попадаю не глядя.
Редакция от 15 октября 2009
Тэги: c#, visual studio, работа
Написать комментарий
Впечатлился возможностями сабжа и решил что-нибудь накорябать. Первый кандидат, конечно же, Jack-in-the-Box, тем более что я и так на него убил порядочно времени. Можно и ещё кое-что придумать.
Редакция от 21 марта 2010
Тэги: c#, todo
Написать комментарий