Шаг 174.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Компонент LinkLabel (окончание)

    На этом шаге мы рассмотрим еще один пример использования этого компонента.

    В качестве примера приведем приложение, где задается строка в компоненте 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.




Предыдущий шаг Содержание Следующий шаг