powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение ссылки на объект в классе
2 сообщений из 2, страница 1 из 1
Сохранение ссылки на объект в классе
    #32927746
AlexG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть класс, который в конструкторе получает ссылку на Graphics формы. Привожу выдержки из текста программы (из разных мест):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
...
// в конструкторе формы
DiagramGraphics = this.CreateGraphics();
...
// при нажатии по области рисования
Element theElement = ElementFactory.getClass(ref DiagramGraphics, e.X, e.Y, 100, 50);
...
// определенная в классе ElementFactory функция
public static Element getClass(ref Graphics gr, int x, int y, int width, int height)
{
    return new TheClass(new GOClass(ref gr, x, y, width, height));
}
...
// конструктор класса GOClass, наследник GraphicObject
public GOClass(ref Graphics gr, int x, int y, int width, int height):base(ref gr, x, y, width, height)
{
}
...
// конструктор корневого класса GraphicObject в иерархии класса GOClass
public GraphicObject(ref Graphics gr, int x, int y, int width, int height)
{
    Gr = gr;
    PivotX = x;
    PivotY = y;
    Width = width;
    Height = height;
}

После создания объекта класса (выделено жирным) его экземпляр помещается в коллекцию и вызывается Invalidate() формы. В обработчике перерисовки формы вызывается метод Dysplay() для каждого экземпляра в коллекции, который уже вызывает метод перерисовки Draw() используемого класса GraphicObject:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// метод реализован в классе GOClass, а объявлен в GraphicObject
public override void Draw(Element theElement)
{
    TheClass theClass = (TheClass)theElement;
    // нарисуем рамку объекта
    Gr.FillRectangle(System.Drawing.Brushes.LemonChiffon, PivotX, PivotY, Width, Height);
    Gr.DrawRectangle(System.Drawing.Pens.Crimson, PivotX, PivotY, Width, Height);
        
    // выведем название объекта            
    StringFormat StrFormat = new StringFormat();
    StrFormat.Alignment = StringAlignment.Center; // по центру
    Gr.DrawString(theClass.Name, new Font("Arial", clFontSize), Brushes.Black, new RectangleF(PivotX, PivotY, Width, Height), StrFormat);                        
}

Ссылка на Graphics формы не разрушается мной.
Проблема в том, что при попытке нарисовать что-то на Gr вылетает ошибка (приведено не точно):
...interop...exception...system.window.forms.dll...occurred...GDI+
Приблизительно такие слова там были. Одно можно сказать: возникает ошибка при обращении к Gr. Я просматривал в QuickWatch содержимое Gr, но оно мне не показалось плохим: такое же, как и при получении ссылки.
Вопросы: Почему я не могу нарисовать на форме? Как мне сохранить ссылку так, чтобы потом можно было с ней без проблем работать?
...
Рейтинг: 0 / 0
Сохранение ссылки на объект в классе
    #32928341
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может не отвечу конкретно на вопрос, но выскажусь..
объекты типа Graphics, особенно полученные через CreateGraphics, - очень ценный системный ресурс и поэтому хранить ссылку на него не рекомендуется.Для таких объектов действует правило - как можно позже создавать и как можно раньше освобождать. И не в коем случае не делать долгохранимых ссылок. ИМХО ,если логика программы это не предусмотрела, то она, логика, должна быть переглянута..
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение ссылки на объект в классе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]