Поиск по этому блогу

среда, 21 ноября 2012 г.

WPF Бегущая строка

Новая задача - сделать бегущую строку в WPF приложении. Делается очень просто через XAML.
Значения From и To задаются исходя из размера окна программы + длина текста(в 2 раза больше окна).


Canvas x:Name="Canvas" Background="Transparent" Height="25"
                VerticalAlignment="Top">
            <TextBlock Margin="0,7,0,0" VerticalAlignment="Bottom" FontSize="15"  FontWeight="Bold" Foreground="#555"
                       Text="Тестовый текст" Canvas.Right="0">
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="1300" To="-750" 
                                                     Duration="0:0:15" RepeatBehavior="Forever"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Canvas>

среда, 3 октября 2012 г.

WPF file explorer часть 2

В продолжение создания файлового менеджера на WPF. Сегодня решил немного улучшить программу  и добавил несколько функций:

  • открытие выделенного файла в списке
  • копирование выделенного файла в списке (копирование из одной папки в другую)
  • удаление выделенного файла в списке (удаление файла из папки)
  • выделение всех файлов в списке


Открытие


private void Open_selectItem(object sender, RoutedEventArgs e)
        {
            FileInfo filinf = listBox1.SelectedItem as FileInfo;
            try 
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filinf.FullName;
                p.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }

вторник, 17 июля 2012 г.

Изменяем TabControl через XAML

Занялся изменением внешнего стиля TabControl. Хотелось сделать угловатые закладки как в Expression Blend 4(в самой программе) или как в Google Chrome. Есть некоторые НЕДОРАБОТКИ, но всё вполне функционирует.  Единственное неудобство - GRID в TabItem автоматичесски подстраивается под содержимое. Для начала поискал пару примеров, в общем вот что получилось.
Всё запихиваем в <Windows.Resurces>


<Style TargetType="{x:Type TabItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Margin="0,0,-12,0">
                            <!--Самостоятельная проба создать вкладки-->
                            <Border Name="Border" Background="Transparent" BorderBrush="Transparent"
                                    BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" />
                            <Path Name="Blablabla" Data="M0.5,3.5 C0.5,1.8431458 1.8431458,0.5 3.5,0.5 L46.5,0.5 C48.156854,0.5 75.082788,25.5 70.333333,25.5 65.583878,25.5 0.75000088,25.249498 0.5,25.583056 0.24999912,25.916615 0.5,10.944442 0.5,3.5 z" 
              Fill="Black" HorizontalAlignment="Left" Height="26.089" Stretch="Fill" Stroke="White" 
              VerticalAlignment="Bottom"  Width="110"/>
                            <ContentPresenter x:Name="ContentSite" TextElement.Foreground="White" ContentSource="Header" VerticalAlignment="Center"
                                              HorizontalAlignment="Center" Margin="0,0,18,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="Orange" />
                                <Setter Property="Panel.ZIndex" Value="100" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter TargetName="ContentSite" Property="TextElement.Foreground" Value="White"/>
                                <Setter TargetName="Border" Property="Background" Value="Transparent"/>

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

понедельник, 2 июля 2012 г.

Как вытащить путь до файла через ярлык

Изначально я просто решил опробовать Drag and drop в WPF и Win Form. Сделал окошко, где был ListBox, сделал так, чтобы в него можно было перетащить файлы. В ListBox'e показывался путь до этого файла, то есть то место, откуда я  перетащил файл. Потом появилась идея каким - то образом заставить программу выдавать путь до файла, в моём случае через ярлык, узнать, где установлена программа. В общем, нашёлся такой путь решения.
GetFullPath используется как метод-функция.

 // Таким образом узнаем путь до файла, через ярлык
        string GetFullPath(FileInfo file)
        {
            // проверяем, является ли файл ярлыком
            if (file.Extension == ".lnk")
            {
                using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fstream))
                    {
                        fstream.Seek(0x14, SeekOrigin.Begin);
                        var flags = reader.ReadUInt32();
                        if ((flags & 0x01) == 1)
                        {
                            fstream.Seek(0x4c, SeekOrigin.Begin);
                            var itemIdLength = reader.ReadUInt16();
                            fstream.Seek(itemIdLength, SeekOrigin.Current);
                        }
                        var start = fstream.Position;
                        var length = reader.ReadUInt32();
                        fstream.Seek(0x0c, SeekOrigin.Current);
                        var offset = reader.ReadUInt32();
                        fstream.Seek(start + offset, SeekOrigin.Begin);
                        return new string(reader.ReadChars((int)(start + length - fstream.Position)));
                    }
                }
            }
            else
                return file.FullName;
        }

