Главная страница
    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.008 c
2-1134632711
Dmitriy G.
2005-12-15 10:45
2006.01.08
AV на FreeLibrary


14-1133544385
Uncle Archi
2005-12-02 20:26
2006.01.08
Matrix: The Path Of Neo


14-1134553613
Piter
2005-12-14 12:46
2006.01.08
3gp кодек


4-1130765521
Чапаев
2005-10-31 16:32
2006.01.08
Регистрация сервиса


8-1123179611
Logun
2005-08-04 22:20
2006.01.08
Управление Winamp-ом





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский