Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
??-?????5_???? сеев_Куров.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
670.72 Кб
Скачать

Примеры обработчиков событий.

Обработчик события открыть прежде всего открывает диалог для выбора файла, содержимое которого должно быть загружено в таблицу. Имя выбранного файла используется при обращении к функции открытия файла. Имя файла необходимо преобразовать из типа String^ в тип char*. В случае ошибки открытия файла в окне сообщений выдается строка с информацией об этом. В случае успешного открытия файла выполняется цикл, в котором производится чтение структур из файла, преобразование полей структуры к строковому типу и занесение их в очередную строку таблицы. Перед циклом номер текущей строки таблицы устанавливается равным -1, а в цикле перед выводом в таблицу это значение каждый раз увеличивается на единицу. Для правильного отображения информации в таблице текущее количество строк должно быть больше количества строк, в которые выведены данные. Выводимые в таблицу данные преобразуются предварительно в тип String^.

Обработчик события Открыть

private: System::Void открытьToolStripMenuItem_Click(System::Object^ sender

, System::EventArgs^ e)

{

FILE *f;

char *g;

stud s;

int i;

int size=sizeof(s);

String ^st1,^s1,^s2,^s3,^s4,^s5,^s6;

OpenFileDialog^ openFile1 = gcnew OpenFileDialog;

if ( openFile1->ShowDialog()

== System::Windows::Forms::DialogResult::OK

&& openFile1->FileName->Length > 0 )

{

st1= (openFile1->FileName->ToString());

g=(char*)(void*)Marshal::StringToHGlobalAnsi(st1);

if((f=fopen(g,"rb"))==NULL)

{

MessageBox::Show("Ошибка открытия файла");

Application::Exit();

}

i=-1;

dataGridView1->RowCount=1;

TabClear();

rewind(f);

while(fread(&s,size,1,f)>0)

{

dataGridView1->RowCount++;

i=i+1;

s6=gcnew String(s.nom.ToString());

s1=gcnew String(s.grup);

s2=gcnew String(s.fam);

s3=gcnew String(s.oc[0].ToString());

s4=gcnew String(s.oc[1].ToString()) ;

s5=gcnew String(s.oc[2].ToString());

dataGridView1[0,i]->Value=s6;

dataGridView1[1,i]->Value=s1;

dataGridView1[2,i]->Value=s2;

dataGridView1[3,i]->Value=s3;

dataGridView1[4,i]->Value=s4;

dataGridView1[5,i]->Value=s5;

}

fclose(f);

}

}

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

private: System::Void сохранитьToolStripMenuItem_Click(System::Object^sender

,System::EventArgs^ e)

{

FILE *f;

char *g;

stud s;

int i;

int size=sizeof(s);

String ^st1

SaveFileDialog^ saveFile1 = gcnew SaveFileDialog;

if ( saveFile1->ShowDialog()

== System::Windows::Forms::DialogResult::OK

&& saveFile1->FileName->Length > 0 )

{

st1= (saveFile1->FileName->ToString());

g=(char*)(void*)Marshal::StringToHGlobalAnsi(st1);

if((f=fopen(g,"wb"))==NULL)

{

MessageBox::Show("Ошибка открытия файла");

Application::Exit();

}

i=0;

while(i<dataGridView1->RowCount-1)

{

s.nom=Convert::ToInt32(dataGridView1[0,i]->Value);

g=(char*)(void*)Marshal::StringToHGlobalAnsi

(dataGridView1[1,i]->Value->ToString());

strcpy(s.grup,g);

g=(char*)(void*)Marshal::StringToHGlobalAnsi

(dataGridView1[2,i]->Value->ToString());

strcpy(s.fam,g);

s.oc[0]=Convert::ToInt32(dataGridView1[3,i]->Value);

s.oc[1]=Convert::ToInt32(dataGridView1[4,i]->Value);

s.oc[2]=Convert::ToInt32(dataGridView1[5,i]->Value);

fwrite(&s,size,1,f);

i++;

}

fclose(f);

}

}

Обработчик события Очистить предусматривает присваивание всем ячейкам текущей таблицы значений пустых строк.

void TabClear(void)

{

int i,j;

for (i=0;i<Form1::dataGridView1->ColumnCount;i++)

for (j=0;j<Form1::dataGridView1->RowCount;j++)

Form1::dataGridView1[i,j]->Value="";

}

В качестве примера выполнения пункта меню работа1 рассмотрим поиск в файле структур с информацией о студентах, получающих стипендию, т.е. имеющих все оценки не хуже четверки. Для очередной считанной из файла структуры в цикле последовательно анализируются оценки, пока очередная оценка удовлетворяет поставленному условию и пока не проанализированы все оценки. Если после выхода из цикла номер анализируемой оценки превышает максимальный номер, то это означает, что все оценки оказались не ниже четверки.

Обработчик события выбора пункта меню Работа1

//Поиск студентов со стипендией

private: System::Void работа1ToolStripMenuItem_Clickо(System::Object^ ender

,System::EventArgs^ e)

{

FILE *f;

char *g;

stud s;

int i,j;

int size=sizeof(s);

String ^st1,^s1,^s2,^s3,^s4,^s5,^s6;

OpenFileDialog^ openFile1 = gcnew OpenFileDialog;

if (openFile1->ShowDialog()

== Sytem::Windows::Forms::DialogResult::OK

&& openFile1->FileName->Length > 0)

{

st1=openFile1->FileName->ToString();

g=(char*)(void*)Marshal::StringToHGlobalAnsi(st1);

if((f=fopen(g,"rb"))==NULL)

{

MessageBox::Show("Ошибка открытия файла");

Application::Exit();

}

fseek(f,0,SEEK_END);

dataGridView1->RowCount=2;

TabClear();

i=0;

dataGridView1[2,i]->Value="Студенты";

dataGridView1[3,i]->Value= "со стипендией";

rewind(f);

while(fread(&s,size,1,f)>0)

{

j=0;

while (s.oc[j]>3&&j<3)

j++;

if (j==3)

{

i++;

dataGridView1->RowCount++;

s6=gcnew String(s.nom.ToString());

s1=gcnew String(s.grup);

s2=gcnew String(s.fam);

s3=gcnew String(s.oc[0].ToString());

s4=gcnew String(s.oc[1].ToString()) ;

s5=gcnew String(s.oc[2].ToString());

dataGridView1[0,i]->Value=s6;

dataGridView1[1,i]->Value=s1;

dataGridView1[2,i]->Value=s2;

dataGridView1[3,i]->Value=s3;

dataGridView1[4,i]->Value=s4;

dataGridView1[5,i]->Value=s5;

}

}

if (i==0)

{

i++;

dataGridView1[2,i]->Value="Студентов";

dataGridView1[3,i]->Value= "со стипендией нет";

}

fclose(f);

}

}

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

Обработчик события выбора пункта меню Работа2

private: System::Void работа2ToolStripMenuItem_Click(System::Object^ sender

,System::EventArgs^ e)

{

FILE * f;

char *g;

stud s,z;

int i,nn,k;

int size=sizeof(s);

bool flag;

String ^st1;

OpenFileDialog^ openFile1 = gcnew OpenFileDialog;

if (openFile1->ShowDialog()

== System::Windows::Forms::DialogResult::OK

&& openFile1->FileName->Length > 0 )

{

st1= openFile1->FileName->ToString();

g=(char*)(void*)Marshal::StringToHGlobalAnsi(st1);

if((f=fopen(g,"rb+"))==NULL)

{

MessageBox::Show("Ошибка открытия файла");

Application::Exit();

}

fseek(f,0,SEEK_END);

nn=ftell(f)/size;

rewind(f);

k=0;

do

{

k++;

flag=true;

for (i=0;i<nn-k;i++)

{

fseek(f,i*size,SEEK_SET);

fread(&s,size,1,f);

fread(&z,size,1,f);

if (strcmp(s.fam,z.fam)>0)

{

flag=false;

fseek(f,-2*size,SEEK_CUR);

fwrite(&z,size,1,f);

fwrite(&s,size,1,f);

}

}

} while (!flag);

fclose(f);

}

}

Помимо рассмотренных обработчиков событий, связанных с выбором пунктов меню, целесообразно создать событие загрузка формы. Обработчик этого события должен задавать количество столбцов таблицы в соответствии с количеством полей рассматриваемых структур (в примере шесть столбцов) и начальное количество строк таблицы, ширину каждого столбца, а также озаглавливать столбцы таблицы:

Обработчик события Загрузка формы

private: System::Void Form1_Load(

System::Object^ sender, System::EventArgs^ e)

{

dataGridView1->ColumnCount=6;

dataGridView1->RowCount=2;

dataGridView1->Columns[0]->Width=100;

dataGridView1->Columns[1]->Width=100;

dataGridView1->Columns[2]->Width=100;

dataGridView1->Columns[3]->Width=60;

dataGridView1->Columns[4]->Width=60;

dataGridView1->Columns[5]->Width=60;

dataGridView1->Columns[0]->HeaderText="Номер";

dataGridView1->Columns[1]->HeaderText="Группа";

dataGridView1->Columns[2]->HeaderText="Фамилия";

dataGridView1->Columns[3]->HeaderText="Оценка 1";

dataGridView1->Columns[4]->HeaderText="Оценка 2";

dataGridView1->Columns[5]->HeaderText="Оценка 3";

TabClear();

}