Программа показа инфо о 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
Далее: Активизация или отключение автоматического проигрывания CD »»