PDA

Показать полную графическую версию : Добавление значений реестра


Karbid87
16-02-2014, 23:00
Здравствуйте. Прошу помощи. Я пытаюсь добавить значения в реестр, но не получается.
Вот что есть :
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Registry, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
// Переменная для работы с реестром
Reg: TRegistry;
begin
// Инициализация переменной реестра
Reg := TRegIniFile.Create();
// Выбираем корневой каталог
Reg.RootKey := HKEY_LOCAL_MACHINE;
// Открываем разделы
Reg.OpenKey('SOFTWARE\Programma\Razdel', True);
// Записываем значение
// Ниже строковые
Reg.WriteString('DataFolder', 'C:\\ProgramData\\Programma\\Razdel');
Reg.WriteString('ProgramFolder', 'C:\\Program Files\\Programma\\Razdel');
Reg.WriteString('SetupFolder', 'C:\\Program Files\\Programma\\Razdel\\setup');
Reg.WriteString('SetupLog', 'C:\\ProgramData\\Programma\\Razdel\\Log.log');
Reg.WriteString('Version', '1.0');
// Параметр DWORD (32 бита)
Reg.WriteExpandString('SetupVersion', '000000a1');

// Тут надо мультистроковый (REG_MULTI_SZ)
// Тут надо двоичный параметр (REG_BINARY)

// Закрываем ключ
Reg.CloseKey;
// Освобождаем память
Reg.Free;
end;
end.

Еще на форме будет несколько кнопок. Расположены и действовать они будут следующим образом:
Button1 - для Windows 7 x64
Button2 - для Windows 7 x86
Button3 - для Windows 8 x64
Button4 - для Windows 8 x64
Button5 - для Windows XP

Для каждой кнопки свои значения. Сейчас в коде прописаны действия для Button1. Необходимо еще написать несколько процедур для проверки Windows и разрядности. И по этим результатам ненужные кнопки были бы неактивны, но видимы.
Был бы очень благодарен за помощь.

opel431
17-02-2014, 06:31
Откройте для себя JEDI Code Library - http://wiki.delphi-jedi.org/wiki/JEDI_Code_Library и решите все проблемы сразу!

Karbid87
17-02-2014, 11:05
opel431, ничего не понял в этой библиотеке

opel431
17-02-2014, 11:20
ничего не понял в этой библиотеке »
Что Вы не поняли? Установите Jcl + Jcl-API (вполне достаточно для комфортной работы), или весь пакет (Jcl+Jvcl).
Для работы с реестром необходимо в uses прописать JclRegistry и вызывать нужные Вам функции:
RegWriteBinary, RegWriteMultiString!

Для работы с информацией о версии и архитектуре, аналогично - JclSysInfo:
IsWin7, IsWindows64 - возвратят Вам True (or False), если не Seven и не x64. Затем уж что хотите (Button1.Enabled = IsWin7 or not IsWindows64 или через блок begin...end т.д.).
GetWindowsVersionString - вернет Вам в строку все что можно.

Там прекрасный help и хоть и куцые но есть примеры!

И проверяйте открытие ключа, а если не открыли? - if (Reg.OpenKey....) then ведь для этого функция и возвращает логику завершения (Boolean).
Лучше весь блок делать в try..finally..end;

Karbid87
17-02-2014, 11:38
opel431, не устанавливается вообще.
не могли бы вы написать мне точные строки. там всё на английском и я не пойму. вы уж меня извините

opel431
17-02-2014, 13:40
не устанавливается вообще. »
Какие извинения!
Скачиваете, распаковываете в папку (например JEDI), из папки запускаете Install.bat, переходите на вкладку согласия с лицензией, внизу, ставите чек - I agree with the terms of the... ( "Я согласен с условиями лицензии MLP 1.1 "), на следующей вкладке Delphi или RADStudio (ваша версия Delphi) выбираете путь к пакетам BPL (C:\Users\Public\Documents\RAD Studio\8.0\Bpl) и путь к DCP (C:\Users\Public\Documents\RAD Studio\8.0\Bpl). Жмете кнопку Install.

Karbid87
17-02-2014, 14:17
opel431, так всё таки установил с вашей помощью.
Теперь при компиляции стал ругаться: [Pascal Fatal Error] Project1.dpr(1): F1027 Unit not found: 'System.pas' or binary equivalents (.dcu)

Прошу вас напишите мне листинг программы с помощью JclRegistry, который у меня в первом посте. И добавьте туда недостающие строки с какими-либо параметрами и значениями.

opel431
17-02-2014, 15:14
Теперь при компиляции стал ругаться: »
Переменные среды проекта (проверьте соответствие путей к папкам) смотрите в ->Tools->Options->Environmental Variables!
Прошу вас напишите мне листинг программы с помощью JclRegistry »
Сделаю, но может вечером - я, с планшета.


Вариаций много, для общего понимания достаточно. Код с "коленки", так что, проверяйте.

uses JclRegistry, JclSysInfo, JclStrings;

....

procedure TForm1.FormCreate(Sender: TObject);
begin
if IsWin7 then
...;

if IsWindows64 then
...;
end;

......

var
RootKey: HKEY;
PathKEY:String;
begin
RootKey := HKEY_LOCAL_MACHINE;
SubKey := 'SOFTWARE\Programma\Razdel';

if not RegKeyExists(RootKey, PathKEY) then
ShowMessage('.....! ')
else
begin
if RegValueExists(RootKey, SubKey, 'DataFolder') then // если хотите проверять наличие параметра
RegWriteString(RootKey, SubKey, 'DataFolder', 'C:\\ProgramData\\Programma\\Razdel'); // обычная строка с завершающим нулем.

if RegValueExists(RootKey, SubKey, 'SetupVersion') then
RegWriteDWORD(RootKey, SubKey, 'SetupVersion', 123); // 32-разрядное число (смотрите как записать, то-ли десятичное, то-ли как шестнадцатиричное. Есть перегруженная версия с доп. параметрами)

if RegValueExists(RootKey, SubKey, '.....') then
RegWriteInteger(RootKey, SubKey, '.....', 1); // целое

if RegValueExists(RootKey, SubKey, '.....') then
RegWriteString(RootKey, SubKey, '.....', REG_EXPAND_SZ, '%SystemRoot%\System32\shell32.dll,50'); // ссылки на переменные среды


// ?* смотрите функцию StringsToMultiSz в Help!
if RegValueExists(RootKey, SubKey, '.....') then
RegWriteString(RootKey, SubKey, '.....', REG_MULTI_SZ, (?*)); // Последовательность строки с нулевым символом, завершающийся пустой строкой
end;
end;




© OSzone.net 2001-2012