Телеграм канал 'Ежедневник IT-ка'

Ежедневник IT-ка


312 подписчиков
0 просмотров на пост

Программируем на практике!!

для рекламы(или написание скриптов): @vladimir_dzen

Детальная рекламная статистика будет доступна после прохождения простой процедуры регистрации


Что это дает?
  • Детальная аналитика 279'173 каналов
  • Доступ к 131'377'269 рекламных постов
  • Поиск по 520'579'008 постам
  • Отдача с каждой купленной рекламы
  • Графики динамики изменения показателей канала
  • Где и как размещался канал
  • Детальная статистика по подпискам и отпискам
Telemetr.me

Telemetr.me Подписаться

Аналитика телеграм-каналов - обновления инструмента, новости рынка.

Найдено 9 постов

Отойду от темы WPF, и покажу довольно "тривиальную задачу".

Работают два разных приложения:

Одно создаёт текстовый файл и записывает в него содержимое.
Второе читает это файл.

Проблема заключается в том, что первое приложение не успевает записывать в него информацию, как тут же второе его считывает, получая при этом ошибку "Файл пуст".

Решение для этой проблемы весьма простое:

1. Создаём метод "IsLockedFile" с возвращаемым типом данных bool.

2. Создаём конструкцию try...catch, для того чтобы словить исключение.

3. Добавляем оператор "using" - для того, чтобы правильно освобождать,сбрасывать,удалять неуправляемые ресурсы(аналог метода Dispose)

4. Обращаемся к классу "File" и его методу Open с его параметрами(где задаём enum или ещё называют перечисление: FileMode.Open, FileAccess.Read, FileShare.None) и создаем конструктор класса "FileStream".

5. Если файл успешно открылся и прочитался, то возвращаем false(закрывая при этом объект класса FileStream), если нет то true. И в том и в том случае выходим из метода IsLockedFile.

6. В коде вызываю этот метод передавая путь к файлу. Используя цикл "while" т.е. этот будет работать до тех пор, пока возвращает true.

Пример кода:

string pathFile = "D:\Example.txt";
while (IsLockedFile(pathFile));

public bool IsLockedFile(string fileName)
{
try
{
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
{
fs.Close();
return false;
}
}
catch (Exception ex)
{
return true;
}
return true;
}

Очень удобное вещь, особенно если работаете также в многопоточном режиме. Советую это сохранить и использовать.

#Csharp, #File
​​Продолжаю знакомить с WPF.
В предыдущем посте остановился на рассмотрении элемента управления "Menu".

В этом рассмотрю сразу несколько элементов управления(кратко) "ListView", "TextBlock", "StatusBar" и "Grid"

1. Часть кода, который буду рассматривать.


         Background="MidnightBlue"
         Width="140">
      
    

    
      
        
          
            
              ..................
              ..................
             ..................
            
          
        
      
..................
   ..................
   ..................
    

2. Элемент управления ListView(главный элемент в нашем интерфейсе), расположен в левой части интерфейса DockPanel.Dock="Left". Не смотря на то, что он унаследован от класса другого элемента ListBox, является более "продвинутым" т.к. ещё можно добавлять "заголовки столбцов" т.е. у него есть свойство "View", которое имеет свой элемент(объект) GridView, который позволяет создавать более сложную структуры таблицы(со своими названиями столбцов)

2.1. Короткий пример(добавление "Заголовков " столбцов т.е. "Headers"):


   
      
Кол-во штук
Цена
   


2.2. Элемент управления TextBlock - служит для вывода текстовой информации и имеет свойство Foreground="White". В котором устанавливается цвет, переднего фона элемента, в нашем случае "цвет текста".

3. Переходим к след. элементу управления StatusBar (главный элемент в нашем интерфейсе), располагается в нижней части интерфейса DockPanel.Dock="Bottom".

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

3.1. Обратимся к свойству ItemsPanel у элемента StatusBar т.е.

3.2. Далее обратимся к элементу ItemsPanelTemplate, который будет в какой-то степени отвечать за оформления нашего StatusBar.

Элемент ItemsPanelTemplate, необходимо будет использовать довольно часто при работе с WPF.

3.3. В ItemsPanelTemplate добавляем такой элемент управления, как Grid

