Многие приложения имеют в меню пункты Последние Открытые Файлы и это широко используется для удобства пользователей. Именно последние сохраненные файлы нужно поместить в порядке сохранения в пункты меню. Это дает возможность открывать последние файлы без поиска их на жестком диске. В нашей программе Delphi, а также программное обеспечение ПК будет четыре пункта последних сохраненных файлов. Вы можете изменить их количество в дальнейшем. Например, мы будем открывать графические точечные изображения.
Эта программа делится на несколько этапов:
- Открытие файла.
- Сохранение файла, как избранное.
- Работа с ним.
- Добавление его в меню.
- Вызов процедуры в создании или уничтожении формы.
- Чтение растрового изображения.
Для сохранения и чтения избранного мы будем использовать INI-файл. Использование INI-файла позволяет добиться высокой скорости.
Для начала добавьте на форму компоненты: TMainMenu, TImage и TOpenDialog. Создайте меню, как показано на картинке внизу. Имена пунктов меню с заголовком rec будут соответственно rec1, rec2, rec3 и т.д.
Затем изменим свойство AutoSize компонента TImage в True. Это позволит изменять размер изображения автоматически. Установите свойство Filter компонента TOpenDialog в Bitmap файлы|*.bmp. Измените свойство AutoHotKey компонента TMainMenu на maManual. Добавьте модуль IniFiles в разделе uses и напишите следующий код в разделе Private Declarations.
uses
{ … }, IniFiles;
private
{ Private declarations }
Recentlist: TStringList;
RecentChange: Boolean;
procedure OpenRecent;
procedure ManageRecent;
procedure AppleRecent(const FileName: String);
procedure SaveRecent;
procedure Open(const Filename: String);
end;
Теперь действия. Создаем INI-файл, который будет называться MyIniFile.ini. По умолчанию, он будет в папке Windows. Все операции будем выполнять при помощи TStringList.
Получаем пути к файлам из INI-файла
Эта процедура позволяет восстанавливать пути к различным файлам из StringList.
procedure TForm1.OpenRecent;
var
FileIni: TIniFile;
i: Integer;
St: String;
begin
RecentList:= TStringList.Create; //Создаем StringList
FileIni:= TIniFile.Create('MyIniFile.ini'); //Создаем INI-файл, если его нет
for i:= 1 to MaxRecent do // Для каждого из последних ...
begin
St:= FileIni.ReadString(
'Recent',Concat('rec',IntToStr(i)),'');
// Читаем пути к файлам
RecentList.Add(St); // Добавляем пути к файлам
end;
while RecentList.IndexOf('') <> -1 do
// Если есть пустые, удаляем
Recentlist.Delete(FavList.IndexOf(''));
end;
Сохраняем пути к файлам в INI-файл
Во-первых, мы проверяем, есть ли изменения в меню, а затем записываем в порядке открытия файлов.
procedure TForm1.SaveRecent;
var
FileIni: TIniFile;
i: Integer;
begin
if RecentChange then // Если было изменено, то...
begin
FileIni:= TIniFile.Create('MyFileIni.ini');
// Создаем INI-файл, если его нет
i:= 0; //Инициализируем переменную i в 0
while (i < (Recentlist.Count)) and (i < MaxRecent) do
// Для каждого элемента меню"rec"
begin
FileIni.WriteString('Recent',concat('rec',IntToStr(i+1)),
Recentlist.Strings[i]);
// Сохраняем пути к файлам из пунктов меню
Inc(i); // Увеличиваем переменную i
end;
end;
end;
Управляем StringList
Эта процедура позволяет выполнять определенные операции с StringList. Или мы добавляем новый путь к файлу и удаляем последний пункт, или изменяем положение одного из путей, если он уже был.
procedure TForm1.AppleRecent(const FileName: String);
begin
RecentChange:= True; // Указывает, что меню было изменено
if RecentList.IndexOf(FileName)= -1 then
// Если новый путь не найден, то...
begin
RecentList.Insert(0, FileName);
// Новый путь вначале
if RecentList.Count > MaxRecent then
// Если число строк превышает максимально допустимое
RecentList.Delete(MaxRecent);
// Удаляем последний путь к файлу
end
else // Иначе...
RecentList.Move(RecentList.IndexOf(FileName),0);
ManageRecent; // Вызываем процедуру ManageRecent
end;
Изменения в меню
Здесь мы работаем с пунктами меню.
procedure TForm1.ManageRecent;
var
MenuItem: TMenuItem;
i: Integer;
begin
i:= 0; // Инициализируем переменную i
while (i < (Recentlist.Count)) and (i < MaxRecent) do
//Для каждого элемента меню rec
begin
MenuItem:= TMenuItem(FindComponent(concat('rec', IntToStr(i+1))));
MenuItem.Visible:= True; // Отобразим меню
MenuItem.Caption:= RecentList.Strings[i];
// Сохраняем текст элемента меню в StringList
Inc(i); // Увеличим переменную i
end;
RecSeparator.Visible:= rec1.Visible;
// Если есть, то отображаем
end;
Когда форма будет создаваться или уничтожаться, теперь Вы должны вызывать некоторые процедуры.
procedure TForm1.FormCreate(Sender: TObject);
begin
OpenRecent; // Вызываем процедуру OpenRecent
ManageRecent; // Вызываем процедуру ManageRecent
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SaveRecent; // Вызываем процедуру SaveRecent
Recentlist.Free; // Уничтожаем объект
end;
Чтение растрового изображения
А вот и оставшаяся часть программы, которая будет читать растровое изображение, когда Вы нажмете Открыть или Последние файлы в меню.
procedure TForm1.OpenFile(const FileName: string);
begin
Image1.Picture.LoadFromFile(FileName);
// Открываем файл в компонент TImage
AppleRecent(FileName);
// Вызываем процедуру AppleRecent с параметром OpenDialog1.FileName
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then
OpenFile(OpenDialog1.FileName);
end;
procedure TForm1.rec1Click(Sender: TObject);
begin
OpenFile(rec1.Caption);
end;
procedure TForm1.rec2Click(Sender: TObject);
begin
OpenFile(rec2.Caption);
end;
procedure TForm1.rec3Click(Sender: TObject);
begin
OpenFile(rec3.Caption);
end;
procedure TForm1.rec4Click(Sender: TObject);
begin
OpenFile(rec4.Caption);
end;
Скачать файл можно здесь
|