Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Вниз

Memo и строки   Найти похожие ветки 

 
Neiroman ©   (2005-12-18 02:37) [0]

Здравствуйте! Подскажите, пожалуйста, как решить проблему: есть текстовый файл и Memo. Как в Memo из этого файла загрузить строки, но не все (LoadFromFile не подходит, т.к. тогда слишком много файлов - это вообще-то должны загружаться описания для книг), а, например, с 3 по 5ую, для другого итема - с 5 по 7. Как это реализовать?


 
Джо ©   (2005-12-18 03:06) [1]

Вам повезло -  сегодня производится предновогодняя раздача уцененного кода.
----
Объявляем два формальных типа данных.

 TIntArray = array of Integer;

 TFileRecord = record
   FileName: string;
   StringNumbers: TIntArray;
 end;

Заводим две вспомогательные формальные функции:

function Integers (Arr: array of Integer): TIntArray;
var
 I: Integer;
begin
 SetLength (Result, Length(Arr));
 for I := 0 to High (Arr) do
   Result[I] := Arr[I];
end;

function FileRec (FileName: string;
 StrNumbers: array of Integer): TFileRecord;
begin
 Result.FileName := FileName;
 Result.StringNumbers := Integers(StrNumbers)
end;

Пишем процедуру, загружающую из файла строки с указанными номерами и помещающую их в указанный экз. TStrings.
Хинт: поле для общирной оптимизации, желательно переписать с использованием хотя бы ReadLn().

procedure LoadStringsFromFile (ALines: TStrings;
 FileRec: TFileRecord);
var
 TmpList: TStrings;
 I: Integer;
begin
 TmpList := TStringList.Create;
 try
   TmpList.LoadFromFile(FileRec.FileName);
   for I := 0 to High (FileRec.StringNumbers) do
     ALines.Add(TmpList[I])
 finally
   TmpList.Free;
 end;
end;

Наконец, итоговая процедура, умеющая работать с целым массивом файлов и соответствующих им строк:

procedure LoadStringsFromFiles (ALines: TStrings;
 FileRecords: array of TFileRecord);
var
 I: Integer;
begin
 for I := 0 to High (FileRecords) do
   LoadStringsFromFile(ALines, FileRecords[I]);
end;

Выглядит она просто, а пользоваться ей еще проще:

procedure TForm1.Button1Click(Sender: TObject);
begin
 LoadStringsFromFiles(Memo1.Lines,
   [
     FileRec ("c:\file1.txt",[1,2,5]),
     FileRec ("c:\file2.txt",[20,192])
   ]
 );
end;

Загружаем в Memo из файла file1.txt строки 1,2,5, а из файла file2.txt строки 2 и 192. Вуаля.
В качестве домашнего задания оставляется оптимизация процедуры LoadStringsFromFile  и придумывания способа задания интервалов "с...по....".



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.007 c
4-1131022013
Yus
2005-11-03 15:46
2006.01.08
Бысрое копирование


14-1134488095
Pazitron_Brain
2005-12-13 18:34
2006.01.08
Полезная программа для урока информатики


2-1134892674
dreamse
2005-12-18 10:57
2006.01.08
Проблема с получением результата с SQL запроса


1-1133930103
Frozzen
2005-12-07 07:35
2006.01.08
Подскажите как программоно устанавливать шрифт в винду?


3-1131972079
Карелин Артем
2005-11-14 15:41
2006.01.08
Двойная запись ошибки в журнал системы. Нормально ли это?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский