Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП, как правильно писать код 
:(
    Опции темы
Dino99rus
Дата 17.10.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private ResourceJournal aJournalRes = new ResourceJournal();
        private CreateJournalAndWriteRes aCraeteJournal;    
        
        private void OpenFile(string pPathFile)
        {            
            aJournalRes.ReadResFile(pPathFile);
            AddComboBox(aJournalRes.JournalCharterRes);           
        }

        private void AddComboBox(List<JournalCharter> pJurnalCharter)
        {
            foreach(JournalCharter nameCharter in pJurnalCharter)
                comboBox1.Items.Add(nameCharter.NameCharter);
        }
        
        private void btCreater_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.Cancel) return;
            {                
                aCraeteJournal = CreateJournalAndWriteRes.CreateApp(aJournalRes.PathApp = saveFileDialog1.FileName);
                aCraeteJournal.BeginWrite(aJournalRes, columJournalToolStripMenuItem.Checked);
            }
        }
        
        private void OpenFileIcon(string pPathFileIcon)
        {
            aJournalRes.ResICON = new ResourceIcon(pPathFileIcon);
            if (aJournalRes.ResICON.ResIconGroup.ResFile.idType != 1)
                LoadIconFile("");
            else
                LoadIconFile(pPathFileIcon);
        }

        private void LoadIconFile(string pPathFileIcon)
        {
            if (pPathFileIcon != "")
                IconImage.Load(pPathFileIcon);
            else
                IconImage.Image = IconImage.ErrorImage;
        }
     }        


