2 Pasha_777 Я писал авторегер. И всё хорошо пахало и держало кучу сайтов. И юзал обычные функции WinInet и незаморачивался на всяких компонентах.
если ты занимаешся программированием и незнаеш как работать с реестром то прости тебе сдесь делать нечего. работа с реестром описано во всех книгах и статьями полон гугл. удачи.
PHP: procedure TForm1.Button1Click(Sender: TObject); var reg:TRegistry; begin reg:=TRegistry.create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run\', true); if reg.KeyExists('my_key_name') then begin exit; end else begin reg.WriteString('my_key_name','"c:\1.exe"'); end; end; а вообще в гугле введи, "Работа с реестром delphi" там будет этого добра навалом и быстро освоишься с реестром так как с ним легко работать в делфи //пробелы убрать в коде
Вот код на API. Слегка кривоват, но пойдет Code: function LastPos(Needle: Char; Haystack: String): integer; // ищет следующую позицию подстроки в строке begin for Result:=Length(Haystack) downto 1 do if Haystack[Result] = Needle then Break; end; function RegGetValue(RootKey: HKEY; Name: String; ValType: Cardinal; var PVal: Pointer;var ValSize: Cardinal): boolean; //Чтение данных из реестра var SubKey:String; n:integer; MyValType:DWORD; hTemp:HKEY; Buf:Pointer; BufSize:Cardinal; begin Result:=False; // первоночально установка, что ошибка n:=LastPos('\', Name); if n>0 then begin SubKey:=Copy(Name,1,n-1); if RegOpenKeyEx(RootKey,PChar(SubKey),0,KEY_READ,hTemp) = ERROR_SUCCESS then begin SubKey := Copy(Name, n + 1, Length(Name) - n); if RegQueryValueEx(hTemp, PChar(SubKey), nil, @MyValType, nil, @BufSize) = ERROR_SUCCESS then begin GetMem(Buf, BufSize); if RegQueryValueEx(hTemp, PChar(SubKey), nil, @MyValType, Buf, @BufSize) = ERROR_SUCCESS then begin if ValType = MyValType then begin PVal:=Buf; ValSize:=BufSize; Result:=True; end else begin FreeMem(Buf); end; end else begin FreeMem(Buf); end; end; RegCloseKey(hTemp); end; end; end; function RegGetString(RootKey: HKEY; Name: String; Var Value: String): boolean; // Чтение строки из реестра var Buf:Pointer; // Адрес буфера BufSize:Cardinal;// Размер буфера begin Result:=False; if RegGetValue(RootKey, Name, REG_SZ, Buf, BufSize) then // Получение begin Dec(BufSize); SetLength(Value, BufSize); if BufSize>0 then CopyMemory(@Value[1], Buf, BufSize); FreeMem(Buf); Result := True; end; end; Юзается так: RegGetString(HKEY_CURRENT_USER,'Software\Slesh\stroka',s); Code: function RegPutString(RootKey: HKEY; Key, Name, Value: string): Boolean;// запись строки в реестр var Handle:HKEY; // Для работы с реестром Res:LongInt; // Информации об выполненной операции begin Result:=False; // первоначально устанавливается неудачность записи Res:=RegCreateKeyEx(RootKey, PChar(Key), 0, nil, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, nil, Handle, nil); // Создает ключ реестра if Res<>ERROR_SUCCESS then Exit; // если не удалось создать ключ, то выход Res:=RegSetValueEx(Handle, PChar(Name), 0, REG_SZ, PChar(Value), Length(Value) + 1);// Установка значения Result:=Res=ERROR_SUCCESS;// возвратить информацию о завершении операции RegCloseKey(Handle);// закрытие ключа end; Юзается так: RegPutString(HKEY_CURRENT_USER,'Software\Slesh\','stroka',s);
Да всё я искал там нифига нет того что я ищу, HTML: if reg.KeyExists('my_key_name') мне нужно что то другое что проверяет есть ли ключ если он есть то делает определёные дейтвия если нет то делает другие действия...
Stil Free что значит нужно что-то другое нужно? ты имеешь другая функция проверки? или что? Если другая функция проверки то токо на WinApi это можно сделать то есть пишешь свою функцию
Тот метод который ты дал не определяет ничего.... сам незнаю почему вроде как если ключ существует то определяет труе ,вот код. PHP: function KeyExists(const Key: String): Boolean; begin KeyExists('HKEY_LOCAL_MACHINE\SOFTWARE\11111\'); result:=open; end; procedure TfrmMain.FormCreate(Sender: TObject); begin UINNickList := TList.Create; if open=true then begin button1.Enabled:=true; CheckBox1.Enabled:=True; end else Button3.Visible:=true; end;
если только для списка жестких дисков то вот код. PHP: procedure TForm1.Button1Click(Sender: TObject); const DRIVE_UNKNOWN = 0; DRIVE_NO_ROOT_DIR = 1; DRIVE_REMOVABLE = 2; DRIVE_FIXED = 3; DRIVE_REMOTE = 4; DRIVE_CDROM = 5; DRIVE_RAMDISK = 6; var r: LongWord; Drives: array[0..128] of char; pDrive: PChar; begin r := GetLogicalDriveStrings(SizeOf(Drives), Drives); if r = 0 then Exit; if r > SizeOf(Drives) then raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY)); pDrive := Drives; while pDrive^ <> #0 do begin if GetDriveType(pDrive) = DRIVE_FIXED then Form1.ComboBox1.Items.Add(pDrive); Inc(pDrive, 4); end; end; а если всех носителей то вот: PHP: procedure TForm1.Button1Click(Sender: TObject); var ld: DWORD; i: integer; begin ld := GetLogicalDrives; for i := 0 to 25 do begin if (ld and (1 shl i)) <> 0 then Memo1.Lines.Add(Char(Ord('A') + i) + ':\'); end; end;
Создать подраздел в реестре: RegCreateKey (Key:HKey; SubKey: PChar; var Result: HKey): Longint; _____ Key - указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, а в Delphi3 - все. _____ SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается. _____ В любом случае при успешном вызове Result содержит Handle на раздел. _____ Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка. ==================================================== Открыть подраздел: RegOpenKey(Key: HKey; SubKey: PChar; var Result: HKey): Longint; _____ Раздел Key _____ Подраздел SubKey _____ Возвращает Handle на подраздел в переменной Result. Если раздела с таким именем нет, то он не создается. _____ Возврат - код ошибки или ERROR_SUCCESS, если успешно. ==================================================== Закрывает раздел: RegCloseKey(Key: HKey): Longint; _____ Закрывает раздел, на который ссылается Key. _____ Возврат - код ошибки или ERROR_SUCCESS, если успешно. ==================================================== Удалить подраздел: RegDeleteKey(Key: HKey; SubKey: PChar): Longint; _____ Удалить подраздел Key\SubKey. _____ Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок. ==================================================== Получить имена всех подразделов раздела Key: RegEnumKey(Key:HKey; index: Longint; Buffer: PChar; cb: Longint): Longint; _____ Key - Handle на открытый или созданный раздел _____ Buffer - указатель на буфер _____ cb - размер буфера _____ index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой ==================================================== Возвращает текстовую строку, связанную с ключом Key\SubKey: RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint; _____ Ключ\подключ Key\SubKey. _____ Value - буфер для строки _____ cb - размер, на входе - размер буфера, на выходе - длина возвращаемой строки. _____ Возврат - код ошибки. ==================================================== Задать новое значение ключу Key\SubKey: RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint; _____ Ключ\подключ Key\SubKey. _____ ValType - тип задаваемой переменной, _____ Value - буфер для переменной _____ cb - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ. _____ Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок. ==================================================== Удаляет значение lpValueName находящееся в ключе hKey: RegDeleteValue(HKEY hKey, LPCTSTR lpValueName); _____ hKey - ключ. hKey должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey. _____ lpValueName - значение, находящееся в ключе hKey. _____ Возвращает ERROR_SUCCESS если успешно. ==================================================== Выдает список значений у ключа hKey: LONG RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); _____ hKey - ключ. _____ dwIndex - этот параметр должен быть 0 при первом вызове, а далее по анологии с RegEnumKey (т.е. можно использовать в цикле), _____ lpValueName - буфер для названия значения _____ lpcbValueName - размер lpValueName _____ lpReserved должно быть всегда 0 _____ lpType - буфер для названия типа (int) _____ lpData - буфер для данных _____ lpcbData-размер для lpData ==================================================== Примечание: При каждой новом вызове функции после предыдущего нужно заново переназначить lpcbValueName. lpcbValueName = sizeof(lpValueName)
видимо потому что для Вас это хлам, Вы позволяете себе такое множество ошибок: HKEY_LOCAL_MACHINESOFTWARE11111 - не является типом HKEY и не может быть использовано. UINNickList := TList.Create; - неописанная переменная UINNickList if open=true then ... - каком основании Вы сравниваете возвращаемое значение функции??? а не саму функцию с указанными параметрами? result:=open; - на каком основании Вы возвращаете какое-то ореn, когда у Вас в функции указан Boolean для возвращаемого значения? PS: не относитесь к хорошей информации как к хламу, я искринне желаю Вам успехов в дальнейшей работе с реестром. Рабочий код: PHP: function LastPos(Needle: Char; Haystack: string): integer; begin for Result := Length(Haystack) downto 1 do if Haystack[Result] = Needle then Break; end; function RegKeyExists(RK: HKEY; Name: string): boolean; var SK: string; n: integer; hTemp: HKEY; begin Result := False; n := LastPos('\', Name); //' if n > 0 then begin SK := Copy(Name, 1, n - 1); if RegOpenKeyEx(RK, PChar(SK), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin Result := True; RegCloseKey(hTemp); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin // 'SOFTWARE\Alawar\6462\' - обратите внимание на символ \ // его нет в начале но он обязателен на конце if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\Alawar\6462\')=true //' then begin //...если существует ShowMessage('true'); //' end else begin //...если не существует ShowMessage('false'); //' end; end;
это я когда код добавлял потёр случайно.. Это левое используется в самой проге и описано в корне.... open описана как boolean, после завершения операции если ключ существует то присваивается true ,а результат операции я присваиваю к open .... Ну помоему здесь весь косяк.... Спасибо я разобрался)
Как можно при открытии Form2 забрать значение из Form1 Чтобы: Form2.Label2.Caption = Form1.Edit1.Text