суббота, 16 июня 2012 г.

WPF clock

Ещё одни электронные часы, только теперь на WPF. Всё делается намного прощё, хотя впринципе и в Win Form можно было бы сделать так же.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace MyTimer
{
       
       /// 
       /// Interaction logic for MainWindow.xaml
       /// 
       
       
       public partial class MainWindow : Window
       {
              DispatcherTimer timer;
              
              public MainWindow()
              {
                     this.InitializeComponent();

                     timer = new DispatcherTimer();
                     timer.Interval = TimeSpan.FromSeconds(1.0);
                     timer.Start();
                     timer.Tick += new EventHandler(delegate(object s, EventArgs a)
        {
                     
                       tb.Text = "" + DateTime.Now.Hour +":"
                     + DateTime.Now.Minute +":"
                     + DateTime.Now.Second;
              
         
        });
              }
                     
       }
}

четверг, 31 мая 2012 г.

Электронные часы

Мне нравится писать программы по чьи-то примерам. Я так быстрее учусь программировать. Недавно писал простенький файловый менеджер, исходник которого был для консольного приложения. Немного поэксперементировав, я смог его сделать в Win Form. Что касается электронных часов - это первая программа, которую я вообще хотел написать. И вот ещё один вариант таких часов, но уже с использованием потоков.

четверг, 24 мая 2012 г.

Программа сама себя копирует

После пересмотра Железного человека задался вопросом, а как заставить программу саму себя скопировать куда - либо (в другое место). Задача стояла так - нужно либо ввести в консоль команду,  либо нажать кнопку, чтобы программа выполнила копирование самой себя в другую папку. Вот в принципе 2 варианта решения этой задачи. Один вариант сделан на основы одной из программ, которую я уже выкладывал.
Вот первый (здесь нужно вставить названия папки, чтобы программа знала куда копироваться):

            // Полный путь к программе.
            string currentAssembly = Assembly.GetExecutingAssembly().Location;
            // Название файла программы.
            string fileName = Path.GetFileName(currentAssembly);
            // Папка назначения.
            string destinationDirectory = Path.Combine(Directory.GetCurrentDirectory(), "copy");
            // Проверяем, есть ли директория, если нет - создаём.
            if (!Directory.Exists(destinationDirectory))
                Directory.CreateDirectory(destinationDirectory);
            // Копируем в заданную папку, перезаписывая, при необходимости.
            File.Copy(currentAssembly, Path.Combine(destinationDirectory, fileName), true);
            Console.WriteLine("Скопировано.");
            Console.ReadKey();

Вот второй:


        static void Main(string[] args)
        {
            Console.WriteLine("введите команду");
            string command = Console.ReadLine();
            if(command == "копируй себя")
            {
                CopyFolder(@"D:\Working\project\Новая папка\copiesItselfTo",
                    @"d:\__autoSeo_results\copiesItselfTo");
                Console.WriteLine("Копирование завершено");
            }
            Console.ReadLine();
        }
        static public void CopyFolder(string sourceFolder, string destFolder)
        {
            // Directory.Exists - Определяет, указывает ли заданный путь на существующий каталог на диске
            if (!Directory.Exists(destFolder))
                Directory.CreateDirectory(destFolder);
            string[] files = Directory.GetFiles(sourceFolder);
            //Directory.GetFiles - Возвращает имена файлов (с указанием пути к ним) в указанном каталоге
            foreach (string file in files)
            {
                string name = Path.GetFileName(file);
                string dest = Path.Combine(destFolder, name);
                File.Copy(file, dest);
            }
            string[] folders = Directory.GetDirectories(sourceFolder);
            foreach (string folder in folders)
            {
                string name = Path.GetFileName(folder);
                string dest = Path.Combine(destFolder, name);
                CopyFolder(folder, dest);
            }
        }

воскресенье, 20 мая 2012 г.

Перемешивание списка

Иногда бывает нужно перемешать(отсортировать) определённый список или массив данных в случайном порядке.
Вот один вариант решения данной задачи:

    class Randoming
    {
        public static void MixList<t>(IList<t> list) 
        {
            Random r = new Random();
            //Создаем сортируемый список и набиваем в него значения из 
            //целевого списка. Тип SortedList устроен так, что при добавлении 
            //нового элемента, он (элемент) помещается не в конец списка 
            //элементов, а между ними, обеспечивая моментальную автоматическую 
            //сортировку списка
            SortedList<int, t> mixedList = new SortedList<int, t>();
            //заполняем список
            foreach (t item in list)
                mixedList.Add(r.Next(), item);

            list.Clear();
            for (int i = 0; i < mixedList.Count; i++)
            {
                list.Add(mixedList.Values[i]);
            }  
        }
    }
        
static void Main(string[] args)
        {
            Console.WriteLine("Сейчас будет рандомная сортировка");
            List<string> myList = new List<string>();
            //List<string> result = new List<string>();
            for (int i = 0; i < 50; i++)
                myList.Add(i.ToString());
            Randoming.MixList(myList);
            foreach(var ml in myList)
            {
                //result.Add(ml);
                Console.WriteLine(ml);
            }
            //Console.WriteLine(result);
            Console.ReadLine();
        }

Получаем исходный код страницы

Код не мой, просто нашёл пример, который мне понравился. Вот решил добавить его себе в блог, вдруг пригодится когда - нибудь. По мере изучения исходника программы, понял, что не так и сложно это было написать самому. Но ввиду того, что я не так долго занимаюсь программированием - стараюсь находить, в основном готовые программы, чтобы покапаться в их коде. Сам пишу пока что простенькие программы.
Для начала кидаем на форму две кнопки, один текст бокс(называем его urlTextBox ) и один  richTextBox1. Размещаем это по форме как угодно.
Задача - получить исходный код страницы.
Вот реализация:

        private void button1_Click(object sender, EventArgs e)
        {
            //Программа достаёт исходный код страницы
            //создаём строку url,в которой будем указывать адресс сайта
            string url = urlTextBox.Text;
            //Создаём объект , который будет выполнять запрос к URI(идентификатор ресурса)
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            //GetResponse - возвращает ответ на интернет-запрос
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //Реализуем считывание символов из потока байтов в определенной кодировке.
            //GetResponseStream -  возвращает поток данных из  интернет-ресурса
            StreamReader sr = new StreamReader(response.GetResponseStream());
            //Читаем поток от начала до конца
            richTextBox1.Text = sr.ReadToEnd();
            //закрываем поток
            sr.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //очишаем поле
            richTextBox1.Clear();
        }

пятница, 18 мая 2012 г.

Быстрая сортировка

Решил уделить больше внимание различным сортировкам на C#. Первая, которую решил осуществить  -  Quick Sort (Быстрая сортировка). Один из быстрых известных универсальных алгоритмов сортировки массивов. Суть алгоритма:
  • из массива выбирается элемент. Как правило, в качестве этого элемента берется центральный элемент массива. 
  • остальные элементы распределяются таким образом, чтобы слева  оказались все элементы, меньшие или равные опорному элементу. Элементы, большие или равные опорному элементу, помещаются справа. 

вторник, 15 мая 2012 г.

Шифр Цезаря

Вот решил на C# написать самостоятельно реализацию шифра Цезаря. Ничего сверхъестественного или сложного не пытался написать. Поэтому реализация получилась очень простой.
Шифр Цезаря, также известный как шифр сдвига, код Цезаря или сдвиг Цезаря — один из самых простых и наиболее широко известных методов шифрования.
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется буквой находящейся на некоторое постоянное число позиций левее или правее него в алфавите. Например, в шифре со сдвигом 3, А была бы заменена на Г, Б станет Д, и так далее.
Пока заставил программу только шифровать, похже добавлю дишифровку.

            Console.WriteLine("Введите слово,которое нужно зашифровать:");
            string s = Console.ReadLine();
            string abc = "abcdefghijklmnopqrstuvwxyz";
            //abc наш алфавит
            Console.WriteLine("Укажите длину сдвига");
            int len = Convert.ToInt32(Console.ReadLine());
            // len  - число сдвигов в сторону
            int a;
            string code = string.Empty;
            for (int i = 0; i < s.Length; i++)
            {
                a = i + len;
                code += abc[a];
            }
            Console.WriteLine(code);
            Console.ReadLine();

пятница, 11 мая 2012 г.

Подсчёт повторных вхождений символов

Задача: написать программу, которая будет подсчитывать сколько раз тот или иной символ повторялся в ведённом предложении. Для решения задачи использовалось регулярное выражение.
Как работает:
  1. вводится предложение
  2. создаётся массив чаров, куда конвертируется это предложение
  3. создаётся массив List
  4. запускается цикл по длине введённого предложения
  5. создаём 2 переменные - одна счётчик, другая равна букве из предложения
  6. проверяем символ на соответствие букве или цифре
  7. если это буква или цифра, то записываем в List
  8. подсчитываем вхождение каждого символа.


            Console.Write("Введите предложение: ");
            string sentence = Console.ReadLine();
            char[] arr_chr = sentence.ToCharArray();
            List<char> charList = new List<char>();
            for (int i = 0; i < sentence.Length; i++)
            {
                char chr = arr_chr[i];
                int includes = 0;
                //это проверка, что символ буква
                // Regex.IsMatch - Указывает, обнаружено ли в указанной входной строке соответствие 
                //заданному регулярному выражению
                if (Regex.IsMatch(chr.ToString(), @"[а-я]|[А-Я]|[A-Z]|[a-z]|[0-9]+$") && !charList.Contains(chr))
                {
                    charList.Add(chr);
                    for (int j = 0; j < sentence.Length; j++)
                        if (chr == arr_chr[j])//подсчитываем вхождения каждого символа
                            includes++;
                    Console.Write(chr.ToString() + "=" + includes + "\t");
                }
            }
            Console.ReadKey(true);

