Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 22:04   #21
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

Цитата:
Сообщение от Casper-SC Посмотреть сообщение
Или всё-таки кто знает из-за чего возникает такая ошибка?
ещё раз скажу.
нельзя делать так

Код:
list.Add((MyClass)this.listViewMyClass.Items[i].Tag);
в list.add() нужно ИНИЦИЛИЗИРОВАТЬ экземпляр класса

Код:
list.Add(new MyClass(1,2,"3"));
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 13.03.2010, 22:12   #22
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Я примерно понял. Мне надо создать конструктор типа:
Код:
        public AlarmClock(AlarmClock alarm)
        {
            dateTimeAlarm = alarm.dateTimeAlarm;
            levelVolume = alarm.levelVolume;
            secondsForPlay = alarm.secondsForPlay;
            ...
        }
Это чтобы создавать при сериализации экземпляр и через параметр конструктора передавать данные из уже настроенного класса в новый. Так? Выше я пример набросал, если не заметили (мало ли).
Casper-SC вне форума Ответить с цитированием
Старый 13.03.2010, 22:14   #23
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

да, в твоём примере не хватает параметров конструктора
... и кажется дело в перечислениях. ща попробую в свой пример перечисление всунуть
нет, тут всё в порядке. вот пример с enum

Цитата:
Сообщение от Casper-SC Посмотреть сообщение
Я примерно понял. Мне надо создать конструктор типа:
Код:
        public AlarmClock(AlarmClock alarm)
        {
            dateTimeAlarm = alarm.dateTimeAlarm;
            levelVolume = alarm.levelVolume;
            secondsForPlay = alarm.secondsForPlay;
            ...
        }
Это чтобы создавать при сериализации экземпляр и через параметр конструктора передавать данные из уже настроенного класса в новый. Так? Выше я пример набросал, если не заметили (мало ли).
нет не правильно понял.лсит состоит из класса
когда инициализируешь свой класс ты должен в него передавать переменные класса. т.е.
Код:
AlarmClock ac = new AlarmClock("Вставай на работу!", ModeAlarm.EVERY_DAY, DateTime.Now)
тогда класс сразу заполнится. + будет возможность создать пустой конструктор
Вложения
Тип файла: rar WindowsFormsApplication1.rar (36.1 Кб, 4 просмотров)
Life if about choices
Make the right choice

Последний раз редактировалось Stilet; 15.03.2010 в 12:33.
TaTT DoGG вне форума Ответить с цитированием
Старый 13.03.2010, 22:59   #24
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Вот пример где всё работает, не работало кстати из-за одного свойства в классе AlarmClock в примере оно за коментированно. Ну и тут напишу в чём была проблема и я пока только сохраняю класс.
Код:
        /// <summary>
        /// Шрифт сообщения.
        /// </summary>
        public Font FontMsg
        {
            get { return fontMsg; }
            set { fontMsg = value; }
        }
но рано радоваться, теперь надо поробовать десериализовать и загрузить всё это дело.

Нда, в программе и с закоментированным по прежнему не работает, походу этот Font вообще нельзя использовать.

Последний раз редактировалось Casper-SC; 13.03.2010 в 23:06.
Casper-SC вне форума Ответить с цитированием
Старый 13.03.2010, 23:05   #25
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

я тоже только что нашел это свойство )) фонт свойство не сериализуется

вот десериализация:
Код:
listViewAlarm.Items.Clear();
            XmlReader reader = new XmlTextReader("serialize.xml");
            XmlSerializer serializer = new XmlSerializer(typeof(List<AlarmClock>));
            List<AlarmClock> list = (List<AlarmClock>)serializer.Deserialize(reader);
            reader.Close();
            for (int i = 0; i < list.Count;i++ )
            {
                AddInListView(list[i], this.listViewAlarm);
            }
только ref не умеет работать с листом поэтому просто убираем его

Код:
private void AddInListView(AlarmClock alarm, ListView listView)
держи работающий пример

а вот по поводу шрифта
http://www.cyberforum.ru/csharp-net/thread39791.html
Вложения
Тип файла: rar Пример сериализации.rar (145.2 Кб, 5 просмотров)
Life if about choices
Make the right choice

Последний раз редактировалось Stilet; 15.03.2010 в 12:33.
TaTT DoGG вне форума Ответить с цитированием
Старый 14.03.2010, 11:33   #26
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Теперь надо чем то заменять Font и Color, первый вообще не работает с сериализацией, второй говорят не сохраняется просто. И такой вопрос, а нет ли более простого способа, сохранить в какой нибудь .dat файл, который ничем не посмотреть в отличии от .xml? Вообще буду пробовать сделать этим способом, но вот если ref не работает с List, это означает, что метод будет не так работать если убрать ref, если я уберу его то что получиться?
Код:
        /// <summary>
        /// Добавить будильник в указанный ListView
        /// </summary>
        /// <param name="alarm">Будильник который нужно добавить</param>
        /// <param name="listView">Список в который нужно добавить</param>
        private void AddInListView(ref AlarmClock alarm, ListView listView)
        {
            string msg, date, period = string.Empty;
            msg = alarm.Message;
            date = "не работает";

            switch (alarm.Mode)
            {
                case ModeAlarm.ONE_ALARM : period = "Одноразовый";
                    break;

                case ModeAlarm.EVERY_HOUR : period = "Каждый час";
                break;

                case ModeAlarm.EVERY_DAY : period = "Каждый день";
                break;

                case ModeAlarm.EVERY_WEEK : period = "Каждую неделю";
                break;

                case ModeAlarm.EVERY_MONTH : period = "Каждый месяц";
                break;

                case ModeAlarm.EVERY_YEAR : period = "Каждый год";
                break;

                case ModeAlarm.OTHER: period = "Другое";
                break;
            }

            int i = this.listViewAlarm.Items.Add(msg).Index;
            this.listViewAlarm.Items[i].SubItems.Add(date);
            this.listViewAlarm.Items[i].SubItems.Add(period);
            this.listViewAlarm.Items[i].Checked = true;
            this.listViewAlarm.Items[i].Tag = alarm;
        }

        private void btnNew_Click(object sender, EventArgs e)
        {
            FormAddNewClock formAddNewClock = new FormAddNewClock();
            if (formAddNewClock.ShowDialog(this) == DialogResult.OK)
            {
                AlarmClock alarmClock;
                formAddNewClock.TransferAlarmClock(out alarmClock);
                AddInListView(ref alarmClock, this.listViewAlarm); //этот будильник будет добалятся в список, если убрать ref или его новый экземпляр?
            }
        }
Может для List написать такой же метод но без ref?
Casper-SC вне форума Ответить с цитированием
Старый 14.03.2010, 11:41   #27
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Цитата:
Сообщение от Casper-SC Посмотреть сообщение
И такой вопрос, а нет ли более простого способа, сохранить в какой нибудь .dat файл, который ничем не посмотреть в отличии от .xml?
Зашифруй файл.
BOZKURT вне форума Ответить с цитированием
Старый 14.03.2010, 13:41   #28
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

бинариформатером, как предложил m0nax

ref можно обойти так:
Код:
listViewAlarm.Items.Clear();
            XmlReader reader = new XmlTextReader("serialize.xml");
            XmlSerializer serializer = new XmlSerializer(typeof(List<AlarmClock>));
            List<AlarmClock> sd = (List<AlarmClock>)serializer.Deserialize(reader);
            reader.Close();
            for (int i = 0; i < sd.Count;i++ )
            {
                AlarmClock _temp = sd[i];
                AddInListView(ref _temp, this.listViewAlarm);
            }