Grid - ЭТО мощный и часто используемый контейнер, напоминающий обычную таблицу. Прошу запомнить это т.к. без него интерфейс напоминал "беспорядочность".

3.3.1. Элемент Grid имеет два интересных свойств:

а) - для работы с размерами столбцов - шириной.
б) - для работы с размерами столбцов - высотой.

На этом всё.

Продолжение следует.....

#WPF, #Csharp
​​Рассматриваю более детальнее код, который опубликовал в прошлой статье.

1. Это часть кода генерируется автоматически в которой объявляются пространства имён.


  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:TelegramBot"
  mc:Ignorable="d"
  Title="MainWindow" Height="150" Width="800">

Мне интересна, в данном случае, вот эта строка, где указываем размеры формы приложения:

" Title="MainWindow" Height="150" Width="800"

2. Контейнер DockPanel - его очень удобно использовать для создания стандартных интерфейсов.

Верхнюю и левую часть - можно использовать для меню.

Нижнюю часть - для отображение какой-то доп информации(чаще строка состояния, в сайтостроении называют также эту часть "подвал").

Правую часть - для отображения дополнительной части.

Центр - здесь находится основное содержание.


..................
..................
..................
 

Свойство LastChildFill="True" означает, что последний элемент(в нашем случае, это текстовое поле "TextBox" и кнопка "Button") заполняет всё оставшееся пространство. 

3. Элемент управления Menu (выделяю его специально, т.к. в него входят другие элементы) - который расположен в верхней части нашей DockPanel панели.

 
   
    
       Command=""/>
    
    
       Click="MenuItem_Click"/>
   

  


3.1. - это название меню. Оно может состоять из нескольких т.е. :





3.2. Свойство "Command" используется для паттерна MVVM(Model-View-ViewModel). О нём буду говорить, в других постах, если будет необходимо.

3.3. Элемент   - это понятно, "разделитель".

3.4. Событие Click="MenuItem_Click" с присвоенным ему именем. Оно будет обрабатываться в коде.

Продолжение следует....

#WPF, #Csharp
​​Продолжаю писать статьи связанные с созданием приложения используя WPF. Даю ссылку на свой прошлый пост, где касался слегка этой темы.

Планирую написать ряд статей по созданию приложения, которое отсылает текстовые сообщения в ТГ(телеграм), используя его API.

Почему? Потому что, написания приложений используя API ТГ в "тренде" и полагаю он ещё будет долгое время.

В этой части статьи покажу весь код XAML файла, который реализовал т.е. интерфейс самой программы.

Основной код:


    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TelegramBot"
    mc:Ignorable="d"
    Title="MainWindow" Height="150" Width="800">
  
 
      
        
             Command=""/>
        
        
             Click="MenuItem_Click"/>
      

    

    
         Background="MidnightBlue"
         Width="140">
      
    

    
      
        
          
            
              
              
              
              
              
              
              
            
          
        
      
      
        
      
      
      
        
      
      
      
        
      
      
      
        
      
    
    
        
          
        
      
        
        
      
      
     HorizontalScrollBarVisibility="Auto"/>
    
​​Сегодня отойдём слегка от программирования и займёмся реестром Windows(и да, её также можно использовать как своеобразную Б.Д., где есть свои таблицы).

Очень часто возникает ситуация, когда есть у нас файл, который хотим использовать как "шаблон" для всех своих последующих проектов, чтобы он был под рукой.Поэтому, проще всего создавать его из "контекстного меню Windows".

Шаги, которые необходимо предпринять:

1. Переходим в директорию:
"C:\Windows\ShellNew" и сохраняем(копируем) необходимый файл, который будет нашим шаблоном.

2. Открываем "редактор реестра". Запустить его можно, нажатием клавиши "Windows + R", вбиваем "regedit" в окно "Выполнить" и нажать "Ок".

3. Переходим в раздел "HKEY_CLASSES_ROOT" и находим в нём другой раздел, название которого совпадает с расширением нашего файла(в данном случае .zp) и в ней должен быть след.-ий раздел "ShellNew" (если его нет, то необходимо создать).

4. В текущем разделе "ShellNew" - необходимо создать "Строковый параметр" со значением "STARTZENNOFILE.zp" (это мой пример шаблона, который создал ранее) и названием "FileName".