пятница, 4 мая 2012 г.

Получение информации о ПК

Собрал несколько исходных кодов для получения информации о ПК в консольном приложении.
В коде присутствует System.Management. Чтобы его добавить нужно пройти в Solution Explorer, найти там в списке своей программы References, нажать правой кнопкой мыши ->Add->выбрать NET и найти там  System.Management.
В общем сами коды:

Список всех активных процессов в системе

ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
           "Select Name, CommandLine From Win32_Process");

            foreach (ManagementObject instance in searcher.Get())
            {
                Console.WriteLine("{0}", instance["Name"]);
            }
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey();

четверг, 3 мая 2012 г.

Копирование папки и файлов

Задача: скопировать папку и все файлы, которые находятся в ней.
Решение:

static void Main(string[] args)
        {
            
            CopyFolder( @"d:\__autoSeo_results\temptest", @"d:\__autoSeo_results\tempout" );
            Console.ReadLine();
        }    
        static public void CopyFolder( string sourceFolder, string destFolder )
        {
            // Directory.Exists - Определяет, указывает ли заданный путь на существующий каталог на диске
            if (!Directory.Exists( destFolder ))
                Directory.CreateDirectory( destFolder );
            string[] files = Directory.GetFiles( sourceFolder );
            //Directory.GetFiles - Возвращает имена файлов (с указанием пути к ним) в указанном каталоге
            foreach (string file in files)
            {
                string name = Path.GetFileName( file );
                string dest = Path.Combine( destFolder, name );
                File.Copy( file, dest );
            }
            string[] folders = Directory.GetDirectories( sourceFolder );
            foreach (string folder in folders)
            {
                string name = Path.GetFileName( folder );
                string dest = Path.Combine( destFolder, name );
                CopyFolder( folder, dest );
            }
        }

Перебор символов

Как - то читал статью по брутфорсу и задумался: "А как делать перебор символов?" Долго искал примеры, но они были очень громоздки, и мне их было сложно понять. Вот на днях нашёл более простой пример. Программа последовательно перебирает все возможные комбинации символов и выводит их на экран.


public static IEnumerable EnumLetter(string alphabet)
        {
            foreach (char a in alphabet)
                yield return "" + a;
        }
        public static IEnumerable EnumWord(IEnumerable child, string alphabet)
        {
            foreach (string a in child)
                foreach (string b in EnumLetter(alphabet))
                    yield return "" + a + b;
        }
        static void Main(string[] args)
        {
            
            
            const string alphabet = "abcdefghijklmnopqrstuvwxyz";
            int length = 5;

            IEnumerable list = EnumLetter(alphabet);
            for (int i = 0; i < length - 1; i++)
                list = EnumWord(list, alphabet);
            foreach (string a in list)
                Console.WriteLine(a);
        }
Смысл такой - есть строка "ааааа", программа начинает перебирать символы с последнего символа в этой строке. Т.е. было "ааааа", стало "ааааб", затем "аааав" и так делее. Перебираются все символы в строке.

Получить список избранных ссылок

Нашёл пример как вывести на консоль список избранных ссылок из папки Favorite. Т.е. выводит список ссылок, которые мы сохранили в избранное в Internet Explorer.
Сам код:


const string urlConst = "URL=";
            //указываем путь до папки Избранное
            string pathFavorites = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
            // Получаем список всех файлов, включая файлы в подпапках
            foreach (String favorite in Directory.GetFiles(pathFavorites, "*", SearchOption.AllDirectories))
            {
                using (StreamReader file = new StreamReader(favorite))
                {
                    while (!file.EndOfStream)
                    {
                        string line = file.ReadLine();

                        if (line.StartsWith(urlConst))
                        {
                            string url = line.Substring(urlConst.Length);
                            string name = Path.GetFileNameWithoutExtension(favorite);
                            Console.WriteLine("NAME='{0}', URL = '{1}'", name, url);
                            break;
                        }
                    }
                }
            }
            Console.ReadKey();

воскресенье, 29 апреля 2012 г.

Про System.IO.Path

Класс .NET System.IO.Path имеет множество статических методов для работы с файлами и путями, которые должны облегчить жизнь)


// Объединяет компоненты имени и пути в один путь
string fullPath = Path.Combine(workingDirectory, fileName);

//если у вас есть полное имя файла, содержащее путь,
string fullPath = "c:\\Downloads\\output\\t0.html";
 
// возвращает "c:\"
string pathPart = Path.GetPathRoot(fullPath);
 
// возвращает "t0.html"
string filePart = Path.GetFileName(fullPath);
 
// возвращает ".html"
string extPart = Path.GetExtension(fullPath);
 
// возвращает "c:\downloads\output"
string dirPart = Path.GetDirectoryName(fullPath);

Генератор паролей на основе RNGCryptoServiceProvider

Увидел в одном блоге, интересный пример генератора паролей. Мне лично такие варианты ещё не попадались. Вот  решил его разместить у себя в блоге.
На форму нужно кинуть Label, 2 TextBox'a, 1 Buttom. Размещаем в любом порядке, а дальше код.


private void button1_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(textBox1.Text) < 35)
            {
                try
                {
                    //try говорит о ошибке в определённом куске, чтобы её отловить
                    // Вызов функции или выполнение каких-то иных
                    // действий, которые могут генерировать исключение
                    textBox2.Clear();
                    byte[] temp = Generator.RollDice(Convert.ToInt32(textBox1.Text));
                    for (int i = 0; i < temp.Length; i++)
                    {
                        textBox2.Text += (char)temp[i];
                    }
                }
                catch (Exception ex)
                {
                    //catch - выводит сообщение о ошибке возникшей в try
                    // Сюда управление передается в случае, когда в блоке
                    // try сгенерировано исключение — в самом ли блоке, в
                    // функции, которая в нем вызывается, в функции,
                    // которая вызывается функцией, вызванной в try-блоке
                    // и так далее — словом, где угодно. Объект Exception
                    // описывает ошибку
                    MessageBox.Show(ex.Message);
                }
            }
            else
                MessageBox.Show("Введите число меньше 35!!!");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //по умолчанию в текстбоксе будет стоять значение 16
            textBox1.Text = "16";
        }

Подключение новой формы

Нашёл в инете пример как подключить новую (вторую форму или третью и тд.). Нужно, когда программа подразумевает несколько окон (форм).
P.s. Я понимаю, что это  можно прочесть на MSDN, но проще иметь такие вещи под рукой, а не искать. (у меня лично трудности с поиском на MSDN)


private void button1_Click(object sender, EventArgs e)
{
 Form2 f2 = new Form2(); // создаем
 f2.ShowDialog(); // показываем
}

среда, 25 апреля 2012 г.

Класс Stopwatch

Stopwatch() - предоставляет набор методов и средств, которые можно использовать для точного измерения затраченного времени. На http://msdn.microsoft.com/ предоставляется вот такой вариант. С помощью этого кода можно определить время работы какого-либо приложения. Если его прописать в это приложение (программу).

Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        TimeSpan ts = stopWatch.Elapsed;

        
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);

P.s. В Windows Forms не работает, когда паралельно используется Timer.




Складывание значений переменной

Задача: есть переменная, в которой есть несколько цифр (например - 78654433), их нужно сложить вместе.
Сначала разбиваем переменную на чары, а потом их складываем в массив и суммируем)


public static void Main()
    {
        int source = 78654433;
 
        char[] sourceChars = source.ToString().ToCharArray();
 
        List<int> nums = new List<int>();
 
        foreach (char s in sourceChars)
        {
            nums.Add(Convert.ToInt32(s.ToString()));
        }
 
        int result = nums.Sum();
 
        Console.WriteLine(result.ToString());
 
        Console.ReadKey();
    }

Сортировка символов в строке

Нашёл пример, как рассортировать строку так, чтобы сначала шли большие буквы, а за ними маленькие.

string s = "aSdFgHjKlOiUyYT";
        s = string.Concat(s.OrderBy(Char.IsLower));
        Console.WriteLine(s);

Удаление повторяющегося символа из массива

Данный код удаляет все повторяющиеся символы из массива, а потом перезаписывает результатт в новый массив.

static void Main()
        {
            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 4, 6, 8, 9, 0 };
            var newlist = new List<int>(list.Distinct());
            foreach (var i in newlist)
            {
                Console.WriteLine(i);
            }
        }

вторник, 24 апреля 2012 г.

Повторяющаяся цифра

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


