Базы данных для карманного персонального компьютера

Динамическое распределение памяти

Разбить на страницы
Показывать лекцию целиком

Одной из сильных сторон операционной системы для Pocket PC - Windows CE - является то, что в основу ее разработки были положены преимущества версии Windows для настольных ПК. Вы можете заметить сходства между двумя системами, но важно обратить внимание и на различия между реализацией систем Windows CE и Windows NT. Одним из различий является то, что система Windows CE использует значительно облегченные процессы по сравнению с Windows NT, что позволило снизить затраты ресурсов на производительность. В отличие от Windows NT, система Windows CE задумывалась как настраиваемая система. Использование процессов для развертывания API системы позволило регулировать запросы к ПЗУ и ОЗУ в зависимости от того, какая часть ресурсов операционной системы требовалась для определенного устройства. Например, устройство можно настроить на работу только с одним процессом API – системным ядром (nk.exe). Другие устройства, которым требуется поддержка интерфейса пользователя, должны будут запустить процесс интерфейса пользователя (gwes.exe) [].

Тем не менее, для рассматриваемых в книге версий Windows CE (5.0) существует ограничение на число одновременно выполняемых процессов (32), что может не проявляться в условиях эмуляции среды на настольной системе, но приводить к генерации исключения непосредственно на девайсе.

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

Разработка: Приложение "Фотогалерея", позволяющее формировать списки и загружать рисунки, расположенные в различных местах диска.

Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, закрыть
  • Алгоритмы: изменение размеров просмотра рисунка; прокрутка записей вперед и назад списка рисунков; добавление, замена и удаление записей из списка рисунков галереи.
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных – нет.

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

    Шаг 1. Разработка графического интерфейса

    Предусматривается одна форма с TabControl, включающим две закладки – Просмотр и Галерея.

    (рис 15.2) (рис 15.1)

    Закладка "Просмотр" содержит контейнер для просмотра рисунков PictureBox, текстовое поле для комментария к рисунку, текстовое поля для отображения имени файла рисунка (свойство ReadOnly = True), кнопку "-" для изменения размеров рисунка, кнопку "<" прокрутки просмотра фотогалереи назад, кнопку ">" для просмотра фотогалереи вперед и кнопку "Добавить рисунок" (изначально свойство Visible=False ) для занесения в базу данных пути и имени файла рисунка.

    Закладка "Галерея" содержит DataGrid для просмотра XML-файла списка рисунков, поле порядкого номера рисунка в галереи (свойство ReadOnly = True ), кнопку "Заменить" для замены записи в списке рисунков галереи и кнопку "Удалить" для удаления записи из списка.

    Из невидимых элементов интерфейса – главное меню с опциями "Файл" и "Добавить рисунок".

    Меню "Файл" в свою очередь, содержит опции "Открыть галерею", "Сохранить галерею", "О программе" и "Выход".

    Другими невидимыми элементами являются два OpenFileDialog (для девайса рекомендуется свойство InitialDirectory = FlashDisk\image\ ) для открытия файла галерей (свойство Filter = Файлы XML |*.xml ) и для открытия файла рисунка (свойство Filter = Рисунки |*.jpg ), и один SaveFileDialog для записи файла галереи.

    Примерный дизайн формы приведен на рис. 15.1 и 15.2.

    Шаг 2. Добавляем библиотеки

    using System;
    using System.Drawing;
    using System.Collections;
    using System.Windows.Forms;
    using System.Data;
    //добавляем
    using System.IO;
    using System.Xml;
    using System.Runtime.InteropServices; // beep

    Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

    int my_picture; //номер файла
    int my_width=238;//геометрия рисунка
    int my_loc=1;// позиционирование рисунка
    public string file_test=@"FlashDisk\image\auto_foto.xml";//
    public static DataSet dataSetApp;// глобальный датасет
    public static DataTable dataTableApp;//глобальный дататейбл
    System.Int64 my_Int64;   // переменная номера строки
    //переменная для удаления строки, чтобы не нарушать коллекцию foreach
    DataRow remove_row;
    DataRow newRow;
    Int64 my_maxID=0;
    string file_name;
    Bitmap Circle; // создаем ссылочную переменную рисунка
    // Runtime beep (на девайсе может не работать) 
    [DllImport("user32.dll")]
    public static extern int MessageBeep(uint n);

    Шаг 4. Добавляем инициализацию public Form1()

    {
    InitializeComponent();
    // по умолчанию грузим шаблон галереи
    dataSetApp=new DataSet();
    dataTableApp=dataSetApp.Tables.Add("FotoDrive");
    // добавляем столбцы
    dataTableApp.Columns.Add("Комментарий",
    System.Type.GetType("System.String"));
    dataTableApp.Columns.Add("t",System.Type.GetType("System.String"));
    dataTableApp.Columns.Add("ID",System.Type.GetType("System.Int64"));
    dataTableApp.Columns.Add("File",System.Type.GetType("System.String"));
    // пытаемся прочитать файл
    FileStream fin;		
    try {
    fin=new FileStream(file_test,FileMode.Open);
    fin.Close();
    // Считываем значения из файла
    XmlTextReader xml_in=new XmlTextReader(file_test); 
    dataSetApp.ReadXml(@xml_in);
    xml_in.Close();
    	}
    catch(IOException exc) {// если файла нет, то создаем
    // добавляем первую строку для шаблона
    object[] a1={"Самый спортивный Мурзилка","1","1", 
    @"FlashDisk\image\1.jpg"};	// массив строки	
    dataTableApp.Rows.Add(a1);
    this.textBox1.Text="Самый спортивный Мурзилка";
    FileStream fin_out;		
    fin_out=new FileStream(file_test,FileMode.OpenOrCreate);
    fin_out.Close();
    StreamWriter xml_out2;
    xml_out2=new StreamWriter(file_test);//}
    // форматируем xml
    XmlTextWriter xmlWriter=new XmlTextWriter(xml_out2);
    // способ форматирования
    xmlWriter.Formatting=Formatting.Indented;
    xmlWriter.Indentation=3; 
    // принимаем изменения в dataSet !!!
    dataTableApp.AcceptChanges();
    // выводим в xml
    dataSetApp.WriteXml(xmlWriter,XmlWriteMode.IgnoreSchema);
    xmlWriter.Close();
    MessageBox.Show("Файл записан под именем \n"+
    	@"FlashDisk\image\auto_foto.xml","Сохранение");
    }
    this.dataGrid1.Visible=true;
    this.dataGrid1.TableStyles.Clear();
    DataGridTableStyle tsApp= new DataGridTableStyle();
    tsApp.MappingName="FotoDrive";
    DataGridTextBoxColumn csApp=new DataGridTextBoxColumn();
    csApp.Width=200;
    csApp.MappingName="Комментарий";
    csApp.HeaderText="Комментарий";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=10;
    csApp.MappingName="t";
    csApp.HeaderText="t";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=50;
    csApp.MappingName="ID";
    csApp.HeaderText="ID";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=300;
    csApp.MappingName="File";
    csApp.HeaderText="File";
    tsApp.GridColumnStyles.Add(csApp);
    this.dataGrid1.TableStyles.Add(tsApp);
    DataView sortedView=new DataView(dataTableApp);
    sortedView.Sort="ID";//  сортировка	
    dataGrid1.DataSource=sortedView;// привязываем
    }

    Шаг 5. Создаем процедуру просмотра нового рисунка для добавления в галерею

    Для опции главного меню "Добавить рисунок" пишем:

    private void menuItem2_Click_1(object sender, System.EventArgs e) {
    if (openFileDialog1.ShowDialog()==DialogResult.OK) {
    file_name=openFileDialog1.FileName;
    this.tabControl1.SelectedIndex=0;
    this.textBox1.Text=file_name; 
    Circle =new Bitmap(file_name);
    pictureBox1.Image = Circle;
    this.button5.Visible=true; // показываем кнопку добавления рисунка в список
    	}
    }

    Шаг 6. Создаем процедуру добавления рисунка в галерею

    Для кнопки "Добавить в галерею" пишем:

    private void button5_Click(object sender, System.EventArgs e) {
    // вычисляем максимальный номер записи:
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    	}
    this.textBox3.Text=my_maxID.ToString();
    // вводим данные	
    newRow=dataTableApp.NewRow();
    newRow["Комментарий"]=this.textBox2.Text;
    newRow["t"]="1";
    newRow["File"]=this.textBox1.Text;
    // переписываем номер
    newRow["ID"]=this.textBox3.Text;
    // обнуляем  my_maxID
    my_maxID=0;
    // добавляем запись
    dataTableApp.Rows.Add(newRow);
    this.tabControl1.SelectedIndex=1;
    MessageBox.Show("Ok");
    this.button5.Visible=false; // прячем кнопку добавления рисунка
    }

    Шаг 7. Создаем процедуру выборочного просмотра рисунков из галереи

    Для клика строки DataGrid пишем:

    private void dataGrid1_Click(object sender, System.EventArgs e) {
    int N_row=dataGrid1.CurrentCell.RowNumber;
    this.tabControl1.SelectedIndex=0;
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    this.textBox3.Text=dataGrid1[N_row,2].ToString();
    // значение переменной в функции Pic_Show();
    my_picture=int.Parse(this.textBox3.Text); 
    Pic_Show(); // вызываем функцию просмотра рисунка
    return;
    }

    Шаг 8. Создаем функцию просмотра рисунка

    void Pic_Show(){	// проверка существования
    FileStream fin_picShow;		
    try {
    fin_picShow=new FileStream(file_name,FileMode.Open);
    fin_picShow.Close(); // закрываем поток
    Circle =new Bitmap(file_name);// динамическое выделение памяти - здесь
    	}
    catch(FileNotFoundException exc) {// если файл не найден
    MessageBox.Show("Запись "+my_picture+". Нет файла рисунка\n" + file_name, 
    "Ошибка");
    return;}
    catch(IOException exc) {// файл недоступен
    MessageBox.Show("Запись "+my_picture+". Используется другим 
    процессом\n" + file_name,"Ошибка");
    Circle.Dispose();// чистим динамическую память 
    Circle =new Bitmap(file_name);
    	}
    catch {/* перехват всех исключений – 
    необходимость только для РС из-за конфликта версий
    */
    MessageBox.Show(this.textBox3.Text+"\n"+
    	"Запись "+my_picture+". Фиг знает, где висим\n"+
    	this.textBox1.Text+"\n"+file_name+"\n"+
    	this.textBox2.Text,"Ошибка");
    //конфликт версий, на РС стоит более поздняя: основная 100, доп. 0042
    return; // чтобы программы не завершелась аварийно
    	} 
    this.tabControl1.SelectedIndex=0;
    pictureBox1.Image = Circle;
    return; // очистку динамической памяти предоставляем сборщику мусора
    }

    Шаг 9. Прокручиваем записи вперед

    Для кнопки "Вперед" пишем:

    private void button1_Click_1(object sender, System.EventArgs e) {
    my_picture=int.Parse(this.textBox3.Text);
    //вычисляем максимальную запись
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    }
    if (my_picture==my_maxID-1) {
    my_picture=1;
    	}
    else
    my_picture=my_picture+1;
    this.textBox3.Text=my_picture.ToString();
    int N_row=my_picture-1; //счет идет с нулевой строки
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    Pic_Show();
    return;
    }

    Шаг 10. Прокручиваем записи назад

    Для кнопки "Назад" пишем:

    private void button3_Click(object sender, System.EventArgs e) {
    my_picture=int.Parse(this.textBox3.Text);
    //вычисляем максимальную запись
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    	}
    if (my_picture==1) {
    this.textBox3.Text=my_maxID.ToString();
    my_picture=int.Parse(this.textBox3.Text)-1;
    	}
    else
    my_picture=my_picture-1;
    this.textBox3.Text=my_picture.ToString();
    int N_row=my_picture-1;
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    Pic_Show();
    return;
    }

    Шаг 11. Изменяем геометрию просматриваемого рисунка

    private void button4_Click(object sender, System.EventArgs e) {
    if (my_width==238) {
    my_width=134;
    my_loc=53;
    this.button4.Text="+"; // меняем свойство кнопки
    }
    else {
    my_width=238;
    my_loc=1;
    this.button4.Text="-";
    }
    this.pictureBox1.Location = new System.Drawing.Point(my_loc, 30); 
    this.pictureBox1.Size = new System.Drawing.Size(my_width, 178); 
    }

    Оставшуюся функциональность проекта предлагается разработать самостоятельно.

    Страницы:

    Одной из сильных сторон операционной системы для Pocket PC - Windows CE - является то, что в основу ее разработки были положены преимущества версии Windows для настольных ПК. Вы можете заметить сходства между двумя системами, но важно обратить внимание и на различия между реализацией систем Windows CE и Windows NT. Одним из различий является то, что система Windows CE использует значительно облегченные процессы по сравнению с Windows NT, что позволило снизить затраты ресурсов на производительность. В отличие от Windows NT, система Windows CE задумывалась как настраиваемая система. Использование процессов для развертывания API системы позволило регулировать запросы к ПЗУ и ОЗУ в зависимости от того, какая часть ресурсов операционной системы требовалась для определенного устройства. Например, устройство можно настроить на работу только с одним процессом API – системным ядром (nk.exe). Другие устройства, которым требуется поддержка интерфейса пользователя, должны будут запустить процесс интерфейса пользователя (gwes.exe) [].

    Тем не менее, для рассматриваемых в книге версий Windows CE (5.0) существует ограничение на число одновременно выполняемых процессов (32), что может не проявляться в условиях эмуляции среды на настольной системе, но приводить к генерации исключения непосредственно на девайсе.

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

    Разработка: Приложение "Фотогалерея", позволяющее формировать списки и загружать рисунки, расположенные в различных местах диска.

    Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, закрыть
  • Алгоритмы: изменение размеров просмотра рисунка; прокрутка записей вперед и назад списка рисунков; добавление, замена и удаление записей из списка рисунков галереи.
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных – нет.

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

    Шаг 1. Разработка графического интерфейса

    Предусматривается одна форма с TabControl, включающим две закладки – Просмотр и Галерея.

    (рис 15.2) (рис 15.1)

    Закладка "Просмотр" содержит контейнер для просмотра рисунков PictureBox, текстовое поле для комментария к рисунку, текстовое поля для отображения имени файла рисунка (свойство ReadOnly = True), кнопку "-" для изменения размеров рисунка, кнопку "<" прокрутки просмотра фотогалереи назад, кнопку ">" для просмотра фотогалереи вперед и кнопку "Добавить рисунок" (изначально свойство Visible=False ) для занесения в базу данных пути и имени файла рисунка.

    Закладка "Галерея" содержит DataGrid для просмотра XML-файла списка рисунков, поле порядкого номера рисунка в галереи (свойство ReadOnly = True ), кнопку "Заменить" для замены записи в списке рисунков галереи и кнопку "Удалить" для удаления записи из списка.

    Из невидимых элементов интерфейса – главное меню с опциями "Файл" и "Добавить рисунок".

    Меню "Файл" в свою очередь, содержит опции "Открыть галерею", "Сохранить галерею", "О программе" и "Выход".

    Другими невидимыми элементами являются два OpenFileDialog (для девайса рекомендуется свойство InitialDirectory = FlashDisk\image\ ) для открытия файла галерей (свойство Filter = Файлы XML |*.xml ) и для открытия файла рисунка (свойство Filter = Рисунки |*.jpg ), и один SaveFileDialog для записи файла галереи.

    Примерный дизайн формы приведен на рис. 15.1 и 15.2.

    Шаг 2. Добавляем библиотеки

    using System;
    using System.Drawing;
    using System.Collections;
    using System.Windows.Forms;
    using System.Data;
    //добавляем
    using System.IO;
    using System.Xml;
    using System.Runtime.InteropServices; // beep

    Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

    int my_picture; //номер файла
    int my_width=238;//геометрия рисунка
    int my_loc=1;// позиционирование рисунка
    public string file_test=@"FlashDisk\image\auto_foto.xml";//
    public static DataSet dataSetApp;// глобальный датасет
    public static DataTable dataTableApp;//глобальный дататейбл
    System.Int64 my_Int64;   // переменная номера строки
    //переменная для удаления строки, чтобы не нарушать коллекцию foreach
    DataRow remove_row;
    DataRow newRow;
    Int64 my_maxID=0;
    string file_name;
    Bitmap Circle; // создаем ссылочную переменную рисунка
    // Runtime beep (на девайсе может не работать) 
    [DllImport("user32.dll")]
    public static extern int MessageBeep(uint n);

    Шаг 4. Добавляем инициализацию public Form1()

    {
    InitializeComponent();
    // по умолчанию грузим шаблон галереи
    dataSetApp=new DataSet();
    dataTableApp=dataSetApp.Tables.Add("FotoDrive");
    // добавляем столбцы
    dataTableApp.Columns.Add("Комментарий",
    System.Type.GetType("System.String"));
    dataTableApp.Columns.Add("t",System.Type.GetType("System.String"));
    dataTableApp.Columns.Add("ID",System.Type.GetType("System.Int64"));
    dataTableApp.Columns.Add("File",System.Type.GetType("System.String"));
    // пытаемся прочитать файл
    FileStream fin;		
    try {
    fin=new FileStream(file_test,FileMode.Open);
    fin.Close();
    // Считываем значения из файла
    XmlTextReader xml_in=new XmlTextReader(file_test); 
    dataSetApp.ReadXml(@xml_in);
    xml_in.Close();
    	}
    catch(IOException exc) {// если файла нет, то создаем
    // добавляем первую строку для шаблона
    object[] a1={"Самый спортивный Мурзилка","1","1", 
    @"FlashDisk\image\1.jpg"};	// массив строки	
    dataTableApp.Rows.Add(a1);
    this.textBox1.Text="Самый спортивный Мурзилка";
    FileStream fin_out;		
    fin_out=new FileStream(file_test,FileMode.OpenOrCreate);
    fin_out.Close();
    StreamWriter xml_out2;
    xml_out2=new StreamWriter(file_test);//}
    // форматируем xml
    XmlTextWriter xmlWriter=new XmlTextWriter(xml_out2);
    // способ форматирования
    xmlWriter.Formatting=Formatting.Indented;
    xmlWriter.Indentation=3; 
    // принимаем изменения в dataSet !!!
    dataTableApp.AcceptChanges();
    // выводим в xml
    dataSetApp.WriteXml(xmlWriter,XmlWriteMode.IgnoreSchema);
    xmlWriter.Close();
    MessageBox.Show("Файл записан под именем \n"+
    	@"FlashDisk\image\auto_foto.xml","Сохранение");
    }
    this.dataGrid1.Visible=true;
    this.dataGrid1.TableStyles.Clear();
    DataGridTableStyle tsApp= new DataGridTableStyle();
    tsApp.MappingName="FotoDrive";
    DataGridTextBoxColumn csApp=new DataGridTextBoxColumn();
    csApp.Width=200;
    csApp.MappingName="Комментарий";
    csApp.HeaderText="Комментарий";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=10;
    csApp.MappingName="t";
    csApp.HeaderText="t";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=50;
    csApp.MappingName="ID";
    csApp.HeaderText="ID";
    tsApp.GridColumnStyles.Add(csApp);
    csApp = new DataGridTextBoxColumn();
    csApp.Width=300;
    csApp.MappingName="File";
    csApp.HeaderText="File";
    tsApp.GridColumnStyles.Add(csApp);
    this.dataGrid1.TableStyles.Add(tsApp);
    DataView sortedView=new DataView(dataTableApp);
    sortedView.Sort="ID";//  сортировка	
    dataGrid1.DataSource=sortedView;// привязываем
    }

    Шаг 5. Создаем процедуру просмотра нового рисунка для добавления в галерею

    Для опции главного меню "Добавить рисунок" пишем:

    private void menuItem2_Click_1(object sender, System.EventArgs e) {
    if (openFileDialog1.ShowDialog()==DialogResult.OK) {
    file_name=openFileDialog1.FileName;
    this.tabControl1.SelectedIndex=0;
    this.textBox1.Text=file_name; 
    Circle =new Bitmap(file_name);
    pictureBox1.Image = Circle;
    this.button5.Visible=true; // показываем кнопку добавления рисунка в список
    	}
    }

    Шаг 6. Создаем процедуру добавления рисунка в галерею

    Для кнопки "Добавить в галерею" пишем:

    private void button5_Click(object sender, System.EventArgs e) {
    // вычисляем максимальный номер записи:
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    	}
    this.textBox3.Text=my_maxID.ToString();
    // вводим данные	
    newRow=dataTableApp.NewRow();
    newRow["Комментарий"]=this.textBox2.Text;
    newRow["t"]="1";
    newRow["File"]=this.textBox1.Text;
    // переписываем номер
    newRow["ID"]=this.textBox3.Text;
    // обнуляем  my_maxID
    my_maxID=0;
    // добавляем запись
    dataTableApp.Rows.Add(newRow);
    this.tabControl1.SelectedIndex=1;
    MessageBox.Show("Ok");
    this.button5.Visible=false; // прячем кнопку добавления рисунка
    }

    Шаг 7. Создаем процедуру выборочного просмотра рисунков из галереи

    Для клика строки DataGrid пишем:

    private void dataGrid1_Click(object sender, System.EventArgs e) {
    int N_row=dataGrid1.CurrentCell.RowNumber;
    this.tabControl1.SelectedIndex=0;
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    this.textBox3.Text=dataGrid1[N_row,2].ToString();
    // значение переменной в функции Pic_Show();
    my_picture=int.Parse(this.textBox3.Text); 
    Pic_Show(); // вызываем функцию просмотра рисунка
    return;
    }

    Шаг 8. Создаем функцию просмотра рисунка

    void Pic_Show(){	// проверка существования
    FileStream fin_picShow;		
    try {
    fin_picShow=new FileStream(file_name,FileMode.Open);
    fin_picShow.Close(); // закрываем поток
    Circle =new Bitmap(file_name);// динамическое выделение памяти - здесь
    	}
    catch(FileNotFoundException exc) {// если файл не найден
    MessageBox.Show("Запись "+my_picture+". Нет файла рисунка\n" + file_name, 
    "Ошибка");
    return;}
    catch(IOException exc) {// файл недоступен
    MessageBox.Show("Запись "+my_picture+". Используется другим 
    процессом\n" + file_name,"Ошибка");
    Circle.Dispose();// чистим динамическую память 
    Circle =new Bitmap(file_name);
    	}
    catch {/* перехват всех исключений – 
    необходимость только для РС из-за конфликта версий
    */
    MessageBox.Show(this.textBox3.Text+"\n"+
    	"Запись "+my_picture+". Фиг знает, где висим\n"+
    	this.textBox1.Text+"\n"+file_name+"\n"+
    	this.textBox2.Text,"Ошибка");
    //конфликт версий, на РС стоит более поздняя: основная 100, доп. 0042
    return; // чтобы программы не завершелась аварийно
    	} 
    this.tabControl1.SelectedIndex=0;
    pictureBox1.Image = Circle;
    return; // очистку динамической памяти предоставляем сборщику мусора
    }

    Шаг 9. Прокручиваем записи вперед

    Для кнопки "Вперед" пишем:

    private void button1_Click_1(object sender, System.EventArgs e) {
    my_picture=int.Parse(this.textBox3.Text);
    //вычисляем максимальную запись
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    }
    if (my_picture==my_maxID-1) {
    my_picture=1;
    	}
    else
    my_picture=my_picture+1;
    this.textBox3.Text=my_picture.ToString();
    int N_row=my_picture-1; //счет идет с нулевой строки
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    Pic_Show();
    return;
    }

    Шаг 10. Прокручиваем записи назад

    Для кнопки "Назад" пишем:

    private void button3_Click(object sender, System.EventArgs e) {
    my_picture=int.Parse(this.textBox3.Text);
    //вычисляем максимальную запись
    foreach (DataRow my_Row in dataTableApp.Rows) {
    string my_IDD=(my_Row["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    	}
    if (my_picture==1) {
    this.textBox3.Text=my_maxID.ToString();
    my_picture=int.Parse(this.textBox3.Text)-1;
    	}
    else
    my_picture=my_picture-1;
    this.textBox3.Text=my_picture.ToString();
    int N_row=my_picture-1;
    file_name=dataGrid1[N_row,3].ToString();
    this.textBox1.Text=file_name; 
    this.textBox2.Text=dataGrid1[N_row,0].ToString();
    Pic_Show();
    return;
    }

    Шаг 11. Изменяем геометрию просматриваемого рисунка

    private void button4_Click(object sender, System.EventArgs e) {
    if (my_width==238) {
    my_width=134;
    my_loc=53;
    this.button4.Text="+"; // меняем свойство кнопки
    }
    else {
    my_width=238;
    my_loc=1;
    this.button4.Text="-";
    }
    this.pictureBox1.Location = new System.Drawing.Point(my_loc, 30); 
    this.pictureBox1.Size = new System.Drawing.Size(my_width, 178); 
    }

    Оставшуюся функциональность проекта предлагается разработать самостоятельно.

    Вернуться к учебному плану