Программа показа инфо о CD-R
Автор: Gestap
На форме Form1 размещаем элементы: ListBox1 (категория), ListBox2 (список программ), RichEdit1 (описание программы),
BitBtn1 (запуск/инсталляция), BitBtn2 (выход), BitBtn3 (О программе), Label1 (объясню позже). Вместо TBitBtn можно
использовать TButton.
Теперь щелкаем по форме, в инспекторе объектов Object Inspector выбираем закладку Events (события) и, дважды кликнув по
полю открывающегося списка, получаем в исходном тексте заготовку: procedure TForm1.FormActivate(Sender: TObject). Тут-то мы
и начнем писать свой код:
var // здесь размещаются переменные, которые будут доступны из всех процедур
RunPathList: array[1..999] of string; // список путей к запускаемым файлам
DescriptionList: array[1..999] of string;
// список описаний или пути к описаниям
ListFile: array[1..99] of string; // список файлов с информацией
Path: string; // корневой каталог диска
procedure TForm1.FormActivate(Sender: TObject); // сама процедура
var // тут размещаются переменные, которые будут доступны в пределах этой процедуры
i, n, k, Found: integer; // различные переменные счетчиков
SearchRec: TSearchRec; // переменная, используемая при поиске
ini: TIniFile; // готовимся к работе с .ini-файлами
Category, Name, Description, RunPath: string; // думаю, ясно из названий
begin
label1.Caption := '0'; // тут будет количество найденных программ
Path := ParamStr(0);
// ParamStr(n), где n0. При n=0 возвращает путь и имя файла к нашей запущенной программе. При n>0
возвращает параметры, которые были переданы программе при запуске(например:
autorun.exe / param1 name).Функция ParamCount
возвращает количество параметров, разделенных пробелом(т.е.n =
0...ParamCount)
Path := Path[1] + ':\';
// выделяем логический диск. Это первый символ. К нему добавляем приставку :\
i := 1;
Found := FindFirst(Path + 'list??.ini', faVolumeID, SearchRec);
// поиск первого файла по маске х:\list??.ini
while Found = 0 do // зацикливаемся, пока есть новые файлы
begin
if FileExists(Path + SearchRec.Name) = true then
// проверяем, что найден файл
begin
ListFile[i] := Path + SearchRec.Name;
// добавляем найденныйй файл в список
Inc(i); // увеличиваем переменную ? на единицу
end;
Found := FindNext(SearchRec); // выполняем поиск следующего файла
end;
FindClose(SearchRec); // освобождаем память которую занимает SearchRec
ListFile[i] := 'END';
// добавляем текст END в список файлов. Это затем, чтобы потом быстро определить конец списка
if ListFile[1] = 'END' then
ShowMessage('На диске ' + Path +
' не найдено ни одного конфигурационного файла.'); // если в
первой строчке списка значится
end, значит, не найдено ни одного файла.В траурной рамочке выводим сообщение
k := 1;
for i := 1 to 99 do // перебираем список от 1 до 99 в цикле:
begin
if ListFile[i] = 'END' then
Break; //:пока не встретим END
ini := TIniFile.Create(ListFile[i]); //открываем файл
label1.Caption := IntToStr(StrToInt(label1.Caption) + ini.ReadInteger('MAIN',
'ProgramsCount', 0)); // увеличиваем общее
число программ
for n := 1 to ini.ReadInteger('MAIN', 'ProgramsCount', 0) do
// Перебираем все записи от 1 до значения ProgramsCount,
указаного в файле
begin
Category := ini.ReadString('Program' + Format('%.3d', [n]), 'Category',
'без категории'); // Считываем категорию. Функцией
Format в данном случае задается формат чисел типа: 001, 002, 003...
if ListBox1.Items.IndexOf(Category) = -1 then
// выполняем поиск такой же категории среди уже находящейся в списке
ListBox1.В случае удачи функция возвращает номер позиции, в противном
случае - 1
begin
ListBox1.Items.Add(Category); // если нету - добавляем
end;
end;
end;
ini.Free;
label1.Caption := 'На этом диске ' + label1.Caption + ' программ(а).';
// делаем надпись более информативной для пользователя
end;
Следующим нашим шагом будет заполнение списка программ выбранной пользователем категории. Двойным щелчком мыши по ListBox1
получаем заготовку и заполняем ее:
procedure TForm1.ListBox1Click(Sender: TObject);
var
ini: TIniFile;
i, n, k: integer;
Category: string;
begin
k := 1;
ListBox2.Items.Clear;
RichEdit1.Text := ;
Label1.Caption := ;
for i := 1 to 99 do
begin
if ListFile[i] =
end then Break;
ini := TIniFile.Create(ListFile[i]);
for n := 1 to ini.ReadInteger(MAIN, ProgramsCount, 0) do
begin
Category := ini.ReadString(program + Format(%.3 d, [n]), Category, без
категории);
if Category = ListBox1.Items.Strings[ListBox1.ItemIndex] then
begin
ListBox2.Items.Add(ini.ReadString(program + Format(%.3 d, [n]), Name, без
имени));
RunPathList[k] := Path + ini.ReadString(program + Format(%.3 d, [n]),
Path, неизвестно);
DescriptionList[k]
:= ini.ReadString(program + Format(%.3 d, [n]), Description, По одному
названию все ясно!);
Inc(k);
end;
end;
end;
ini.Free;
end;
Когда пользователь выберет программу, щелкнув по ней, нужно вывести ее описание и подготовить путь для запуска. Этим
займется следующая процедура:
procedure TForm1.ListBox2Click(Sender: TObject);
var
n: integer;
begin
screen.Cursor := crHourGlass;
Label1.Caption := RunPathList[ListBox2.ItemIndex + 1];
if
FileExists(Path + DescriptionList[ListBox2.ItemIndex + 1]) then
RichEdit1.Lines.LoadFromFile(Path + DescriptionList[ListBox2.ItemIndex + 1])
else
RichEdit1.Text := DescriptionList[ListBox2.ItemIndex + 1];
screen.Cursor := crDefault;
end;
Теперь, когда все готово к запуску, пользователь может нажать кнопку BitBtn1 и запустить программу:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Result: Integer;
begin
Result := Windows.WinExec(PChar(Label1.caption), SW_SHOWDEFAULT);
if Result = 0 then
MessageDlg(Недостаточно ресурсов для
запуска программы, mtError, [mbOk], 0);
if Result = ERROR_BAD_FORMAT then
MessageDlg(Неправильный формат.ЕХЕ файла, mtError, [mbOk], 0);
if Result = ERROR_FILE_NOT_FOUND then
MessageDlg(Файл не найден#13#10+Label1.Caption, mtError, [mbOk], 0);
if Result = ERROR_PATH_NOT_FOUND then
MessageDlg(Неверный указанный путь#13#10+Label1.Caption, mtError, [mbOk],
0);
end;
Теперь о самом конфигурационном файле. Он должен иметь имя list??.ini, где ?? - это номер от 01 до 99. Обратите внимание:
числа от 1 до 9 имеют <незначащий> ноль. Структура файла соответствует стандартной для .ini-файла. В разделе [MAIN]
конфигурационного файла параметр ProgramsCount указывает на количество программ в этом файле. Каждая программа располагается
в своем разделе с уникальным трехзначным номером (от 001 до 999) в формате [Program???]. Вот пример файла для нашей
программы:
[MAIN]
ProgramsCount=3
[Program001]
Category="Категория"
Name="Название программы"
Description="Описание программы, или путь к описанию"
Path="путь к программе\имя файла.exe"
[Program002]
Category="Мои программы"
Name="Программа-меню для компакт-дисков"
Description="Описание моей программы"
Path="MyPrograms\autorun.exe"
[Program003]
Category="Мои программы"
Name="Моя лучшая программа"
Description="MyPrograms\readme.rtf"
Path="MyPrograms\MyProgram.exe"
Когда вы вставляете уже записанный компакт-диск в CD/DVD-ROM, по умолчанию операционка начинает поиск файла autorun.inf в
корневом каталоге диска. Содержимое этого файла напоминает структуру конфигурационного - думаю, назначение полей вам будет
понятно Код:
[autorun]
open=autorun.exe
icon=autorun.ico
|