int[] mas = new int[10];
            string s = Console.ReadLine();
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] >= '0' & s[i] <= '9')
                {
                    int n = Int32.Parse(s[i].ToString());
                    mas[n]++;
                }
            }
            int max = 0;
            int no = 0;
            for (int i = 0; i < 10; i++)
                if (mas[i] > max)
                {
                    no = i;
                    max = mas[i];
                }
            Console.WriteLine("Макс часто встречается: " + no);
            Console.ReadKey();

Пояснение к строкам
int n = Int32.Parse(s[i].ToString());
mas[n]++;

в N ложится число
В массиве с индексом N увеличивается значение на 1

Вот как - то так! 

понедельник, 23 апреля 2012 г.

Запрос пароля

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

воскресенье, 22 апреля 2012 г.

Регулярные выражения в C# часть 3

Проверка имени файла и его расширение

^(([A-Za-z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+  
    (.psd|.png|.tif|.bmp|.gif|.jpg|.jpeg)$  


^(([A-Za-z]:)|(\\{2}\w+)\$?)(.*)+  
    (.psd|.png|.tif|.bmp|.gif|.jpg|.jpeg)$ 

Проверка url

^(http|https)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}  
    (:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$  

или

http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?  


Проверка емэйла



[.\\-_a-z0-9]+@([a-z0-9][\\-a-z0-9]+\\.)+[a-z]{2,6}
или
^['\\w_-]+(\\.['\\w_-]+)*@['\\w_-]+(\\.['\\w_-]+)*\\.[a-zA-Z]{2,6}$  
или
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*


Регулярные выражения в C# часть 2

Продолжение темы. Пара дополнений + пара примеров.

Классы пространства имен System.Text.RegularExpressions

Capture - Представляет результаты из отдельной записи части выраже-
ния. Capture представляет одну подстроку для отдельной успешной записи.

CaptureCollection - Представляет последовательность подстрок записи.

CaptureCollection возвращает набор записей, сделанных одной группой записи.

Group - Group представляет результаты отдельной группы записи.
Группа записи может записать ноль, одну или более строк в одно совпадение из-за кванторов, таким образом Group предоставляет коллекцию объектов Capture.

GroupCollection - Представляет коллекцию групп записи. GroupCollection возвращает набор групп записи в одном совпадении.

Match - Представляет результаты из отдельного совпадения регулярного выражения.

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

Regex - Представляет постоянное регулярное выражение.

RegexCompilationInfo - Представляет сведения о регулярном выражении, используемые для компиляции регулярного выражения в отдельную сборку.

RegexRunner - Класс RegexRunner является базовым классом для скомпилированных регулярных выражений.

RegexRunnerFactory - Создает класс RegexRunner для скомпилированного регулярного выражения.


Регулярные выражения в C# часть 1

Регулярные выражения предоставляют мощный, гибкий и эффективный метод обработки текста. Обширные возможности сопоставления шаблонов, предоставляемые регулярными выражениями, позволяют быстро анализировать большие объемы текста, отыскивая в них определенные символьные шаблоны, проверять текст на соответствие определенным заранее шаблонам (например, формату адреса электронной почты), извлекать, изменять, заменять или удалять подстроки текста, а также добавлять извлеченные строки в коллекцию для формирования отчетов.
Ну это выписка с http://msdn.microsoft.com/ru-ru/library/hs600312.aspx.
Цель данного поста - записать для себя памятку по регулярным выражениям в C#. Постараться найти и записать примеры реализации регулярных выражений + объяснение, что они делают.

четверг, 19 апреля 2012 г.

Шаблон проектирования

На одном сайте нашёл вот такой интересный проект. На примере Макдональдса показывается как нужно конструировать программу.
На таких примерах и стараюсь нацчиться программировать)))
Цитата с того сайта.
А теперь, чтобы лучше понять суть паттерна Builder, рассмотрим практический пример, в котором вы будете собирать объект HappyMeal — знаменитый детский набор, предлагаемый в сети закусочных McDonald’s. В первом случае вы соберете бюджетный вариант HappyMeal (маленькая порция пепси-колы, гамбургер, картошка и игрушка), а во втором — BigHappyMeal (гамбургер вы замените на бигмак и увеличите порцию напитка).
И сам код программы:

class HappyMeal
 
  {
 
    // содержит информацию о  составе HappyMeal
 
    ArrayList parts = new ArrayList();
 
    // Добавляете информацию  о новой составной части
 
    public void Add(string part)
 
    {
 
      parts.Add(part);
 
    }
 
    // Выводите информацию о  всем наборе
 
    public void Show()
 
    {
 
      Console.WriteLine(" Happy Meal Parts ——-");
 
      foreach (string part in parts)
 
      Console.WriteLine (part);
 
    }
 
  }


