Одной из сильных сторон операционной системы для
Тем не менее, для рассматриваемых в книге версий
Задача темы: изучить методику и получить навыки программирования приложений, использующих динамическое распределение оперативной памяти.
Разработка: Приложение "Фотогалерея", позволяющее формировать списки и загружать рисунки, расположенные в различных местах диска.
Состав выполняемых функций:
Наращивание функциональности не предусматривается.
Защита данных – нет.
В качестве входных данных используются файлы галереи рисунков, файлы рисунков. Выходные данные программы – графическое отображение результатов в виде просматриваемого изображения рисунка, таблица просмотра записей галереи данных для SmartDevice
Шаг 1. Разработка графического интерфейса
Предусматривается одна форма с TabControl, включающим две закладки
– Просмотр и Галерея.

(рис 15.2) (рис 15.1) Закладка "Просмотр" содержит контейнер для просмотра
рисунков PictureBox, текстовое поле для комментария к рисунку,
текстовое поля для отображения имени файла рисунка (свойство ReadOnly
= True), кнопку "-" для изменения размеров рисунка, кнопку
"<" прокрутки просмотра фотогалереи назад, кнопку
">" для просмотра фотогалереи вперед и кнопку
"Добавить рисунок" (изначально свойство Visible=False ) для
занесения в базу данных пути и имени файла рисунка.
Закладка "Галерея" содержит для
просмотра 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. Создаем процедуру выборочного просмотра рисунков из галереи
Для клика строки пишем:
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);
}
Оставшуюся функциональность проекта предлагается разработать самостоятельно.
Одной из сильных сторон операционной системы для
Тем не менее, для рассматриваемых в книге версий
Задача темы: изучить методику и получить навыки программирования приложений, использующих динамическое распределение оперативной памяти.
Разработка: Приложение "Фотогалерея", позволяющее формировать списки и загружать рисунки, расположенные в различных местах диска.
Состав выполняемых функций:
Наращивание функциональности не предусматривается.
Защита данных – нет.
В качестве входных данных используются файлы галереи рисунков, файлы рисунков. Выходные данные программы – графическое отображение результатов в виде просматриваемого изображения рисунка, таблица просмотра записей галереи данных для SmartDevice
Шаг 1. Разработка графического интерфейса
Предусматривается одна форма с TabControl, включающим две закладки
– Просмотр и Галерея.

(рис 15.2) (рис 15.1) Закладка "Просмотр" содержит контейнер для просмотра
рисунков PictureBox, текстовое поле для комментария к рисунку,
текстовое поля для отображения имени файла рисунка (свойство ReadOnly
= True), кнопку "-" для изменения размеров рисунка, кнопку
"<" прокрутки просмотра фотогалереи назад, кнопку
">" для просмотра фотогалереи вперед и кнопку
"Добавить рисунок" (изначально свойство Visible=False ) для
занесения в базу данных пути и имени файла рисунка.
Закладка "Галерея" содержит для
просмотра 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. Создаем процедуру выборочного просмотра рисунков из галереи
Для клика строки пишем:
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);
}
Оставшуюся функциональность проекта предлагается разработать самостоятельно.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.