|
Вопрос # 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;
Запускаем и пробуем - работает как часы.
С уважением.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|