На этом шаге мы рассмотрим еще один пример использования этого компонента.
В качестве примера приведем приложение, где задается строка в компоненте TextBox, из которой формируются два имени гиперссылок и адреса к объектам, заданные в другом компоненте TextBox. Текст приложения приведен ниже, а результат его работы - на рисунке 1.
. . . . private: /// <summary> /// Требуется переменная конструктора. // -------------- PasteTextString() -------------- // просматривает строку, удаляет из нее все "/", "*", одновремено // запоминая координаты слов в новой строке в массивах ArStart[],ArLen[] //managed-массивы будут и выходными void PasteTextString (String^ in, array <String^>^ out, array <int>^ ArStart, array <int>^ ArLen, array <int>^ Ns) { in->ToCharArray(); //это будет уже массивом символов String^ p; int Ar=0; //индекс для ArStart и ArLen //посимвольный просмотр строки String^ out1 = ""; int len = in->Length; for(int i=0, j=0; i < len; i++) { wchar_t s = in->ToCharArray()[i]; p = s.ToString(); if (p != "/" && p != "*") { out1 += p; j++; //считает кол-во добавок } if (p == "/") //запомнить позицию разделителя //(начало) в новой строке out1: ArStart[Ar] = j; //i; if (p == "*") { //запомнить позицию разделителя (длина) ArLen[Ar] = i - ArStart[Ar] - 1; Ar++; } } Ns[0] = Ar; out[0] = out1; } // --------------------------------------------------- . . . . // Кнопка "Выход" private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Close(); } // Кнопка "Формирование множества ссылок" private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { // Требуем, чтобы первая ссылка всегда посещалась // (т.е помечалась после щелчка на ее имени) linkLabel1->Links[ 0 ]->Visited = true; //формирование свойства Text с помощью TextBox: //кол-во строк в обоих TextBox'ах должно быть одинаковым linkLabel1->Text = ""; // Для выделения частей, которые попадут в качестве имени // гиперссылки, применяем разделители: // "/" - для обозначения начала текста, // а "*" - для обозначения конца текста // Формирование имен гиперссылок в свойстве Text и // начал и длин для свойства Links: String^ in; array <int>^ Ns = gcnew array <int> (1); array <String^>^ out = gcnew array <String^> (1); int tb1 = textBox2->Text->Length; in = textBox2->Text; array <int>^ ArStart = gcnew array <int> (tb1); array <int>^ ArLen = gcnew array <int> (tb1); PasteTextString(in, out, ArStart, ArLen, Ns); linkLabel1->Text = out[0]; // Формирование собственно гиперссылок в свойстве Links int NumLines = Ns[0]; //количество элементов массива for(int i = 0; i < NumLines; i++) { // координаты берутся из сформированных массивов // ArStart[], ArLen[], а сами ссылки - из TextBox1: linkLabel1->Links->Add( (int)ArStart[i], (int)ArLen[i], textBox1->Lines[i]); if(i==0) //для первой гиперссылки { // как будто мы ее уже посетили linkLabel1->Links[ 0 ]->Visited = true; linkLabel1->Links[ 0 ]->Enabled = true; } } } // Обработчик щелчка на имени гиперссылки private: System::Void linkLabel1_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) { //Гиперссылка, на которой был щелчок, помечается как посещенная: linkLabel1->Links[ linkLabel1->Links->IndexOf( e->Link )]->Visited = true; // Подготовка данных для команды Start (извлекается адрес объекта) String^ target = dynamic_cast <String^> (e->Link->LinkData); // Объект отыскивается и выводится на экран: System:Diagnostics::Process::Start( target ); }
Рис.1. Результат работы приложения
По щелчку на соответствующей гиперссылке откроется, соответственно, либо папка, либо будет осуществлен переход на сайт, адрес которого задан в гиперссылке.
На следующем шаге мы рассмотрим компонент PictureBox.