скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Программа показа инфо о 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 





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook