| 
| 
 | Вопрос # 774/ вопрос открыт / | 
 |  Сдрасте всем! Такая ситуация:В компоненте TabControl на одной из вкладок размещается поле Memo. При нажатии на кнопку Button1 создается новая вкладка, с тем же поле Memo и с тем же текстом. Как сделать так, чтобы в новом поле Memo не было текста, в то время как в первом текст оставался (при условии, что вкладок может быть до 10)? И еще как осуществить сохранение поля Memo именно открытой вкладки в файл? Заранее спасибо!
 
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 21 июля 2007, 18:50
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Dron Здравствуйте, Трофимов Евгений!Фактически, описанный Вами пример - это многостраничный текстовый редактор. Его удобнее сделать с помощью динамического массива, каждый элемент которого будет являться текстом: var Texts: array of TStringList; Далее нужно следить за количеством элементов в нём. Добавление элемента: SetLength(Texts,Length(Texts)+1); Индексы элементов начинаются с нуля. Далее, чтобы привязать этот массив к TTabControl, проще всего использовать свойство TabIndex, которое определяет номер текущей вкладки (вкладки нумеруются тоже с нуля). Для отслеживания момента смены вкладки можно использовать событие OnChange(), в котором копировать текст из Memo в массив в соответствующий индекс (Texts[i].Clear; Texts[i].AddStrings(Memo.Lines);). Сохранение текста в файл осуществляется так: Texts[TabControl.TabIndex].SaveToFile(\'file_name\'); Таковы общие приёмы. Желаю удачи!
 
|  | Ответ отправил: Dron (статус: Студент)Время отправки: 21 июля 2007, 19:33
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо за помощь! |  Ответ #2. Отвечает эксперт: min@y™ Я написал довольно немалое количество таких текстовых редакторов и поэтому заявляю: для этих целей лучше использовать TPageControl! Если предполагается, что тип страниц будет одинаковый, то советую написать класс-наследник от TTabSheet и динамически создавать/убивать их на PageControl\'e. Это очень сильно сократит количество кода и облегчит отладку.
 З.Ы. Если не совсем понятно, могу написать пример простенького многостраничного редактора с использованием TPageContorl.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 23 июля 2007, 08:31
 
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 22 июля 2007, 12:48; участников в обсуждении: 2. 
|   | Евгений Eklmn (статус: Посетитель), 21 июля 2007, 22:28 [#1]:Поподробнее, пожалуйста о записи в такой массив и выводе из него. Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория) |  
|   | Dron (статус: Студент), 22 июля 2007, 12:48 [#2]:Хорошо. Приведу реальный пример. Размещаем на форме Memo1 (TMemo), Button1 (TButton) и SpinEdit1 (TSpinEdit, вкладка Samples). Объявляем наш массив текстов как глобальную переменную: 
 
 var
  Form1: TForm1;
  Texts: array of TStringList; Пусть при нажатии на кнопку текст из Memo1 добавляется в массив:
 
 
 procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(Texts,Length(Texts)+1);
  Texts[Length(Texts)-1]:=TStringList.Create;
  Texts[Length(Texts)-1].Clear;
  Texts[Length(Texts)-1].AddStrings(Memo1.Lines);
  SpinEdit1.MaxValue:=Length(Texts)-1;
  ShowMessage(\'Текст добавлен (всего текстов: \'+IntToStr(Length(Texts))+\')\');
end; Что здесь происходит:
 - Длина массива увеличивается на 1 (т.е. добавляется 1 элемент);
 - Созданный элемент создаётся как объект TStringList (без создания работать ничего не будет);
 - Из Memo1 копирует текст в этот элемент;
 - Для SpinEdit1 максимальное значение увеличивается на 1, чтобы количество текстов соответствовало диапазону чисел, выбираемых в SpinEdit.
 
 Теперь обработаем выбор числа в SpinEdit:
 
 
 procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.AddStrings(Texts[SpinEdit1.Value]);
end; Здесь мы просто копируем в Memo текст из массива, записанный в элементе с тем номером, который выбран в SpinEdit.
 
 Ну и наконец, при закрытии программы все элементы TStringList нужно уничтожить, иначе память останется условно-занятой:
 
 
 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var I: Integer;
begin
  for I:=0 to Length(Texts)-1 do
    Texts[I].Free;
  SetLength(Texts,0);
end;Запускаем и пробуем - работает как часы.
 С уважением. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |