Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Как перевести текст из одной раскладки в другую (“Home” --> “Рщьу”)

Есть слово на английском Home его нужно перевести в слово Рщьу
Т.е. перевести из английской раскладки в русскую. Понятно, что для двух раскладок можно составить словарь перевода.
Есть ли готовые инструменты для нескольких раскладок?
Например для следующих переводов:
EN > RU
RU > EN
ES > EN
EN > ES
JA > EN
ZH > EN
AR > EN


Ответ

Можно попробовать сделать так:
[DllImport("user32.dll")] public static extern int ToUnicode(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] StringBuilder receivingBuffer, int bufferSize, uint flags);
static char GetChar(char key) { bool isUpper = char.IsUpper(key); var buf = new StringBuilder(256); var keyboardState = new byte[256];
ToUnicode((uint)char.ToUpper(key), 0, keyboardState, buf, 256, 0); return isUpper ? char.ToUpper(buf[0]) : buf[0]; }
static void Main(string[] args) { var str = "Home";
for (int i = 0; i < str.Length; i++) { Console.Write(GetChar(str[i])); } }
Для русского языка выведет: Рщьу

Изогнутый Progress Bar c# WPF

Ребят, подскажите как сделать полукруглый прогресс бар? С обычным вообще не возникает проблем. Находил только больно уж сложные, круглые примеры


Ответ

Просто тут и не будет, придется помудрить с геометрией.
Ну что ж, давайте создадим UserControl, я назвал его MyProgress
Рисовать будем с помощью Path. Контрол будет состоять из двух Path - закрашенного и незакрашенного (закрашенного другим цветом). Для упрощения расчетов я взял эллипс с радиусами 100 и центром в точке (100,100).
Нам нужно нарисовать 2 луча из центра и дугу:

Точку я рассчитал для варианта 75% заполненности, вот что уже получается:
Теперь из этого сектора нужно вырезать круг меньшего диаметра, сделаем это с помощью CombinedGeometry в режиме Exclude


Теперь аналогично рисуем вторую часть другим цветом:


С разметкой пока всё, останется только привязать координаты рассчитанной точки в ArcSegment
Займемся кодом контрола:
Свойство зависимости Value
public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(MyProgress), new FrameworkPropertyMetadata(OnValueChanged));
Вспомогательное свойство зависимости с координатами точки дуги:
protected static DependencyProperty AuxiliaryPointProperty = DependencyProperty.Register("AuxiliaryPoint", typeof(Point), typeof(MyProgress));
Стандартные оболочки для этих свойств:
public double Value { get => (double)GetValue(ValueProperty); set => SetValue(ValueProperty, value); }
protected Point AuxiliaryPoint { get => (Point)GetValue(AuxiliaryPointProperty); set => SetValue(AuxiliaryPointProperty, value); }
Ну и, наконец, метод, который будет пересчитывать координаты точки при смене Value
static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var myProgress = (MyProgress)d; var value = (double)e.NewValue; var angle = Math.PI * value / 100; var x = 100 - 100 * Math.Cos(angle); var y = 100 - 100 * Math.Sin(angle); myProgress.AuxiliaryPoint = new Point(x, y); }
Теперь в разметке привяжемся к рассчитанной точке:
Point="{Binding ElementName=myProgress, Path=AuxiliaryPoint}"
Это нужно сделать для обоих ArcSegment
В разметке я дал имя контролу для упрощения кода привязки:

Всё. Это уже минимально рабочий прогрессбар, который можно добавить в окно:

Выглядит так:

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