среда, 18 апреля 2012 г.

Кнопка STOP

Иногда нужно сделать кнопку, которая останавливала какой-нибудь процесс. (кнопку делал в Win Form' е и WPF) В моём случае я писал генератор случайных последовательностей с бесконечным циклом генерации, мне нужно было остановить генерацию. Самый просто способ создания кнопки Stop:
1 - нужно создать глобальную переменную (булевскую) 

private bool stop = false;

2 - прописать эту переменную перед циклом, который нужно остановить. Пример:

stop = false;
for (int i = 0; i < 10; i++)
            {

                тело цикла
            }

3 - вставить проверку на true или false данной переменной в тело цикла

stop = false;
for (int i = 0; i < 10; i++)
            {

                if (stop == true) break;
            }

4 - сделать кнопку, которая будет изменять значение нашей переменной. Пример:


        private void button2_Click(object sender, RoutedEventArgs e)
        {
            stop = true;
        }

Кнопка готова к работе)

Кнопка очистки всех TextBox' ов на форме в WPF

Задача: на форме есть n - колличество TextBox'ов, их нужно очистить все одновременно нажатием одной кнопки.
Делаем функцию:

void LoopVisualTree(DependencyObject obj)//обнуление текст боксов
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {

                if (obj is TextBox)
                {
                    ((TextBox)obj).Text = null;
                }
                // РЕКУРСИЯ
                LoopVisualTree(VisualTreeHelper.GetChild(obj, i));
            }

        }

Потом нажимаем на кнопку на форме 2 раза, чтобы перейти в её обработчик и прописываем там(пример!!!!):

private void button10_Click(object sender, RoutedEventArgs e)
        {
           
            LoopVisualTree(this);
                        
        }

Application.DoEvents в WPF

В Win Form есть матод Application.DoEvents, который обрабатывает все сообщения Windows, которые в данный момент находятся в очереди сообщений.
Но в WPF его нет. Его можно создать сделав вот такой метод:


public static void DoEvents()//Реализация DoEvents в WPF
        {
            if (Application.Current != null)
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
        }

Затем, в тело самой программы просто нужно добавить DoEvents(), и бедет работать так же, как если бы это был  Application.DoEvents в Win Forme.

вторник, 10 апреля 2012 г.

Полезные ссылки

Список полезных ссылок:
  1. http://www.manoli.net/csharpformat/ - форматирование исходного кода, можно шарп вставить в блог через html
  2. surfingbird.ru/  - сайт для поиска информации по личным интересам
  3. http://blogcoding.ru/ - сайт полезных вещей для Blogger
  4. http://qr-coder.net/ - QR генератор
  5. http://android-mobile.ru/qr-code/generator - QR герератор
  6. http://gskinner.com/RegExr/ - для тестирования регулярных выражений

воскресенье, 8 апреля 2012 г.

Пузырьковая сортировка

Приведенная ниже программа демонстрирует, как использовать возможность
манипуляции элементами массива для их сортировки. В программе
применен алгоритм пузырьковой сортировки.
Писал по книжке)

namespace BubbleSort
{
    class Program
    {
        public static void OutputStudentArray(Student[] students) 
        {
            foreach(Student s in students)
            {
                Console.WriteLine(s.GetString());
            }
        }
        static void Main(string[] args)
        {
            Student[] students = new Student[5];
            students[0] = Student.NewStudent("Homer", 0);
            students[1] = Student.NewStudent("Lisa", 4.0);
            students[2] = Student.NewStudent("Bart", 2.0);
            students[3] = Student.NewStudent("Marge", 3.0);
            students[4] = Student.NewStudent("Maggie", 3.5);
            Console.WriteLine("До сортировки");
            OutputStudentArray(students);
            Console.WriteLine("Сортировка");
            Student.Sort(students);
            Console.WriteLine("Вывод отсортированного списка");
            OutputStudentArray(students);
            Console.WriteLine("Нажмите <Enter>");
            Console.ReadLine();
        }
    }
}
namespace BubbleSort
{
    class Student
    {
        public string sName;
        public double dGrade = 0.0;
        public static Student NewStudent(string sName, double dGrade) 
        {
            Student student = new Student();
            student.sName = sName;
            student.dGrade = dGrade;
            return student;
        }
        public string GetString() 
        {
            string s = "";
            s += dGrade;
            s += " - ";
            s += sName;
            return s;
        }
        public static void Sort(Student[] students) 
        {
            bool bRepeatLoop;
            do
            {
                bRepeatLoop = false;
                for (int index = 0; index < (students.Length - 1); index++)
                {
                    if (students[index].dGrade < students[index + 1].dGrade)
                    {
                        Student to = students[index];
                        Student from = students[index + 1];
                        students[index] = from;
                        students[index + 1] = to;
                        bRepeatLoop = true;
                    }
                }
            } while (bRepeatLoop);
        }
    }
}

