Delphi World - Программа показа инфо о CD-R
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Программа показа инфо о 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 
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay