Compare commits

..

No commits in common. "master" and "dev" have entirely different histories.
master ... dev

4 changed files with 3 additions and 690 deletions

View File

@ -28,188 +28,13 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.btnRemoveDuplicates = new System.Windows.Forms.Button();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.файлToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.импортToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.экспортToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.помощьToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.label1 = new System.Windows.Forms.Label();
this.lblStatus = new System.Windows.Forms.Label();
this.dataGridView2 = new System.Windows.Forms.DataGridView();
this.btnValidateEmails = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).BeginInit();
this.SuspendLayout();
//
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Location = new System.Drawing.Point(12, 51);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.Size = new System.Drawing.Size(281, 389);
this.dataGridView1.TabIndex = 0;
//
// btnRemoveDuplicates
//
this.btnRemoveDuplicates.Location = new System.Drawing.Point(12, 446);
this.btnRemoveDuplicates.Name = "btnRemoveDuplicates";
this.btnRemoveDuplicates.Size = new System.Drawing.Size(134, 23);
this.btnRemoveDuplicates.TabIndex = 1;
this.btnRemoveDuplicates.Text = "Удалить дубликаты";
this.btnRemoveDuplicates.UseVisualStyleBackColor = true;
this.btnRemoveDuplicates.Click += new System.EventHandler(this.btnRemoveDuplicates_Click);
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.файлToolStripMenuItem,
this.помощьToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(620, 24);
this.menuStrip1.TabIndex = 2;
this.menuStrip1.Text = "menuStrip1";
//
// файлToolStripMenuItem
//
this.файлToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.импортToolStripMenuItem,
this.экспортToolStripMenuItem});
this.файлToolStripMenuItem.Name = айлToolStripMenuItem";
this.файлToolStripMenuItem.Size = new System.Drawing.Size(48, 20);
this.файлToolStripMenuItem.Text = "Файл";
//
// импортToolStripMenuItem
//
this.импортToolStripMenuItem.Name = "импортToolStripMenuItem";
this.импортToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
this.импортToolStripMenuItem.Text = "Импорт";
this.импортToolStripMenuItem.Click += new System.EventHandler(this.импортToolStripMenuItem_Click);
//
// экспортToolStripMenuItem
//
this.экспортToolStripMenuItem.Name = "экспортToolStripMenuItem";
this.экспортToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
this.экспортToolStripMenuItem.Text = "Экспорт";
this.экспортToolStripMenuItem.Click += new System.EventHandler(this.экспортToolStripMenuItem_Click);
//
// помощьToolStripMenuItem
//
this.помощьToolStripMenuItem.Name = "помощьToolStripMenuItem";
this.помощьToolStripMenuItem.Size = new System.Drawing.Size(68, 20);
this.помощьToolStripMenuItem.Text = "Помощь";
this.помощьToolStripMenuItem.Click += new System.EventHandler(this.помощьToolStripMenuItem_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(159, 451);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 13);
this.label1.TabIndex = 3;
this.label1.Text = "Статус:";
//
// lblStatus
//
this.lblStatus.AutoSize = true;
this.lblStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblStatus.Location = new System.Drawing.Point(209, 451);
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(0, 13);
this.lblStatus.TabIndex = 4;
//
// dataGridView2
//
this.dataGridView2.AllowUserToAddRows = false;
this.dataGridView2.AllowUserToDeleteRows = false;
this.dataGridView2.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView2.Location = new System.Drawing.Point(315, 51);
this.dataGridView2.Name = "dataGridView2";
this.dataGridView2.ReadOnly = true;
this.dataGridView2.Size = new System.Drawing.Size(291, 389);
this.dataGridView2.TabIndex = 5;
//
// btnValidateEmails
//
this.btnValidateEmails.Location = new System.Drawing.Point(12, 475);
this.btnValidateEmails.Name = "btnValidateEmails";
this.btnValidateEmails.Size = new System.Drawing.Size(134, 23);
this.btnValidateEmails.TabIndex = 6;
this.btnValidateEmails.Text = "Проверить валидность";
this.btnValidateEmails.UseVisualStyleBackColor = true;
this.btnValidateEmails.Click += new System.EventHandler(this.btnValidateEmails_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(9, 35);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(65, 13);
this.label2.TabIndex = 7;
this.label2.Text = "Все адреса";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(312, 35);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(110, 13);
this.label3.TabIndex = 8;
this.label3.Text = "Навалидные адреса";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(620, 506);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.btnValidateEmails);
this.Controls.Add(this.dataGridView2);
this.Controls.Add(this.lblStatus);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnRemoveDuplicates);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.menuStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1;
this.Name = "Form1";
this.Text = "NoDuplicate";
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
}
#endregion
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.Button btnRemoveDuplicates;
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem файлToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem импортToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem экспортToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem помощьToolStripMenuItem;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lblStatus;
private System.Windows.Forms.DataGridView dataGridView2;
private System.Windows.Forms.Button btnValidateEmails;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
}
}

View File

@ -3,356 +3,18 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace NoDuplicate
{
public partial class Form1 : Form
{
private DataTable emailTable; // Таблица для хранения данных
public Form1()
{
InitializeComponent();
}
private void импортToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "Excel Files|*.xlsx",
Title = "Выберите файл с email-адресами"
};
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
try
{
// Указываем лицензионный контекст для EPPlus
OfficeOpenXml.ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
var worksheet = package.Workbook.Worksheets[0]; // Первый лист
int rows = worksheet.Dimension.Rows; // Количество строк
emailTable = new DataTable();
emailTable.Columns.Add("Email", typeof(string));
for (int row = 1; row <= rows; row++)
{
string email = worksheet.Cells[row, 1].Text;
if (!string.IsNullOrEmpty(email))
{
emailTable.Rows.Add(email);
}
}
dataGridView1.DataSource = emailTable;
//MessageBox.Show("Данные успешно загружены!", "Импорт");
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при импорте файла: {ex.Message}", "Ошибка");
}
}
}
private List<string> removedEmails = new List<string>(); // Список для хранения удалённых адресов
private string reportsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppReports"); // Путь к папке для отчётов
private void SaveReport(List<string> validEmails, List<string> invalidEmails, List<string> removedEmails)
{
try
{
if (!Directory.Exists(reportsDirectory))
{
Directory.CreateDirectory(reportsDirectory);
}
string reportFileName = $"EmailReport_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
string reportPath = Path.Combine(reportsDirectory, reportFileName);
using (StreamWriter writer = new StreamWriter(reportPath))
{
writer.WriteLine($"Отчёт о проверке email-адресов ({DateTime.Now}):");
writer.WriteLine("\nКорректные email:");
writer.WriteLine($"Всего корректных адресов: {validEmails.Count}");
foreach (var email in validEmails)
{
writer.WriteLine(email);
}
writer.WriteLine("\nНевалидные email:");
writer.WriteLine($"Всего невалидных адресов: {invalidEmails.Count}");
foreach (var email in invalidEmails)
{
writer.WriteLine(email);
}
writer.WriteLine("\nУдалённые дубликаты:");
writer.WriteLine($"Всего удалено дубликатов: {removedEmails.Count}");
foreach (var email in removedEmails)
{
writer.WriteLine(email);
}
}
MessageBox.Show($"Отчёт сохранён в папке: {reportsDirectory}", "Успех");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при сохранении отчёта: {ex.Message}", "Ошибка");
}
}
private void btnRemoveDuplicates_Click(object sender, EventArgs e)
{
if (emailTable == null || emailTable.Rows.Count == 0)
{
lblStatus.Text = "Таблица пуста или не загружена.";
lblStatus.ForeColor = Color.Red; // Красный цвет для ошибки
return;
}
try
{
var allEmails = emailTable.AsEnumerable()
.Select(row => row.Field<string>("Email").Trim())
.ToList();
// Проверяем валидность email
var validEmails = allEmails.Where(email => IsValidEmail(email)).ToList();
var invalidEmails = allEmails.Except(validEmails).ToList();
var distinctEmails = validEmails.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
removedEmails = allEmails
.GroupBy(email => email, StringComparer.OrdinalIgnoreCase)
.Where(group => group.Count() > 1)
.SelectMany(group => group.Skip(1))
.ToList();
emailTable.Rows.Clear();
foreach (var email in distinctEmails)
{
emailTable.Rows.Add(email);
}
dataGridView1.DataSource = emailTable;
// Передаем все три списка в метод SaveReport
SaveReport(validEmails, invalidEmails, removedEmails);
// Обновляем сообщение на форме
lblStatus.Text = $"Удаление завершено! Удалено {removedEmails.Count} адрес(ов).";
lblStatus.ForeColor = Color.Green; // Зелёный цвет для успеха
}
catch (Exception ex)
{
lblStatus.Text = $"Ошибка: {ex.Message}";
lblStatus.ForeColor = Color.Red; // Красный цвет для ошибки
}
}
private void экспортToolStripMenuItem_Click(object sender, EventArgs e)
{
if (emailTable == null || emailTable.Rows.Count == 0)
{
MessageBox.Show("Нет данных для экспорта.", "Ошибка");
return;
}
// Открываем диалог для выбора места сохранения файла
SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Excel Files|*.xlsx",
Title = "Сохранить как",
FileName = "Emails.xlsx"
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = saveFileDialog.FileName;
try
{
OfficeOpenXml.ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new OfficeOpenXml.ExcelPackage())
{
// Создаем новый лист
var worksheet = package.Workbook.Worksheets.Add("Emails");
// Записываем данные из DataTable в Excel
for (int i = 0; i < emailTable.Rows.Count; i++)
{
worksheet.Cells[i + 1, 1].Value = emailTable.Rows[i]["Email"]; // Первая строка без заголовка
}
// Сохраняем файл
package.SaveAs(new FileInfo(filePath));
}
//MessageBox.Show("Данные успешно экспортированы!", "Успех");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при экспорте файла: {ex.Message}", "Ошибка");
}
}
}
private void помощьToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Инструкция по работе с программой\r\nПрограмма для работы с email-адресами позволяет удалять дубликаты из списка адресов и создавать отчёты об удалённых данных. Следуйте этим шагам:\r\n\r\n1. Импорт файла\r\nНажмите кнопку \"Импорт\" или выберите пункт меню \"Файл → Импорт\".\r\nВ появившемся окне выберите файл в формате .xlsx, содержащий список email-адресов.\r\nПрограмма загрузит данные и отобразит их в таблице.\r\n2. Удаление дубликатов\r\nПосле импорта нажмите кнопку \"Удалить дубликаты\".\r\nПрограмма автоматически:\r\nУдалит повторяющиеся email-адреса (с учётом регистра и пробелов).\r\nОбновит таблицу, оставив только уникальные адреса.\r\nСоздаст отчёт в папке MyAppReports в \"Моих документах\". Отчёт содержит список удалённых адресов.\r\n3. Экспорт файла\r\nЧтобы сохранить уникальные адреса, нажмите кнопку \"Экспорт\" или выберите пункт меню \"Файл → Экспорт\".\r\nВыберите место и имя для нового файла в формате .xlsx.\r\nПрограмма создаст файл с уникальными адресами.\r\n4. Папка отчётов\r\nВсе отчёты об удалённых адресах сохраняются в папке MyAppReports (расположена в \"Моих документах\").\r\nКаждый отчёт содержит:\r\nОбщее количество удалённых адресов.\r\nПолный список удалённых адресов.\r\nВы можете открыть эту папку вручную или добавить кнопку для её быстрого открытия.");
}
private bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email)) return false;
// Регулярное выражение для проверки email
var emailRegex = new Regex(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,}$");
if (!emailRegex.IsMatch(email.Trim())) return false;
// Проверяем валидность домена
string domain = email.Split('@').LastOrDefault();
if (!IsValidDomain(domain)) return false;
// Проверяем, что нет двойной точки в любом месте email
if (email.Contains("..")) return false;
return true;
}
private bool IsValidDomain(string domain)
{
// Список валидных доменных окончаний
string[] validTlds = {
"com", "org", "net", "edu", "gov", "io", "co", "uk", "ru", "de", "fr",
"jp", "cn", "us", "museum", "jobs", "info", "biz", "xyz", "ai", "name"
};
string[] parts = domain.Split('.');
if (parts.Length < 2) return false; // Минимум 2 части: имя домена и TLD
// Проверяем, что каждая часть домена не пуста, не начинается и не заканчивается тире
foreach (string part in parts)
{
if (string.IsNullOrEmpty(part) || part.StartsWith("-") || part.EndsWith("-"))
return false;
}
// Проверяем валидность TLD
string tld = parts.LastOrDefault();
if (!validTlds.Contains(tld)) return false;
return true;
}
private void btnValidateEmails_Click(object sender, EventArgs e)
{
if (emailTable == null || emailTable.Rows.Count == 0)
{
lblStatus.Text = "Таблица пуста или не загружена.";
lblStatus.ForeColor = Color.Red;
return;
}
var validEmails = new List<string>();
var invalidEmails = new List<string>();
foreach (DataRow row in emailTable.Rows)
{
string email = row.Field<string>("Email").Trim(); // Убираем пробелы
bool isValid = IsValidEmail(email);
if (isValid)
{
validEmails.Add(email);
}
else
{
invalidEmails.Add(email);
}
// Отладочный вывод
Debug.WriteLine($"Email: '{email}', Корректный: {isValid}");
}
// Проверяем, что корректные email записываются обратно
Debug.WriteLine("Корректные email:");
foreach (var email in validEmails)
{
Debug.WriteLine(email);
}
Debug.WriteLine("Невалидные email:");
foreach (var email in invalidEmails)
{
Debug.WriteLine(email);
}
// Обновляем основную таблицу (только валидные email)
emailTable.Rows.Clear();
foreach (var email in validEmails)
{
emailTable.Rows.Add(email);
}
dataGridView1.DataSource = emailTable;
// Обновляем таблицу невалидных email
var invalidEmailTable = new DataTable();
invalidEmailTable.Columns.Add("Invalid Emails", typeof(string));
foreach (var email in invalidEmails)
{
invalidEmailTable.Rows.Add(email);
}
dataGridView2.DataSource = invalidEmailTable;
// Обновляем статус
lblStatus.Text = $"Проверка завершена! Корректных адресов: {validEmails.Count}, невалидных: {invalidEmails.Count}.";
lblStatus.ForeColor = Color.Green;
}
}
}

View File

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
eLcAAAAASUVORK5CYII=
</value>
</data>
</root>

View File

@ -89,9 +89,6 @@
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>