JavaScript числа Фибоначчи

Начал изучать JavaScript. Потехоньку балаюсь с кодом. Сделал вычисление чисел Фибоначчи.
Вот  код:

<html>
<head>
<p>
Проба чисел фибоначи
</p>
</head>
<body>
<script>
var a, b, c; //создаются 3 переменные
a = 1;
b = 0;
for(var i = 0; i < 20; i++){
//здесь меняем/сдвигаем значения a и b, чтобы получить число из суммы двух предыдущих
c=a+b;
a=b;
b=c;
alert(c);
}
</script>
</body>
</html>

суббота, 31 марта 2012 г.

Число Фибоначчи

Данный код программы реализует последовательность Фибоначчи. Каждое следующее число равно сумме двух предыдущих.

int a, b, c; //создаём 3 переменные

a = 1;

b = 0;

//инициализируем 2 из 3х переменные

for (int j = 0; j < 20; j++)

{

   c = a + b;

   a = b;

   b = c;

// меняем значения местами, это даст нам возможность высчитывать

// каждое следующее число из суммы 2х предыдущих

   Console.WriteLine(c);

}

 Console.ReadLine(); 

пятница, 30 марта 2012 г.

Пара простых генераторов случайных последовательностей.


Первый:

int passwordLength = 10;
string allChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-";
char[] chars = new char[passwordLength];
Random rd = new Random();

for (int i = 0; i < passwordLength; i++)
{
chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
}

Второй:

List<char> chars = new List<char>();
for(int b = 0; b<10; b++)
{
for (int i = 97; i < 123; i++)
{
chars.Add(Convert.ToChar(i));
}
for (int i = 65; i < 91; i++)
{
chars.Add(Convert.ToChar(i));
}
for (int i = 48; i < 58; i++)
{
chars.Add(Convert.ToChar(i));//генерируем символы заглавные, строчные и цифры
}

string s = chars;

Третий:

Char[] pwdChars = new Char[62] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
'r','s','t','u','v','w','x','y','z','Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G',
'H','J','K','L','Z','X','C','V','B','N','M','1','2','3','4','5','6','7','8','9','0'};
char[] pass = new char[32];
Random rnd= new Random();
for(int i = 0; i < pass.Length; i++)
{
pass += pwdChars[rnd.Next(0, 62)];
}


вторник, 27 марта 2012 г.

электронные часы на C#

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

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

Первая запись будет посвящена написанию электронных часов на C#.
Для начала нужно создать новый проект WPF.
На форму кидаем Label и Timer. Устанавливаем размер формы 800/300 (ширина и высота).
Затем дважды нажимаем мышкой на форму, чтобы перейти к написанию кода.
Вот сам код:

namespace Clock
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            nastroiki_formi();//вызываем функцию, чтобы всё работало
        }

        public void nastroiki_formi() 
        {
            label1.Text = "";
            FontFamily Label_shrift = new FontFamily("Digit");//шрифт
            System.Drawing.Color cvet_formi;
            cvet_formi = System.Drawing.Color.Black;//цвет формы
            this.BackColor = cvet_formi;//фон(за цвет отвечает BackColor)
            label1.Font = new Font(Label_shrift, 80, FontStyle.Regular);//присвоили Лэйблу шрифт
            this.Text = "Clock";
            System.Drawing.Color label_shrift_color;
            label_shrift_color = System.Drawing.Color.White;
            label1.ForeColor = label_shrift_color;//цвет лейбла (за цвет отвечает ForeColor)
            //две переменные для размещения в центре формы часов
            int x = this.Size.Width / 3;
            int y = this.Size.Height / 3;
            //Значения передаем в свойство Location (отвечает за координаты верхнего левого угла Label)
            label1.Location = new System.Drawing.Point(x, y);
            //указываем максимальный и минимальный размер формы
            this.MaximumSize = new Size(1000, 350);
            this.MinimumSize = new Size(1000, 350);
            //активируем таймер
            timer1.Enabled = true;
            timer1.Interval = 1;
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Заносим в Label текущее время используя свойства Now и DateTime
            //Чтобы присвоить время Label нужно воспользоваться ToLongTimeString()
            label1.Text = DateTime.Now.ToLongTimeString();
        }
    }
}

Часы готовы!
На youtube есть видео с точно такими же часами. Ссылка http://www.youtube.com/watch?v=yVpFxqiIgcw