Разбор информации о шрифте и преобразование его в System.Drawing.Font - PullRequest
0 голосов
/ 05 октября 2009

У меня есть текстовый файл, который содержит информацию о шрифте, как это:

Arial, 12,5

... и мне нужно прочитать эту информацию на этикетке. Шрифт так:

label.Font = new Font (fontNameFields [0], Single.Parse (fontNameFields [1]));

... но я всегда получаю следующую ошибку:

Индекс находился за пределами массива.

Может кто-нибудь помочь мне с этим?

Спасибо Джейсон.

Код у меня есть:

    MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)");
    foreach (Match match in lines)
    {
        string control = match.Groups[1].Value;
        string text = match.Groups[2].Value;
        int x = Int32.Parse(match.Groups[3].Value);
        int y = Int32.Parse(match.Groups[4].Value);
        String cfont = match.Groups[5].Value;

            String fontName = cfont;
            String[] fontNameFields = fontName.Split(',');


            label.Font = new Font(fontNameFields[0], Single.Parse(fontNameFields[1]));
}

StackTrace


   at Tabbed.Form1.FillCanvas() in C:\Documents and Settings\jay\My Documents\Visual Studio 2008\Projects\MYPROGGY\ MYPROGGY\Form1.cs:line 574
   at Tabbed.Form1.openbtn_Click(Object sender, EventArgs e) in C:\Documents and Settings\jay\My Documents\Visual Studio 2008\Projects\ MYPROGGY\ MYPROGGY\Form1.cs:line 802
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at Tabbed.Program.Main(String[] args) in C:\Documents and Settings\jay\My Documents\Visual Studio 2008\Projects\ MYPROGGY\ MYPROGGY\Program.cs:line 27
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Ответы [ 3 ]

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

Я подозреваю, что вы сталкиваетесь с строкой, в которой нет запятой. Ваш пример данных работает нормально:

using System;

class Test
{
    static void Main(string[] args)
    {
        String fontName = "Arial, 12.5";
        String[] fontNameFields = fontName.Split(',');
        String name = fontNameFields[0];
        float size = float.Parse(fontNameFields[1]);
        Console.WriteLine("{0}: {1}", name, size);
    }
}

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

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

Может быть, ваш формат содержит странную запятую или ее нет вообще?

Также вы можете предоставить код на этикетке, как если бы это был System.Web.UI.WebControls, тогда у шрифта нет установщика.

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

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

На первый взгляд код выглядит нормально.

Вы проверили, что fontName - это то, что вы ожидаете (т. Е. "Arial, 12.5") и что fontNameFields содержит после вызова fontName.Split?

fontNameFields[0] -> "Arial"
fontNameFields[1] -> "12.5"

Не видя фактических значений, я не хотел бы предлагать что-либо еще.

EDIT

Из вашего обновленного кода я бы предположил, что это ваше регулярное выражение, которое не работает. Попробуйте распечатать содержимое массива match.Groups, чтобы убедиться, что вы правильно анализируете ввод.

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