Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 774

/ вопрос открыт /

Сдрасте всем! Такая ситуация:
В компоненте TabControl на одной из вкладок размещается поле Memo. При нажатии на кнопку Button1 создается новая вкладка, с тем же поле Memo и с тем же текстом. Как сделать так, чтобы в новом поле Memo не было текста, в то время как в первом текст оставался (при условии, что вкладок может быть до 10)? И еще как осуществить сохранение поля Memo именно открытой вкладки в файл? Заранее спасибо!

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений 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

Евгений Eklmn (статус: Посетитель), 21 июля 2007, 22:28 [#1]:

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

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;

Запускаем и пробуем - работает как часы.
С уважением.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.04 сек.