хотя наверно нет ((( ссылаться не будет в лист
Life if about choices
Make the right choice

Последний раз редактировалось Stilet; 15.03.2010 в 12:34.
TaTT DoGG вне форума Ответить с цитированием
Старый 15.03.2010, 04:43   #29
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Вот попробовал заменить Шрифт своим и ничего не получилось:

Код:
    [Serializable]
    public class SFont
    {
        public Boolean bold; //является ли этот шрифт полужирным
        public Boolean underline; //подчёркнутый ли шрифт
        public Boolean gdiVerticalFont; /*     Возвращает логическое значение, указывающее на то, является ли данный шрифт
                                        System.Drawing.Font производным от вертикального шрифта GDI. */
        public Boolean isSystemFont; //Получает значение, показывающее, является ли шрифт элементом System.Drawing.SystemFonts.
        public Boolean italic; //возвращает значение будет ли этот шрифт курсивом
        public Boolean strikeout; /*  Значение true, если данный шрифт System.Drawing.Font обеспечивает горизонтальную
                               линию через шрифт, в противном случае возвращается значение false. */
        public String name; //возвращает имя начертания этого шрифта
        public String originalFontName; //Возвращает имя первоначально заданного шрифта
        public String systemFontName; /*     Имя системного шрифта, если свойство System.Drawing.Font.IsSystemFont равно
                                      true, в противном случае пустая строка (""). */
        public FontFamily fontFamily; //
        public byte gdiCharSet; /* Возвращает значение в байтах, задающее набор знаков GDI, который используется
                              данным шрифтом System.Drawing.Font. */
        public int height; //возвращает значение междустрочного интервала данного шрифта

        public float size; //Размер максимального пробела данного шрифта
        public float sizeInPoints; //Размер максимального пробела данного шрифта (в пунктах).

        public FontStyle Style;  //возвращает сведения о стиле данного шрифта

        public GraphicsUnit unit; /* Единица System.Drawing.GraphicsUnit представляет собой единицу измерения
                              для этого шрифта System.Drawing.Font. */



    }
Это конвертер должен был быть, но второй метод не работает, так как у Font свойства там только для чтения, блин, что делать?
Код:
 public static class Converter
    {
        public static SFont EncodeFontToSFont(Font font)
        {
            SFont sfont = new SFont();
            sfont.bold = font.Bold;
            sfont.gdiCharSet = font.GdiCharSet;
            sfont.gdiVerticalFont = font.GdiVerticalFont;
            sfont.height = font.Height;
            sfont.isSystemFont = font.IsSystemFont;
            sfont.italic = font.Italic;
            sfont.name = font.Name; ;
            sfont.originalFontName = font.OriginalFontName;
            sfont.size = font.Size;
            sfont.sizeInPoints = font.SizeInPoints;
            sfont.strikeout = font.Strikeout;
            sfont.Style = font.Style;
            sfont.systemFontName = font.SystemFontName;
            sfont.underline = font.Underline;
            sfont.unit = font.Unit;
            return sfont;
        }

        public static Font EncodeSFontToFont(SFont sfont, Font prototypeFont)
        {
            Font font = new Font(prototypeFont, FontStyle.Regular);
            font.Bold = sfont.bold;
            font.GdiCharSet = sfont.gdiCharSet;
            font.GdiVerticalFont = sfont.gdiVerticalFont;
            font.Height = sfont.height;
            font.IsSystemFont = sfont.isSystemFont;
            font.Italic = sfont.italic;
            font.Name = sfont.name; ;
            font.OriginalFontName = sfont.originalFontName;
            font.Size = sfont.size;
            font.SizeInPoints = sfont.sizeInPoints;
            font.Strikeout = sfont.strikeout;
            font.Style = sfont.Style;
            font.SystemFontName = sfont.systemFontName;
            font.Underline = sfont.underline;
            font.Unit = sfont.unit;
            return font;
        }
    }
Casper-SC вне форума Ответить с цитированием
Старый 15.03.2010, 11:10   #30
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

внутри твое класса сделай ещё один класс MyFont например
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать двумерный массив, заполнить случайными числами, сохранить в файл buba Паскаль, Turbo Pascal, PascalABC.NET 7 17.03.2015 20:08
Передать массив базового абстрактного класса функциям производных классов mishutka999 Общие вопросы C/C++ 2 01.12.2009 14:08
запись классов в бинарный файл Feannewedd Общие вопросы C/C++ 6 29.06.2009 10:11
Массив классов nns2009 Общие вопросы C/C++ 15 03.02.2009 00:47