Compare commits

..

4 Commits

Author SHA1 Message Date
DyCTaTOR
3a02a9e7f2 lab2 - сдано 2024-10-15 10:57:48 +04:00
DyCTaTOR
4a3147a908 Merge branch 'lab1' into lab2 2024-10-15 10:29:29 +04:00
DyCTaTOR
86ac64ad42 lab1 - сдано 2024-10-15 10:29:10 +04:00
DyCTaTOR
ff464aea76 lab1 - modifed 2024-10-14 20:12:04 +04:00
2 changed files with 65 additions and 56 deletions

View File

@ -16,25 +16,12 @@ namespace WinFormsLibrary1
{ {
InitializeComponent(); InitializeComponent();
} }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="container"></param>
public ComponentWithBigText(IContainer container) public ComponentWithBigText(IContainer container)
{ {
container.Add(this); container.Add(this);
InitializeComponent(); InitializeComponent();
} }
/// <summary>
/// Создать документ
/// </summary>
/// <param name="filename"></param>
/// <param name="title"></param>
/// <param name="rows"></param>
/// <exception cref="ArgumentNullException"></exception>
public void CreateDocument(string filepath, string title, string[] rows) public void CreateDocument(string filepath, string title, string[] rows)
{ {
if (string.IsNullOrEmpty(filepath)) if (string.IsNullOrEmpty(filepath))

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Windows.Forms; using System.Windows.Forms;
@ -10,9 +11,9 @@ namespace WinFormsLibrary1
{ {
private string? _template; private string? _template;
private string _startSymbol; private char? _startSymbol;
private string _endSymbol; private char? _endSymbol;
public int SelectedIndex public int SelectedIndex
{ {
get get
@ -24,11 +25,13 @@ namespace WinFormsLibrary1
listBox.SelectedIndex = value; listBox.SelectedIndex = value;
} }
} }
public ListBoxUserControl() public ListBoxUserControl()
{ {
InitializeComponent(); InitializeComponent();
} }
public void SetParams(string template, string fromChar, string toChar)
public void SetParams(string template, char? fromChar, char? toChar)
{ {
_template = template; _template = template;
_startSymbol = fromChar; _startSymbol = fromChar;
@ -37,62 +40,81 @@ namespace WinFormsLibrary1
public T? GetObject<T>() where T : class, new() public T? GetObject<T>() where T : class, new()
{ {
if (listBox.SelectedIndex == -1) if (listBox.SelectedIndex == -1 || string.IsNullOrEmpty(_template) || !_startSymbol.HasValue || !_endSymbol.HasValue)
throw new ArgumentException("Не хватает данных");
var type = typeof(T);
var fields = type.GetFields();
var properties = type.GetProperties();
var members = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()).ToArray();
var curObject = new T();
string text = listBox.SelectedItem?.ToString() ?? "";
var words = Regex.Split(_template, $@"\{_startSymbol.Value}.*?\{_endSymbol.Value}");
int firstWordStart = text.IndexOf(words[0], 0);
if (firstWordStart == -1)
throw new Exception("Не найден элемент шаблона");
if (firstWordStart != 0)
{ {
return null; string beginning = text[..firstWordStart];
FillMember(_template.Substring(1, firstWordStart - 2), curObject, beginning, members);
} }
string selectedString = listBox.SelectedItem.ToString()!; int start = 0;
T obj = new T();
string pattern = $@"{Regex.Escape(_startSymbol)}(.*?){Regex.Escape(_endSymbol)}"; for (int i = 0; i < words.Length - 1; i++)
MatchCollection matches = Regex.Matches(_template, pattern);
string[] words = selectedString.Split(' ');
int wordIndex = 0;
foreach (Match match in matches)
{ {
string propertyName = match.Groups[1].Value; start = text.IndexOf(words[i], start);
var property = obj.GetType().GetProperty(propertyName); if (start == -1)
if (property != null && property.CanWrite) throw new Exception("Не найден элемент шаблона");
{ start += words[i].Length;
if (wordIndex < words.Length)
{ int nextWordIndex = text.IndexOf(words[i + 1], start);
string propertyValue = words[wordIndex]; if (nextWordIndex == -1)
property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType)); throw new Exception("Не найден следующий элемент шаблона");
wordIndex++;
string valueBetween = text[start..nextWordIndex];
string layoutPart = _template.Substring(_template.IndexOf(words[i]) + words[i].Length);
int startCharIndex = layoutPart.IndexOf(_startSymbol.Value);
int endCharIndex = layoutPart.IndexOf(_endSymbol.Value);
string memberName = layoutPart.Substring(startCharIndex + 1, endCharIndex - startCharIndex - 1);
FillMember(memberName, curObject, valueBetween, members);
start = nextWordIndex;
} }
return (T?)curObject;
}
private void SetMemberValue(object obj, MemberInfo member, object value)
{
if (member is PropertyInfo property)
{
property.SetValue(obj, value);
}
else if (member is FieldInfo field)
{
field.SetValue(obj, value);
} }
} }
return obj; private void FillMember(string memberName, object curObject, string value, MemberInfo[]? members)
{
var member = members?.FirstOrDefault(x => x.Name == memberName)
?? throw new Exception("Ошибка с поиском элемента");
object convertedValue = Convert.ChangeType(value, GetMemberType(member));
SetMemberValue(curObject, member, convertedValue);
} }
public void AddObject<T>(T obj) private Type GetMemberType(MemberInfo member)
{ {
if (obj == null) return member is PropertyInfo property ? property.PropertyType : ((FieldInfo)member).FieldType;
{
throw new ArgumentNullException("Добавляемый объект не существует!");
}
if (string.IsNullOrEmpty(_template) || string.IsNullOrEmpty(_startSymbol) || string.IsNullOrEmpty(_endSymbol))
{
throw new Exception("Заполните макетную строку!");
}
if (!_template.Contains(_startSymbol) || !_template.Contains(_endSymbol))
{
throw new Exception("Макетная строка не содержит нужные элементы!");
}
string processedString = _template;
foreach (var property in obj.GetType().GetProperties())
{
string placeholder = $"{_startSymbol}{property.Name}{_endSymbol}";
processedString = processedString.Replace(placeholder, $"{_startSymbol}{property.GetValue(obj)}{_endSymbol}");
}
listBox.Items.Add(processedString);
} }
} }
} }