Преобразовать строку в шрифт и цвет - PullRequest
3 голосов
/ 05 октября 2009

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

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

Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617

Пояснение:

Control Type
Text property of that control
Location of the control
Font properties for that control
ForeColor for that control.

... Этот текстовый файл, который создается при сохранении пользователем, может содержать информацию только для одного элемента управления, как показано выше, или даже для нескольких элементов управления, например:

Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617
LinkLabel
"This text belongs to the linklabel text property."
Arial, 20, Bold
-119045893

Пояснение:

Control
Text Property
Location
Font Properties
ForeColor
Control
Text Property
Location
Font Properties
ForeColor

... и т. Д. ... Я нахожу это трудным для меня, потому что я далеко не эксперт. Может кто-нибудь, пожалуйста, помогите мне? Мне также нужно преобразовать строку Font Property из строки в объект Font, чтобы ее можно было присвоить свойству Font указанного элемента управления во время выполнения.

Я бы очень признателен за любую помощь. Большое вам спасибо.

Спасибо джей

Ответы [ 6 ]

3 голосов
/ 05 октября 2009

Вы бы сделали что-то вроде этого:

using System;
using System.Drawing;

class Example
{
    static void Main()
    {
        String fontName = "Tahoma, Regular, Size";
        String[] fontNameFields = fontName.Split(',');

        Font font = new Font(fontNameFields[0],
            Single.Parse(fontNameFields[2]),
            (FontStyle)Enum.Parse(typeof(FontStyle), fontNameFields[1]));
    }
}
1 голос
/ 08 октября 2009

Почему вы не используете XmlSerialization. Все, что вам нужно сделать, это создать поток памяти и вызвать его точечный метод Save; и затем вы можете в любой момент перезагрузить данные.

Например, у вас есть класс Canvas.

Перейти на что-то вроде Canvas.AddControls (controlTypes.Label, «Это текст на этикетке», 20, 97, Tahoma, 7,5, Regular, -778225617);

Пожалуйста, ознакомьтесь с простейшим образцом XmlSerializer .

Если вы не хотите, чтобы ваши файлы печатались в формате xml? Используйте двоичную сериализацию. Смотрите это .

Что-то вроде:

public static void Save(object obj)
{
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
    {
        // Serialize an object into the storage referenced by 'stream' object.
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

        // Serialize multiple objects into the stream
        formatter.Serialize(stream, obj);

        // If you want to put the stream into Array of byte use below code
        // byte[] buffer = stream.ToArray();
    }
}
1 голос
/ 08 октября 2009

Кажется, это плохо сформулированная проблема ... Я вижу в ней несколько дыр. (Я предполагаю, что вы говорите о WinForms) Я расскажу об этом позже.

Я не знаю ни одной функциональности в .NET, которая бы взяла на себя весь этот комбинированный анализ за вас. Однако вы можете выполнить настройки форматирования с помощью WinForms с помощью атрибута CSSName [это близкий к этому атрибут] и использовать файл CSS в своем графическом интерфейсе. [Немного странно, но это работает]

Кстати, это целое число, которое является отрицательным, является целым числом со знаком, представляющим набор цветов: RGB:

255 255 255

Вопросы:

  1. Спецификация данных для шрифта и форматирования, кажется, предполагает, что ни один элемент управления не может встраивать другой элемент управления, это часто делается с помощью кнопок, надписей и панелей с помощью WinForms. (XML было бы отличным предложением встроить и избежать этой проблемы)
  2. Это не стандартный формат. Почему бы не пойти с RTF. С RTF это, казалось бы, просто, и вы получаете зрителя, чтобы пойти с ним.
  3. Определение свойства и разделение значений. Похоже, вы используете формат листа свойств, не подразумевайте, что свойства совпадают с тем, что вы предлагаете, это становится подверженным ошибкам при разборе.
1 голос
/ 05 октября 2009

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

Список конструкторов шрифтов см.

Конструктор шрифтов

Параметр размера - это em-размер в точках нового шрифта. Так что для размеров шрифта в других единицах вы должны позаботиться об этом.

0 голосов
/ 08 октября 2009

10 мин. Решение:

Хорошо, следующие из 5 минут «быстрых усилий», которые я действительно имел в виду; Я надеюсь, что это решит проблему.

  • ШАГ 1: Получить холст - объект Canvas
  • ШАГ 2: Добавить чертежи / элементы управления к нему
  • ШАГ 3: Сериализация, сохранение и перезагрузка объекта

См. Следующее.

ШАГ 1: Класс холста

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;

namespace SaveControls
{
    [Serializable()]
    public class CCanvas
    {

        List<CDrawing> _listControls;
    public List<CDrawing> Controls
    {
        get { return _listControls; }
    }

    public CCanvas()
    {
        _listControls = new List<CDrawing>();
    }

    public void AddControls(CDrawing theControls)
    {
        _listControls.Add(theControls);
    }

    public void ReloadControl(Form frm)
    {
        //foreach (CDrawing draw in _listControls) -- requires IEnumerable implementation.
        for (int i = 0; i < _listControls.Count; i++)
        {
            CDrawing d = (CDrawing)_listControls[i];
            d.Draw(frm);
        }
    }


    public void Save()
    {
        try
        {
            using (Stream stream = File.Open("data.bin", FileMode.Create))
            {
                BinaryFormatter bin = new BinaryFormatter();
                bin.Serialize(stream, this);
            }
        }
        catch (IOException)
        {
        }

    }

    public CCanvas Open()
    {
        CCanvas LoadedObj = null;
        using (Stream stream = File.Open("data.bin", FileMode.Open))
        {
            BinaryFormatter bin = new BinaryFormatter();

            LoadedObj = (CCanvas)bin.Deserialize(stream);

        }
        return LoadedObj;
    }
}

}

ШАГ 2: Добавить чертежи

using System;
using System.Collections.Generic;
using System.Text;
using System;
using System.Data;

using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Drawing;

namespace SaveControls
{
    [Serializable()]
    public class CDrawing
    {
        public enum ControlTypes { Label, TextBox, None };

        private ControlTypes _controlType;
    public ControlTypes ControlType
    { get { return _controlType; } }

    private string _strControlText;
    public string Text
    { get { return _strControlText; } }

    private int _xPosition;
    public int X
    { get { return _xPosition; } }

    private int _yPosition;
    public int Y
    { get { return _yPosition; } }


    private string _strFontName;
    public string Font
    { get { return _strFontName; } }

    double _fFontSize;
    public double Size
    { get { return _fFontSize; } }

    string _strStyle;
    public string Style
    { get { return _strStyle; } }

    decimal _dForegroundColor;
    public decimal Color
    { get { return _dForegroundColor; } }

    public CDrawing(ControlTypes controlType, string strControlText, int xPosition, int yPosition,
    string strFontName, double fFontSize, string strStyle, decimal dForegroundColor)
    {
        _controlType = controlType;
        _strControlText = strControlText;
        _xPosition = xPosition;
        _yPosition = yPosition;
        _strFontName = strFontName;
        _fFontSize = fFontSize;
        _strStyle = strStyle;
        _dForegroundColor = dForegroundColor;


    }

    public void Draw(Form frm)
    {
        if (_controlType == ControlTypes.Label)
        {
            Label lbl = new Label();

            lbl.Text = _strControlText;
            lbl.Location = new Point(_xPosition, _yPosition);

            System.Drawing.FontStyle fs = (_strStyle == System.Drawing.FontStyle.Regular.ToString()) ? System.Drawing.FontStyle.Regular : System.Drawing.FontStyle.Bold;

            lbl.Font = new System.Drawing.Font(_strFontName, (float)_fFontSize, fs);
            lbl.ForeColor = SystemColors.Control;// _dForegroundColor;
            lbl.Visible = true;
            frm.Controls.Add(lbl);
        }
    }


}

}

ШАГ 3: Использование, сериализация, сохранение, перезагрузка

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


    public void Save()
    {
        //Create a canvas object
        CCanvas Canvas1 = new CCanvas();

        //Add controls
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label1", 10, 100, "Tahoma", 7.5, "Regular", -778225617));
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label11", 20, 200, "Verdana", 7.5, "Regular", -778225617));
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label111", 30, 300, "Times New Roman", 7.5, "Regular", -778225617));

        //Save the object
        Canvas1.Save();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Save();

    }

    private void btnLoad_Click(object sender, EventArgs e)
    {
        Load();

    }

    public void Load()
    {
        //Retrieve
        CCanvas Canvas2 = new CCanvas();

        //opens the binary file
        Canvas2 = Canvas2.Open();

        //loads control to this form.
        Canvas2.ReloadControl(this);


    }

}

Сообщите нам о причине, если вы планируете ненавидеть это решение. Тем временем я пытаюсь найти место для загрузки. Googlecode, но у меня не установлен клиент Subversion. : 0 (

0 голосов
/ 05 октября 2009

будет ли это работать для вас?

Font font = new Font("Tahoma",12,FontStyle.Regular);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...