Вот такой фрагмент кода на 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
Написать комментарий