Delphi __ Kompendium __ Roz6.pdf
(
895 KB
)
Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 6 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_6
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 6
Edytuj
Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ
»
Rejestry i pliki INI
Czy nie zastanawiało Cię nigdy, gdzie tak naprawdę te wszystkie programy przechowują informacje o
użytkowniku oraz opcje i inne ustawienia? W dziewięćdziesięciu procentach takich przypadków autorzy tychże
programów musieli skorzystać z Rejestru Windows lub plików INI. Być może nie wiesz dokładnie, czym jest
Rejestr lub pliki INI, więc na samym początku tego rozdziału poświęcę parę stron na omówienie budowy
zarówno Rejestru, jak i plików INI.
Spis treści
1 Czym jest Rejestr Windows?
1.1 Podstawowe klucze
1.2 Podstawowe pojęcia
2 Pliki INI
2.1 Budowa
3 Rejestr kontra plik INI
4 Klasa TRegistry
4.1 Tworzenie nowych kluczy
4.2 Otwieranie istniejących kluczy
4.3 Usuwanie kluczy
4.4 Dodawanie wartości
4.4.1 Pozostałe funkcje służące do zapisu danych
4.4.1.1 WriteTime
4.4.1.2 WriteFloat
4.4.1.3 WriteDate, WriteDateTime
4.4.1.4 WriteCurrency
4.4.1.5 WriteBool
4.4.1.6 WriteBinaryData
4.5 Odczyt danych
4.6 Inne funkcje operujące na Rejestrze
4.6.1 DeleteValue
4.6.2 GetDataInfo
4.6.3 GetDataSize
4.6.4 GetDataType
4.6.5 GetKeyInfo
4.6.6 GetKeyNames
4.6.7 GetValueNames
4.6.8 HasSubKeys
4.6.9 KeyExists
4.6.10 LoadKey
4.6.11 SaveKey
4.6.12 MoveKey
4.6.13 RootKey
5 Praktyczny przykład
6 Klasa TINIFile
6.1 Tworzenie nowego pliku INI
6.2 Zapisywanie danych
6.3 Odczyt danych
6.4 Funkcje związane z operacjami na sekcjach
6.4.1 ReadSection
6.4.2 ReadSections
6.4.3 ReadSectionValues
6.4.4 EraseSection
6.5 Przykładowy program
7 Podsumowanie
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ
»
W tym rozdziale:
dowiesz się, czym jest Rejestr Windows oraz pliki INI;
zaczniesz swobodnie korzystać z Rejestru Windows;
dowiesz się, jak uruchamiać swój program po starcie systemu;
nauczysz się korzystać z plików INI.
Czym jest Rejestr Windows?
Rejestr Windows to gąszcz informacji na temat ustawień systemowych oraz ustawień programów działających
na komputerze. Uszkodzenie rejestru może spowodować problemy z uruchomieniem systemu, należy zatem
obchodzić się z nim dość delikatnie.
Chociaż Microsoft może temu zaprzeczać, wiadomo, że Rejestr Windows jest jednym z najważniejszych
elementów systemu; zawiera wiele kluczy oraz wartości niezwykle istotnych dla działania systemu.
Rejestr Windows, a właściwie Edytor Rejestru, został przedstawiony na rysunku 6.1.
1 z 12
2009-03-14 15:33
Delphi :: Kompendium :: Rozdział 6 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_6
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 1.9504 sek. (zapytań SQL:
12)
Rysunek 6.1. Okno Edytora Rejestru
Program przedstawiony na rysunku 6.1 można uruchomić, wybierając z menu Start/Uruchom i wpisując w
okienku
regedit
.
Jako że bez zachowania należytej ostrożności można bardzo łatwo ?zepsuć? Rejestr,
zalecane jest utworzenie jego kopii zapasowej w postaci pliku *.reg. Można tego dokonać,
wybierając z menu Rejestr pozycję Eksportuj plik rejestru. W oknie musisz wpisać nazwę
pliku oraz zaznaczyć opcję Wszystko. Po zakończeniu operacji w podanej lokalizacji
utworzony zostanie plik, po którego uruchomieniu Rejestr zostanie uaktualniony według
wartości zawartych w kopii.
Podstawowe klucze
Rejestr Windows dzieli się na kilka podstawowych kluczy głównych: HKEY_CLASSES_ROOT,
HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG i HKEY_DYN_DATA.
Tylko w tych kluczach głównych możesz tworzyć nowe klucze oraz wartości. Właściwie powinieneś napisać swój
program tak, aby tworzył nowe klucze w gałęzi HKEY_CURRENT_USER, gdyż to ona jest przeznaczona dla
programów zewnętrznych, ale oczywiście nic nie stoi na przeszkodzie, aby wpisywać dane do innych gałęzi.
Podstawowe pojęcia
Rejestr Windows dzieli się na
klucze
oraz
wartości
. W celu zrozumienia zasady działania Rejestru oraz dalszej
terminologii używanej przeze mnie w tym rozdziale należy wyjaśnić te pojęcia.
Można przyjąć, że kluczami są gałęzie (foldery) przedstawione w Edytorze Rejestru. Takie foldery (klucze)
mogą zawierać bardzo wiele wartości, które są danymi. W każdym kluczu znajduje się tzw. wartość domyślna,
która nie zawiera żadnych danych. Istnieje możliwość tworzenia kilku typów wartości: tekstowa, binarna
lub
DWORD
. Wartość tekstowa służy do przechowywania tekstu. Wartość
DWORD
to najzwyklejsze dane w postaci
liczb, natomiast wartość binarna umożliwia przechowywanie większej ilości danych.
Pliki INI
Pliki INI to zwykłe pliki tekstowe z rozszerzeniem
*.ini
, o specyficznej budowie opartej na jednolitym
standardzie. Pliki INI, podobnie jak Rejestr, służą do przechowywania ustawień aplikacji. Dane te są jednak
przechowywane w plikach, co daje w efekcie mniejszy poziom bezpieczeństwa (każdy może otworzyć sobie taki
plik w Notatniku Windows) niż Rejestr.
Budowa
Podstawowym kryterium podziału plików INI są sekcje. W każdej sekcji mogą znajdować się różne klucze i
wartości. Przykładowa zawartość pliku INI (w tym przypadku jest to plik win.ini) wygląda tak:
[Desktop]
Wallpaper=(None)
TileWallpaper=1
WallpaperStyle=0
W tym przypadku sekcją jest wiersz
[Desktop]
. Wymagane jest wpisywanie nazwy nowej sekcji w nawiasach
kwadratowych, dzięki czemu przy odwołaniu do sekcji w programie system ?wie?, które wiersze będą nas
interesowały.
W sekcji mogą znajdować się klucze i wartości, oddzielone znakiem równości.
Klucz=wartość
Do wartości mogą być przypisywane różne dane, takie jak liczby czy tekst. Każda wartość musi być oddzielona
od klucza znakiem nowego wiersza. Oznacza to, że każdy klucz musi być zapisany jeden pod drugim.
Istnieje możliwość stosowania w plikach INI komentarzy. Komentarze, tak jak w języku programowania, nie są
interpretowane przez system. W plikach INI istnieją jedynie komentarze jednowierszowe, które muszą
rozpoczynać się od znaku średnika (;).
Rejestr kontra plik INI
Czasem podczas projektowania aplikacji będziesz musiał zastanowić się, czy zastosować pliki INI czy może
Rejestr Windows. Jest to wbrew pozorom ważna decyzja, która podjęta musi zostać po przemyśleniu paru
spraw.
Rejestr Windows daje większe bezpieczeństwo, gdyż użytkownik chcąc zmienić pewne wartości, będzie musiał
wyszukiwać je w całym gąszczu różnych kluczy. Zawartość pliku INI może być zmieniona praktycznie przez
każdego, nawet początkującego. Należy więc wziąć pod uwagę to, że użytkownik nieumyślnie może
spowodować zmianę zawartość pliku INI, a tym samym doprowadzić do nieprawidłowego funkcjonowania
programu.
2 z 12
2009-03-14 15:33
RSS
|
Forum
|
Pastebin
|
Regulamin
|
Pomoc
|
Usuń
cookies
|
Prawa autorskie
|
Kontakt
|
Reklama
Delphi :: Kompendium :: Rozdział 6 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_6
Z drugiej jednak strony można skorzystać z plików INI, aby dać możliwość zmiany pewnych ustawień w
programie. Taką konstrukcję zastosowali projektanci interpretera PHP. Użytkownik chcąc zmienić pewne
ustawienia, musi ?pogrzebać? trochę w pliku INI. Jest to jednak opcja przeznaczona dla bardziej
zaawansowanych programistów.
Ostatni aspekt. Podczas usunięcia systemu skasowany zostanie także rejestr Windows, a tym samym
ustawienia naszego programu. Plik INI może być umieszczony w katalogu z programem, tak więc reinstalacja
systemu nie oznacza utracenia zapisanych w owym pliku danych.
Klasa TRegistry
VCL zwalnia nas w dużym stopniu z mozolnego korzystania z funkcji API w celu operowania na Rejestrze.
Udostępnia bowiem klasę
TRegistry
, która znajduje się w module
Registry
. Pierwszą rzeczą, którą musisz
wykonać, jest dodanie do listy
uses
modułu
Registry
.
Tworzenie nowych kluczy
Podstawową operacją na Rejestrze jest otwarcie konkretnego klucza, zamknięcie go po zakończeniu operacji lub
stworzenie nowego.
Stworzenie nowego klucza realizuje metoda
CreateKey
, w której należy podać jedynie nazwę klucza.
procedure
TMainForm.
btnCreateClick
(
Sender:
TObject
)
;
var
Reg : TRegistry;
begin
Reg := TRegistry.
Create
;
Reg.
CreateKey
(
'Moja aplikacja 1.0'
)
;
Reg.
Free
;
end
;
Klasa
TRegistry
jest zwykłą klasą VCL, należy więc utworzyć ją przed rozpoczęciem korzystania z Rejestru, a
po zakończeniu ? zwolnić za pomocą metody
Free
.
Domyślnie wszystkie operacje na rejestrze odbywają się na kluczu głównym
HKEY_CURRENT_USER
. Jeżeli chcesz dokonać zmian, w innym kluczu głównym należy
przypisać jego nazwę do zmiennej
RootKey
z klasy
TRegistry
.
Powyższy kod spowoduje tworzenie nowego klucza
Moja Aplikacja 1.0
w kluczu głównym
HKEY_CURRENT_USER
(rysunek 6.2).
Rysunek 6.2. Zaznaczony nowo utworzony klucz w Rejestrze Windows
Otwieranie istniejących kluczy
Metoda
OpenKey
z klasy
TRegistry
realizuje otwarcie istniejącego klucza lub utworzenie nowego. Tak
naprawdę do tworzenia nowych kluczy rzadko stosowana jest funkcja
CreateKey
? znacznie częściej
programiści korzystają z metody
OpenKey
, która może zarówno otwierać klucze, jak i tworzyć nowe!
Oto przykład otwarcia istniejącego klucza:
procedure
TMainForm.
btnOpenClick
(
Sender:
TObject
)
;
var
Reg : TRegistry;
begin
Reg := TRegistry.
Create
;
if
Reg.
OpenKey
(
'Moja aplikacja 1.0'
,
False
)
then
ShowMessage
(
'Klucz otwarty!'
)
else
ShowMessage
(
'Błąd!'
)
;
Reg.
Free
;
end
;
Funkcja
OpenKey
zwraca
True
, jeżeli klucz został otwarty, lub
False
, jeżeli nie udało się otworzyć klucza. Drugi
parametr owej funkcji określa, czy klucz ma zostać utworzony w przypadku, gdy nie istnieje (
True
), lub czy
funkcja po prostu ma zwrócić wartość
False
(nie udało się utworzyć ani otworzyć klucza).
Po zakończeniu korzystania z kluczy należy klucz zamknąć poleceniem
CloseFile
, aczkolwiek nie jest to
wymagane, jeżeli jednocześnie kończysz używanie klasy ? wówczas należy wywołać metodę
Free
, która
zamknie klucz oraz zwolni samą klasę. Metoda
CloseFile
jest używana w przypadku, gdy operujesz na wielu
kluczach Rejestru. Przykładowo: otwierasz jeden, wprowadzasz stosowne zmiany, zamykasz klucz i otwierasz
inny.
3 z 12
2009-03-14 15:33
Delphi :: Kompendium :: Rozdział 6 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_6
Usuwanie kluczy
Chcąc usunąć klucz, należy wywołać metodę
DeleteKey
. Jej użycie jest proste, ponieważ posiada tylko jeden
parametr, który jest nazwą klucza. Funkcja zwraca True, jeżeli operacja się powiedzie, lub ? w przeciwnym
wypadku ?
False
.
...
Reg.DeleteKey('Moja Aplikacja 1.0');
...
Poczyńmy jeszcze jedno zastrzeżenie, żeby uniknąć nieporozumień! Parametr w funkcjach
OpenKey
,
CreateKey
i
DeleteKey
to w rzeczywistości nie nazwa klucza, lecz ścieżka do niego. Nasz klucz może być umieszczony w
sporym ?gąszczu? innych kluczy, stąd należy podać pełną ścieżkę:
Reg.
DeleteKey
(
'Klucze\Inny klucz\Moja Aplikacja 1.0'
)
;
Dodawanie wartości
Bardzo łatwo zapamiętać metody powodujące zapis danych do Rejestru, gdyż nazywane są one według wzorca
WriteXXX, gdzie w miejsce XXX należy podać typ danych przeznaczonych do dodania. Czyli np. chcąc zapisać w
Rejestrze dane typu String, stosujemy funkcję
WriteString
.
Każda z funkcji zapisujących dane posiada dwa parametry. Pierwszy z nich to nazwa wartości w kluczu, a drugi
parametr to dane do zapisania. Przykładowo jeśli chcesz zapisać w Rejestrze dane typu
String
, musisz
skorzystać z kodu:
Reg.
WriteString
(
'City'
, edtCity.
Text
)
;
Spowoduje to utworzenie lub nadpisanie wartości
City
z danymi zapisanymi w komponencie
edtCity
.
Oto przykład zapisania kilku wartości do klucza:
procedure
TMainForm.
btnSaveClick
(
Sender:
TObject
)
;
var
Reg : TRegistry;
begin
Reg := TRegistry.
Create
;
if
Reg.
OpenKey
(
'Moja aplikacja 1.0'
,
False
)
then
ShowMessage
(
'Klucz otwarty!'
)
else
ShowMessage
(
'Błąd!'
)
;
Reg.
WriteString
(
'FName'
, edtFName.
Text
)
;
Reg.
WriteString
(
'SName'
, edtSName.
Text
)
;
Reg.
WriteString
(
'City'
, edtCity.
Text
)
;
Reg.
WriteString
(
'Country'
, edtCountry.
Text
)
;
Reg.
WriteInteger
(
'Pesel'
,
StrToInt
(
edtPesel.
Text
))
;
Reg.
Free
;
end
;
Na rysunku 6.3 przedstawiony jest klucz Rejestru, który przedstawia zapisane i wprowadzone przez program
wartości.
Rysunek 6.3. Zapisane przez program wartości
Pozostałe funkcje służące do zapisu danych
Zapoznałeś się już z dwiema funkcjami służącymi do zapisu danych ?
WriteInteger
oraz
WriteString
.
Oczywiście nie są to jedyne funkcje ? wszystkie pozostałe opisuję i przedstawiam poniżej:
WriteTime
procedure
WriteTime
(
const
Name
:
String
; Value:
TDateTime
)
;
Funkcja
WriteTime
służy do zapisu czasu. Dzięki niej możesz np. zapisać czas ostatniego uruchomienia
programu.
...
Reg
.
WriteTime
(
'Czas'
,
Now
)
;
...
4 z 12
2009-03-14 15:33
Delphi :: Kompendium :: Rozdział 6 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_6
Funkcja Now zwraca aktualny czas. Chcąc zapisać także datę, zastosuj funkcję
WriteDate
lub
WriteDateTime
.
WriteFloat
procedure
WriteFloat
(
const
Name
:
String
; Value:
Double
)
;
Funkcja
WriteFloat
spowoduje stworzenie w Rejestrze nowego klucza z wartością zmiennoprzecinkową typu
Double
.
WriteDate, WriteDateTime
procedure
WriteDate
(
const
Name
:
String
; Value:
TDateTime
)
;
procedure
WriteDateTime
(
const
Name
:
String
; Value:
TDateTime
)
;
Wywołanie pierwszej funkcji spowoduje utworzenie w Rejestrze klucza zawierającego jedynie datę, a drugiej
(
WriteDateTime
) ? zapisanie daty oraz czasu.
WriteCurrency
procedure
WriteCurrency
(
const
Name
:
String
; Value:
Currency
)
;
Procedura
WriteCurrency
powoduje zapisanie w Rejestrze wartości zmiennoprzecinkowej typu
Currency
.
WriteBool
procedure
WriteBool
(
const
Name
:
String
; Value:
Boolean
)
;
Jeżeli chcesz zapisać w Rejestrze wartość typu
Boolean
(
True
lub
False
), skorzystaj z procedury
WriteBool
.
WriteBinaryData
procedure
WriteBinaryData
(
const
Name
:
String
;
var
Buffer; BufSize:
Integer
)
;
Procedura
WriteBinaryData
umożliwia zapisanie w Rejestrze wartości nieokreślonej. Drugi parametr musi
zawierać wskazanie zmiennej (bufor), a ostatni parametr określa rozmiar bufora.
Maksymalna wielkość danych, jakie mogą być zapisane w Rejestrze, to 2 048 bajtów.
Przykład użycia:
var
Buffer :
array
[
0
..
255
]
of
char
;
...
Buffer
:=
'Jakiś tekst może być lub coś innego'
;
Reg.
WriteBinaryData
(
?Nazwa?, Buffer,
SizeOf
(
Buffer
))
;
...
Odczyt danych
Wiadomo, że zapisujemy dane równie często, jak je odczytujemy. Odczytywanie i zapisywanie danych jest
bardzo podobne ? różnią się jedynie nazwy poleceń. W trakcie odczytywania danych stosujemy polecenia
ReadXXX, gdzie XXX jest nazwą typu do odczytania. Kolejna różnica jest taka, że polecenia z rodziny ReadXXX
to funkcje, a nie procedury ? jak to miało miejsce podczas zapisywania danych.
Posłużmy się przykładem z poprzedniego podpunktu. Tam program zapisywał w Rejestrze parę informacji,
takich jak imię, nazwisko itp. Poniższy przykład ilustruje sposób odczytu tych danych:
procedure
TMainForm.
FormCreate
(
Sender:
TObject
)
;
var
Reg : TRegistry;
begin
Reg := TRegistry.
Create
;
if
Reg.
KeyExists
(
'Moja aplikacja 1.0'
)
then
begin
Reg.
OpenKey
(
'Moja aplikacja 1.0'
,
False
)
;
edtFName.
Text
:= Reg.
ReadString
(
'FName'
)
;
edtSName.
Text
:= Reg.
ReadString
(
'SName'
)
;
edtCity.
Text
:= Reg.
ReadString
(
'City'
)
;
edtCountry.
Text
:= Reg.
ReadString
(
'Country'
)
;
edtPesel.
Text
:=
IntToStr
(
Reg.
ReadInteger
(
'Pesel'
))
;
end
;
Reg.
Free
;
end
;
Kod jest umieszczony w zdarzeniu
OnCreate
, co spowoduje odczytanie danych zaraz po uruchomieniu aplikacji.
Zauważ, że przed samym procesem odczytu następuje sprawdzanie, czy taki klucz istnieje (funkcja
KeyExists
). Może się bowiem zdarzyć tak, że program jest uruchamiany po raz pierwszy i taki klucz nie
istnieje.
Listing 6.1 przedstawia cały kod programu, a na rysunku 6.4 zaprezentowano program w trakcie działania.
Listing 6.1. Kod źródłowy modułu
unit
MainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Registry, StdCtrls;
type
TMainForm =
class
(
TForm
)
btnSave: TButton;
gbInfo: TGroupBox;
lblFName: TLabel;
lblSName: TLabel;
lblCity: TLabel;
lblCountry: TLabel;
5 z 12
2009-03-14 15:33
Plik z chomika:
Wiewioor
Inne pliki z tego folderu:
Delphi __ Kompendium __ Roz1.pdf
(1299 KB)
Delphi __ Kompendium __ Roz10.pdf
(777 KB)
Delphi __ Kompendium __ Roz11.pdf
(1764 KB)
Delphi __ Kompendium __ Roz12.pdf
(834 KB)
Delphi __ Kompendium __ Roz13.pdf
(1951 KB)
Inne foldery tego chomika:
■ePub
A.B Strugaccy
Ann Rice - Śpiąca królewna
Ćwiek Jakub
Ebooki-EPUB-PL-MegaPack
Zgłoś jeśli
naruszono regulamin