MyProgress.xaml.cs
using System; using System.Windows; using System.Windows.Controls;
namespace WpfProgress { public partial class MyProgress : UserControl { public MyProgress() { InitializeComponent(); }
public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(MyProgress), new FrameworkPropertyMetadata(OnValueChanged)); protected static DependencyProperty AuxiliaryPointProperty = DependencyProperty.Register("AuxiliaryPoint", typeof(Point), typeof(MyProgress));
static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var myProgress = (MyProgress)d; var value = (double)e.NewValue; var angle = Math.PI * value / 100; var x = 100 - 100 * Math.Cos(angle); var y = 100 - 100 * Math.Sin(angle); myProgress.AuxiliaryPoint = new Point(x, y); }
public double Value { get => (double)GetValue(ValueProperty); set => SetValue(ValueProperty, value); }
protected Point AuxiliaryPoint { get => (Point)GetValue(AuxiliaryPointProperty); set => SetValue(AuxiliaryPointProperty, value); } } }

Раз UserControl несемантично, я сделал стиль (благодаря помощи @VladD) для ProgressBar. Потом решил добавить возможность редактирования внутреннего радиуса из разметки. Но аттачед проперти, меняющее поведение контрола, тоже несемантично, поэтому в итоге остановился на Custom Control, наследованном от ProgressBar
Идея используется та же, что описана в решении выше, но теперь контрол доработан полностью (наверное), поэтому разметка усложнилась из-за кучи привязок, а также из-за реализованного режима Indeterminate
Для тех, кто хочет создать такой контрол - добавьте в проект Add - New Item - Custom Control WPF, я назвал его SemicircleProgressBar, код самого контрола предельно прост - добавлено одно свойство зависимости:
public class SemicircleProgressBar : ProgressBar { static SemicircleProgressBar() { DefaultStyleKeyProperty.OverrideMetadata(typeof(SemicircleProgressBar), new FrameworkPropertyMetadata(typeof(SemicircleProgressBar))); }
public static DependencyProperty CuttingFactorProperty = DependencyProperty.Register(nameof(CuttingFactor), typeof(double), typeof(SemicircleProgressBar), new FrameworkPropertyMetadata(0.8));
public double CuttingFactor { get => (double)GetValue(CuttingFactorProperty); set => SetValue(CuttingFactorProperty, value); } }
В появившемся файле Generic.xaml в папке Themes в корне проекта разметим стиль нового контрола:


Конвертеры. ValueToAuxiliaryPointConverter
class ValueToAuxiliaryPointConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values.Contains(DependencyProperty.UnsetValue)) return DependencyProperty.UnsetValue; var v = (double)values[0]; var min = (double)values[1]; var max = (double)values[2]; var r = (double)values[3]; var ratio = (v - min) / (max - min); var angle = Math.PI * ratio; var x = 1 - r * Math.Cos(angle); var y = 1 - r * Math.Sin(angle); return new Point(x, y); }
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
RadiusToSizeConverter
class RadiusToSizeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var r = (double)value; return new Size(r, r); }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
Код для демонстрации:






Использована информация из этого ответа

Средства и методы нахождения ошибок в коде их исправления. Сборник

Этот вопрос, по аналогии с вопросом Книги и другие материалы для обучения, предназначен для того, чтобы в единственном общем ответе собрать ссылки на вопросы-ответы по методам поиска, нахождения и исправления ошибок в коде.
В вопросы, перечисленные ниже в списке МОЖНО и нужно добавлять еще ответы!
Метки пишем в алфавитном порядке.

Люди смогут использовать его для выявления схожих проблем в различных технологиях.
Также удобно использовать в качестве списка эталонных вопросов, на которые можно сослаться при мелких несущественных ошибках и, возможно, закрывать вопросы как дубликат, если они о таких вещах как:
"Что не так в коде?" "Где у меня ошибка?" "Почему программа не работает?" и подобные


Ответ

Общие практики и советы
Какие есть способы предупреждения ошибок, их нахождения и устранения?
Список по языкам
c# Как и какими средствами находить ошибки в коде на C#? java Как и какими средствами находить ошибки в коде Java? javascript Как и какими средствами находить ошибки в Javascript коде? php Как и какими средствами находить ошибки в PHP коде? css Что делать, если не работает css-класс

вторник, 22 января 2019 г.

Как увеличить зону клика ссылки?

Использую ползунок (input type range).Дело в том, что по макету он в 1px и все идеально, только вот кликнуть по нему очень сложно, надо попасть в этом самый 1px. Можете, пожалуйста, посоветовать как увеличить его зону?


Ответ

Без кода, могу предложить добавить невидимый before(подкрасила цветом, чтобы видно было область, вам этот цвет просто убрать нужно):
.link { position: relative; display: block; margin:50px auto; height: 1px; width: 1px; background: pink; cursor: pointer; } .link:before { content: ''; position: absolute; display: block; top: -15px; left: -15px; right: -15px; bottom: -15px; background: rgba(255, 0, 0, 0.06);//цвет убрать }

Обработка множественных запросов на RxJava

Есть поле для вводе текста, допустим ищем пользователей по имени в БД. Есть метод (упрощенный), который выполняется при каждом наборе символа.
public void loadUsers(){ getUsers(mName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }
Проблема данного метода в том, что при быстром наборе текста вполне вероятна ситуация, когда ответ на предпоследний запрос пришел позже, чем на последний. Тогда отображаемые данные будут не соответствовать введенному тексту. Вопрос: как обработать запросы в том порядке, в котором выполнялись? Или, может быть, можно игнорировать предыдущие запросы? P.S. С использованием RxJava.


Ответ

Как вариант можно хранить Subscription и её сначала обнулять, а потом новый запрос слать. Типа как-то так (за названия методов не ручаюсь):
Subscription s;
public void loadUsers() { if(s != null && !s.isUnsubscribed()){ s.unsubscribe(); } s = getUsers(mName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }

Посчитать количество элементов в jquery?

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

1
2
3


Ответ

$('.blocks .section').each(function(index, element){ $(this).attr('data-block', index); $('.navigation').append('

  • Блок '+$(element).html()+'
  • ') }); $(document).on('click', '.navigation .scrollto', function(){ var block_id = $(this).attr('data-block'), block = $('[data-block="'+block_id+'"]:not(.scrollto)'); if (block.offset() !== undefined){ $('html, body').animate({ scrollTop: block.offset().top }, 1000, 'swing', function(){ // здесь код если надо что-то делать после прокрутки }); } return false; });
    1
    2
    3

    В данном случае не обязательно подсчитывать. Достаточно просто для каждого блока вставлять ссылку, т.е.
    $('.blocks .section').each(function(index, element){ $('.navigation').append('
  • Блок '+$(element).html()+'
  • ') });

    Обобщённый метод для чтения данных из файла

    Здравствуйте. Подскажите, как написать обобщённый метод чтения данных из файла. Например, в одном случае нужно считать строки, в другом - целые числа. Как написать метод типа такого:
    public static List readFromFile(Path pathIn, TypeValue typeValue){...};
    Корректен ли такой код:
    public static List readFromFile(Path pathIn, TypeValue typeValue){ try(Scanner in = new Scanner(pathIn)) { if (typeValue == TypeValue.typeInt) { List list = new ArrayList<>(); while (in.hasNextInt()) { list.add(in.nextInt()); } return list; } else { List list = Files.readAllLines(pathIn); return list; } } catch (IOException e){ return null; } }
    Здесь pathIn - путь к файлу с данными, typeValue - флаг для обозначения данных (Integer, String и т.д.). Смущает, что возвращается не параметризованный List. Как вообще решается задача чтения из файла, если формат данных может быть разным - Integer, Double, String и т.д.? Или следует писать для каждого типа данных свой код для чтения? Как-то громоздко тогда получается.


    Ответ

    Функционал из Java 8 Stream & Lambda позволяет передавать в метод функциональный интерфейс, который будет применен к потоку данных:
    public void start() throws IOException { Path path = Paths.get("test"); List resultStringList = readFile(path, Function.identity()); List resultIntList = readFile(path, Integer::parseInt); }
    public List readFile(Path path, Function func) throws IOException { return Files.lines(path) .map(func) .collect(Collectors.toList()); }
    }