Классы ресурсов
Код

      public class ResourceJournal
    {
        public string ResFile
        {
            get
            {
                return getResFile();
            }
        }       

        public void ReadResFile(string filePath)
        {
            try
            {
                using (StreamReader sr = new StreamReader(File.Open(filePath, FileMode.Open), Encoding.Default))
                {
                    // ReadNameAndDateReleaseJournal(sr);                                    
                    try
                    {
                        int i = 0;
                        while (!sr.EndOfStream)
                        {
                            _journalCharterRes.Add(new JournalCharter(ReadNameCharter(sr)));
                            try
                            {
                                _journalCharterRes[i++].AddPic(ReadPathPic(sr));
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Не правильная структура файла:", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
            }
            catch
            {
                MessageBox.Show("The file could not be read:", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private string ReadNameCharter(StreamReader sr)
        {
            string line;
            while ((line = sr.ReadLine()) != "<-" && line != null)
            {
                if (line != "" && line != "->")
                {
                    return line;
                }
            }
            throw new Exception("File null");
        }
        private string[] ReadPathPic(StreamReader sr)
        {
            string line, temp = "";
            string[] result;
            while ((line = sr.ReadLine()) != "<-" && line != null)
            {
                if (line != "" && line != "->")
                {
                    temp += line + "*";
                }
            }

            temp = temp.Remove(temp.Length - 1);
            result = temp.Split('*');
            return result;
        }
        private List<JournalCharter> _journalCharterRes = new List<JournalCharter>();
        public List<JournalCharter> JournalCharterRes
        {
            get
            {
                return _journalCharterRes;
            }
        }        

        public ResourceJournalStruct ResJournalStruct
        {
            get
            {
                return new ResourceJournalStruct(getStructRes(), "STRUCT", 1);
            }
        }

        public List<ResourceBitmape> ResBitmape
        {
            get
            {
                return CreateResBitmape(_journalCharterRes);
            }
        }
        private List<ResourceBitmape> CreateResBitmape(List<JournalCharter> aJournalCharter)
        {
            List<ResourceBitmape> resBit = new List<ResourceBitmape>();
            for (int i = 0; i < aJournalCharter.Count; i++)
            {
                resBit.Add(new ResourceBitmape(aJournalCharter[i].ArrayPic, "NEW" + (i + 1)));
            }
            return resBit;
        }
        private string getStructRes()
        {
            string result = "";
            if (_journalCharterRes.Count == 0)
                return "";

            foreach (JournalCharter jc in _journalCharterRes)
            {
                result += jc.NameCharter + "\r" + jc.ArrayPathPic.Count.ToString() + "\r";
            }
            return result;
        }

        private ResourceIcon _resIcon;
        public ResourceIcon ResICON
        {
            get
            {                
                return _resIcon;
            }
            set
            {
                _resIcon = value;
            }
        }

        private string _pathApp;
        public string PathApp
        {
            get
            {
                return _pathApp;
            }
            set
            {
                _pathApp = value;
            }
        }
       
        private string getResFile()
        {
            string result = "";
            if (_journalCharterRes.Count == 0)
                return "";            
            foreach (JournalCharter jc in _journalCharterRes)
            {
                result += jc.NameCharter + "\r";
                foreach (string pathPic in jc.ArrayPathPic)
                {
                    result += pathPic + "\r";
                }
                result += "<-\r->\r";
            }
            return result;
        }       
    }

    public class ResourceJournalStruct
    {
        public ResourceJournalStruct(string pStructFile,string pResType, uint pResID)
        {
            _resFile = new UTF8Encoding().GetBytes(pStructFile);
            _ResType = pResType;
            _ResID = pResID;
        }
        private string _pathApp;
        public string PathApp
        {
         get            
         set
            
        }

        private byte[] _resFile;
        public byte[] ResFile
        {
            get         
        }
        private string _ResType;
        public string ResType
        {
            get            
        }
        private uint _ResID;
        public uint ResID
        {
            get            
        }
    }

    public class ResourceBitmape
    {
        public ResourceBitmape(List<Image> pArrayResPicFile,string pResType)
        {            
            _ResType = pResType;
            _ResID = new List<uint>();        
            _ArrayResPicFile = new List<byte[]>();
            Add(pArrayResPicFile);
        }
        private string _pathApp;
        public string PathApp
        {
            get           
            set            
        }
        private List<byte[]> _ArrayResPicFile;
        public List<byte[]> ResFile
        {
            get            
            set           
        }
        private string _ResType;
        public string ResType
        {
            get            
            set           
        }
        private List<uint> _ResID;
        public List<uint> ResID
        {
            get            
            set            
        }                           
        private void Add(List<Image> pArrayPic)
        {
            MemoryStream ms = new MemoryStream();   
            uint i=1;         
            foreach (Image pic in pArrayPic)
            {
                pic.Save(ms, pic.RawFormat);
                _ArrayResPicFile.Add(ms.ToArray());
                _ResID.Add(i++);
            }
        }
    }

    public class ResourceIcon
    {
        public ResourceIcon(string pPathIconFile)
        {
            _resIconGroup = new ResourceIconGROUP(pPathIconFile, 14, 32512);
            _resIconDir = new ResourceIconDIR(pPathIconFile, 3, _resIconGroup.ResFile.dwImageOffset);
        }       
        private ResourceIconDIR _resIconDir;
        public ResourceIconDIR ResIconDir
        {
            get          
        }
        private ResourceIconGROUP _resIconGroup;
        public ResourceIconGROUP ResIconGroup
        {
            get         
        }
    }

    public class ResourceIconDIR
    {
        public ResourceIconDIR(string PathResFile, uint pResType, uint pResID)
        {
            _resFile = ReadIconDir(PathResFile);
            _ResType = pResType;
            _ResID = pResID;
        }
        private string _pathApp;
        public string PathApp
        {
            get         
            set          
        }
        private byte[] _resFile;
        public byte[] ResFile
        {
            get          
        }
        private uint _ResType;
        public uint ResType
        {
            get          
        }
        private uint _ResID;
        public uint ResID
        {
            get          
        }

        private byte[] ReadIconDir(string pPathFileIcon)
        {
            BinaryReader hFile = new BinaryReader(File.OpenRead(pPathFileIcon));
            uint buffersizet = (uint)new FileInfo(pPathFileIcon).Length;
            byte[] buffer = hFile.ReadBytes((int)buffersizet);
            hFile.Close();
            byte[] buffer2 = new byte[buffersizet - 22];
            for (int i = 0; i < buffersizet - 22; i++)
            {
                buffer2[i] = buffer[i + 22];
            }
            return buffer2;
        }
    }

    public class ResourceIconGROUP
    {
        public ResourceIconGROUP(string PathResFile, uint pResType, uint pResID)
        {
            _resFile = LoadFileIcon(PathResFile);
            _ResType = pResType;
            _ResID = pResID;
        }
        private string _pathApp;
        public string PathApp
        {
            get          
            set           
        }
        private GROUPICON _resFile;
       
        public GROUPICON ResFile
        {
            get          
        }
        private uint _ResType;
        public uint ResType
        {
            get          
        }
        private uint _ResID;
        public uint ResID
        {
            get          
        }

        private GROUPICON LoadFileIcon(string fileName)
        {
            GROUPICON _groupICON = new GROUPICON();            
            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            try
            {
                _groupICON = LoadStructIcon(fs);
                fs.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return _groupICON;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
            return _groupICON;
        }
        private unsafe GROUPICON LoadStructIcon(Stream stream)
        {
            ICONDIR _iconDir = new ICONDIR();
            ICONDIRENTRY _iconDirEntry = new ICONDIRENTRY();            
            try
            {
                ****
                if (_iconDir.idType != 1)
                {                    
                    throw new Exception("Error: The file is not an icon file!");
                }                
                ***
            }
            finally
            {  }
            return LoadStructGroupIcon(_iconDir, _iconDirEntry);
        }
        private GROUPICON LoadStructGroupIcon(ICONDIR pIconDir, ICONDIRENTRY pIconDirEntry)
        {
            GROUPICON _groupICON = new GROUPICON();
            ***
            return _groupICON;
        }
    }


Класс хранит основную структуру ресурсов. 
У каждого раздела есть массив картинок.

Код

    public class JournalCharter
    {
        private string _nameCharter;
        private List<Image> masPic;
        private List<string> pathPic;
        
        public JournalCharter(string pName)
        {
            this.NameCharter = pName;
            masPic = new List<Image>();
            pathPic = new List<string>();
        }

        public string NameCharter
        {
            get
            {
                return _nameCharter;
            }
            set
            {
                _nameCharter = value;
            }
        }
        public List<string> ArrayPathPic
        {
            get
            {
                return pathPic;
            }
        }
        public List<Image> ArrayPic
        {
            get
            {
                return masPic;
            }
        }

        public void AddPic(string pPathPic)
        {
            try
            {
                masPic.Add(Image.FromFile(pPathPic));
                pathPic.Add(pPathPic);
            }
            catch
            {
                throw new Exception("Не найден файл: \r" + pPathPic);
            }
        }

        public void AddPic(string[] pPathPic)
        {
            for (int i = 0; i < pPathPic.Length; i++)
            {
                try
                {
                    masPic.Add(Image.FromFile(pPathPic[i]));
                    pathPic.Add(pPathPic[i]);
                }
                catch
                {
                    throw new Exception("Не найден файл: \r" + pPathPic[i]);
                }
            }
        }
    }


Тут все ясно по названию класса.

Код

    public class CreateJournalAndWriteRes
    {
        private CreateJournalAndWriteRes(string pPathFile)
        {
            CreateJurnal(pPathFile); 
        }
        public static CreateJournalAndWriteRes CreateApp(string pPathFile)
        {
            return new CreateJournalAndWriteRes(pPathFile);
        }
        private void UpdateResource(IntPtr hUpdate, ResourceJournalStruct pRes)
        {
              DllMethods.UpdateResource(hUpdate, pRes.ResType, pRes.ResID, 1049, pRes.ResFile, (UInt32)pRes.ResFile.Length);            
        }

        private unsafe void UpdateResource(IntPtr hUpdate, ResourceIcon pRes)
        {
            DllMethods.UpdateResource(hUpdate, pRes.ResIconDir.ResType, pRes.ResIconDir.ResID, 1049, pRes.ResIconDir.ResFile, (UInt32)pRes.ResIconDir.ResFile.Length);
            GROUPICON temp = pRes.ResIconGroup.ResFile;
            DllMethods.UpdateResource(hUpdate, pRes.ResIconGroup.ResType, pRes.ResIconGroup.ResID, 1049, &temp, (UInt32)sizeof(GROUPICON));
        }

        private void UpdateResource(IntPtr hUpdate, string strResFile, string strResType, uint nResID)
        {
            using (BinaryReader reader = new BinaryReader(File.OpenRead(strResFile)))
            {
                long nCount = new FileInfo(strResFile).Length;
                byte[] bytes = reader.ReadBytes((int)nCount);
                reader.Close();
                DllMethods.UpdateResource(hUpdate, strResType, nResID, 1049, bytes, (UInt32)nCount);
            }
        }

        private bool AppendResource(IntPtr hUpdate, ResourceJournal aJurnalRes)
        {
            try
            {
                UpdateResource(hUpdate, aJurnalRes.ResJournalStruct);
                if (aJurnalRes.ResICON != null && aJurnalRes.ResICON.ResIconGroup.ResFile.idType!=1)
                    UpdateResource(hUpdate, aJurnalRes.ResICON);
            }
            catch
            {
                return false;
            }
            return true;
        }

        public void BeginWrite(ResourceJournal aJurnalRes, bool pVisibleSelectCharter)
        {
            try
            {
                IntPtr hUpdate = DllMethods.BeginUpdateResource(aJurnalRes.PathApp, false);
                if (hUpdate != IntPtr.Zero)
                {
                    DllMethods.EndUpdateResource(hUpdate, !AppendResource(hUpdate, aJurnalRes));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error:" + ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CreateJurnal(string pFileName)
        {
            Stream stream = File.Create(pFileName);
            stream.Write(global::JournalCreater.Properties.Resources.Journal, 0, global::JournalCreater.Properties.Resources.Journal.Length);
            stream.Close();
        }
    }


Читал вот эту тему
http://forum.vingrad.ru/forum/topic-223141/0.html 
В конце приведет список книг, чтобы научиться писать ОО код.
Купил: 
Мартин Фаулер. Рефакторинг. Улучшение существующего кода. // изучаю ее пока в большой степени
С. Макконнелл. Совершенный код. //Тоже читаю... по мере возможности. Читал про классы (АТД понял и догнал, но не догнал про интерфейсы и наследование. Может будет дальше подробнее...(а может туп)).
Джошуа Кериевски. Рефакторинг с использованием шаблонов. //Читаю. Т.к. опыт нулевой в применении шаблонов, там хоть и написано, как и где применять, но я не понимаю, как это прикручивать к свой проге.

А суть вопроса и состоит в том, чтобы помочь в написании ОО кода. Посмотрите и скажите где что не правильно, где и что можно было использовать... о то опыта нет и как работать с шаблонами не понимаю. Да и вообще я не думаю, что этот код хоть как то отдалена напоминает ОО код.




Это сообщение отредактировал(а) Dino99rus - 17.10.2008, 21:59
PM MAIL   Вверх
QryStaL
Дата 17.10.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Dino99rus, было бы очень полезно прежде чем писать код, спроектировать ваше приложение. Про объектно-ориентированный анализ и проектирование хорошо написано в этой книге. На данном же этапе вместо того, чтобы постить длинные листинги кода, лучше пришлите диаграмму классов (в Visual Studio на проекте контекстное меню -> View Class Diagram).


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Dino99rus
Дата 18.10.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Книгу на недели закажу
Вот диаграммы
user posted image
user posted image
user posted image

Это сообщение отредактировал(а) Dino99rus - 18.10.2008, 20:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.