5. На этом всё, получаем удовольствия от создания новых проектов, используя готовый "Шаблон".

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

#РеестрWindows
​​Как и обещал ранее, буду рассматривать некоторые примеры, которые были реализованы мною в этом скрипте (если будет интересна одноразовая услуга по сбору площадок, используя этот скрипт, пишите).

Очень часто при вёрстки макетов сайта, похожая информация находится в в одинаковых тегах(div,tr,td,span и т.д.), которые для удобства отображения находятся в отдельных классах. Для того, чтобы получить всю эту информацию, необходимо это учесть.

Поэтому в данном примере это учту и покажу xPath запрос, который помог справится с этим.

Работаю с программным комплексом ZennoPoster

1. Обращаемся к свойству('ActiveTab') объекта('instance') и передаём полученную информацию в класс('Tab') (более подробнее писал выше).

Tab tab = instance.ActiveTab;

2. С помощью XPath запроса передаём найденные элементы в класс 'HtmlElementCollection'

HtmlElementCollection entries = tab.FindElementsByXPath("//tr[starts-with(@class,'tr_even')] | //tr[starts-with(@class,'tr_odd')]");

Интересный момент, на который стоит обратить внимание. 

а) Тело самого запроса использует логический оператор "или (|)", это позволяет нам собирать информацию с одинаковых тегов, но у которых разное оформление( "class")

"//tr[starts-with(@class,'tr_even')] | //tr[starts-with(@class,'tr_odd')]"

3. Основную информацию об элементах получил, дальше необходимо её обрабатывать.

#ZennoPoster, #Xpath
​​В предыдущем примере рассмотрел случай кодирования картинку в base64.

Теперь рассмотрим обратный случай.

Пример: №2 (base64 в картинку):

1. Инициализируем новые переменные: путь к нашей картинке и кодировку base64.

string pathFileNew = "D:\1_pictureCopy.jpeg";
string base64StringNew = base64String(полученная кодировка base64 из пред. примера);

2. Получаем массив из переменной base64StringNew.

byte[] imgBytes = Convert.FromBase64String(base64StringNew);

3. Используем оператор "using"(рекомендую) для работы с картинкой.

using (var imageFile = new FileStream(pathFileNew, FileMode.Create))
{

3.1. Создаём картинку из полученного массива и сохраняем её, согласно нашего пути (pathFileNew).

imageFile.Write(imgBytes, 0, imgBytes.Length);
imageFile.Flush();
}

Все эти случаи в практике используются довольно часто: сервисы для решения каптч, создание сайтов, работа с Б.Д.

Кодирование и декодирование в base64 - это очень полезная вещь.

#Csharp, #base64

Результаты кодирования и декодирования.
​​Необходимо передавать картинку Post/Get запросами. Подумав, а почему не передавать с помощью кодировки base64?

Пример: №1 (картинку в base64):

1. Путь к нашей картинке и переменную для нашей кодировки base64(тип данных string).

string pathFile = "D:\1_picture.jpeg";
string base64String = null;

2. Создаём кодировку base64 из нашей картинки, как строку(тип данных string).

2.1. Рекомендую использовать оператор "using" - для того, чтобы правильно освобождать,сбрасывать,удалять неуправляемые ресурсы(аналог метода Dispose)

2.2. Получаем нашу картинку из файла.

using (Image image = Image.FromFile(pathFile)
{
2.3. Для чтения/записи данных в память, в виде массива, используя класс MemoryStream. 

using (MemoryStream m = new MemoryStream())
{
2.4. Сохраняем нашу картинку в экземпляр класса MemoryStream.

image.Save(m, image.RawFormat);

2.5. Получаем массивtrong> для дальнейшей конвертации.

byte[] imageBytes = m.ToArray();

2.6. Получаем кодировку картинки в base64.

base64String = Convert.ToBase64String(imageBytes);
}
}

3. Полученную строку base64String, уже можем передавать, сохранять и делать с ней что угодно.

3.1. Сервис для просмотра полученной картинки из кодировки base64(тип данных string)

Продолжение следует....

#Csharp, #base64

Пример кодировки.

Найдено 9 постов