Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.23;
Скачать: CL | DM;

Вниз

Сохранить число в реестр   Найти похожие ветки 

 
aslanbek   (2008-10-11 17:20) [0]

Мне недо сохранять число одно (счетчик)  в реестр. Как это можно сделать в Delphi? Не только сохранять ну и при нужде открывать для сравнивания.


 
Юрий Зотов ©   (2008-10-11 17:22) [1]

Для открывания реестра при нужде существует класс TRegistry. И он хорошо описан в справке Delphi, даже с готовыми примерами.


 
aslanbek   (2008-10-11 17:24) [2]

И важно ли в какое ветке реестра сохранять? Или это не имеет значения?


 
Palladin ©   (2008-10-11 17:26) [3]


> aslanbek   (11.10.08 17:24) [2]

:) а тебе важно куда файл сохранить на диске или ты все в корень пихаешь?


 
aslanbek   (2008-10-11 17:28) [4]

значит хоть куда? :)) спасибо


 
Юрий Зотов ©   (2008-10-11 17:29) [5]

> aslanbek   (11.10.08 17:24) [2]

Может иметь, а может и не иметь. Это зависит от задачи.

Но одно совершенно точно - "чужуе" ветки реестра лучше не трогать, если точно не знаешь, что это за ветка, для чего она предназначена, что и как в нее нужно писать. Иначе и до краха системы недалеко.

Лучше завести свою, уникальную ветку - вот в ней можно упражняться сколько угодно.


 
Palladin ©   (2008-10-11 17:31) [6]


> aslanbek   (11.10.08 17:28) [4]

Не хоть куда, а туда куда будет позволено текущей учетной записи пользователя. Это раз, два не нужно разводить бардак в реестре, и лезти куда не следует, отведи себе местечко и развлекайся.


 
aslanbek   (2008-10-11 17:49) [7]

dnei:integer;

TRegistry.Create.RootKey:= HKEY_CLASSES_ROOT ;
TRegistry.Create.OpenKey("audit",true);
TRegistry.Create.WriteString(inttoStr(dnei)," %1");
TRegistry.Create.CloseKey;

Где ошибка??  Что обозначает %1?


 
{RASkov} ©   (2008-10-11 17:56) [8]

> [7] aslanbek   (11.10.08 17:49)
> Где ошибка??

Везде :) Ужас какой-то...


 
{RASkov} ©   (2008-10-11 17:59) [9]

> [7] aslanbek   (11.10.08 17:49)
> TRegistry

Это класс. Тебе нужен объект данного класса и с ним работать, а ты что делаешь?
...понасоздавал "безпризорных" объектов(память занял и всё), причем несколько, и каждому дал по задаче из общей кучи, но так разве делают?
:)


 
Юрий Зотов ©   (2008-10-11 18:07) [10]

> aslanbek   (11.10.08 17:49) [7]

А вот в ветку HKEY_CLASSES_ROOT как раз лазить и не стоит. Опасно это. Играйтесь с HKEY_CURRENT_USER.


 
{RASkov} ©   (2008-10-11 18:25) [11]

> [7] aslanbek   (11.10.08 17:49)
> Что обозначает %1?

Не, не верно.....
Эт ж твой код и у тебя нужно интересоваться что же значит "%1" - этож строка и пишешь ты ее как строку а нужно вроде число...


 
Palladin ©   (2008-10-11 19:37) [12]

мне интересно какой логикой руководствовал автор этих строк


 
Riply ©   (2008-10-11 20:02) [13]

> [12] Palladin ©   (11.10.08 19:37)
> мне интересно какой логикой руководствовал автор этих строк

Мне так кажется, что это вольный перевод, ой - вольный копи-пайст
чего-то типа:
with TRegistry.Create do
begin

:)


 
Anatoly Podgoretsky ©   (2008-10-11 20:55) [14]


> значит хоть куда? :))

Хоть куда не получится.


 
MsGuns ©   (2008-10-11 21:37) [15]

Вот почеиу не следует рекомендовать новичкам сохранять настройки в реестре. Пусть забавляется с TIniFile


 
Тын-Дын ©   (2008-10-11 23:28) [16]

function IncCounter: Integer;
var
 R: TRegistry;
begin
 Result := -1;
 R := nil;
 try
   R := TRegistry.Create;
   if not R.OpenKey(Application.Title, True)
     then raise Exception.Create("Íå ìîãó ñîçäàòü â ðååñòðå êëþ÷ "+Application.Title);
   if R.ValueExists("Counter") then Result := R.ReadInteger("Counter");
   Inc(Result);
   R.WriteInteger("Counter",Result);
 finally
   R.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.Title := "Super Puper Application";
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption := IntToStr(IncCounter);
end;


 
Германн ©   (2008-10-12 01:37) [17]


> Тын-Дын ©   (11.10.08 23:28) [16]

А зачем R := nil;?


 
aslanbek   (2008-10-12 02:08) [18]

спасибо всем, но я передумал лезть в реестр.


 
Германн ©   (2008-10-12 02:14) [19]


> aslanbek   (12.10.08 02:08) [18]
>
> спасибо всем, но я передумал лезть в реестр.
>

И на том спасибо! :)


 
aslanbek   (2008-10-12 02:17) [20]

))


 
{RASkov} ©   (2008-10-12 08:43) [21]

> [18] aslanbek   (12.10.08 02:08)
> но я передумал лезть в реестр

Да никто не против... лазей, но только в свой.... А ко мне, например, не нужно :)
Вот ты скажи, ты работаешь программистом или это так для себя?
Если для себя, то это поучительно, а если работаешь - то не допустимо!
:о)


 
Тын-Дын ©   (2008-10-12 12:52) [22]


> А зачем R := nil;?


Для R.Free.


 
Тын-Дын ©   (2008-10-12 15:18) [23]


> aslanbek   (12.10.08 02:08) [18]
> спасибо всем, но я передумал лезть в реестр.


А что так?
Счётчик удобно хранить в реестре.


 
Игорь Шевченко ©   (2008-10-12 16:50) [24]

Тын-Дын ©   (12.10.08 12:52) [22]

А зачем R := nil ?

Обычно создание объекта выносят выше, чем блок try finally с освобождением созданного объекта.


 
Тын-Дын ©   (2008-10-12 19:53) [25]


> Обычно создание объекта выносят выше, чем блок try finally
> с освобождением созданного объекта.


Не так давно было обсуждение о вложенных блоках try..finally при создании нескольких объектов последовательно.

Мне кажется, что пара лишних операторов присвоения будет не слишком высокой платой за хорошую прозрачность кода.

function IncCounter: Integer;
var
 R: TRegistry;
 L: TStringList;
 Ini: TIniFile;
begin
 Result := -1;
 R := nil;
 L := nil;
 Ini := nil;
 try
   L := TStringList.Create;
   Ini := TIniFile.Create;
//
// здесь работаем с L и Ini...
//
   R := TRegistry.Create;
   if not R.OpenKey(Application.Title, True)
    then raise Exception.Create("Не могу открыть ключ реестра "+Application.Title);
   if R.ValueExists("Counter") then Result := R.ReadInteger("Counter");
   Inc(Result);
   R.WriteInteger("Counter",Result);
 finally
   R.Free;
   L.Free;
   Ini.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title := "Super Puper Application";
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr(IncCounter);
end;



 
Riply ©   (2008-10-12 20:12) [26]

>  [25] Тын-Дын ©   (12.10.08 19:53)

Например, на строчке "L := TStringList.Create" или "здесь работаем с L и Ini..." ловим
исключение, после чего в блоке finally мужественно освобождаем не существующий объект R ?
:)


 
KilkennyCat ©   (2008-10-12 20:33) [27]


> Riply ©

а ты что здесь делаешь?! а ну, марш на письма отвечать! :)


 
Тын-Дын ©   (2008-10-12 21:35) [28]


> исключение, после чего в блоке finally мужественно освобождаем
> не существующий объект R ?


Да, мужественно-)
но при этом учитываем логику метода Free.;)


 
Игорь Шевченко ©   (2008-10-12 21:49) [29]


> Мне кажется, что пара лишних операторов присвоения будет
> не слишком высокой платой за хорошую прозрачность кода.


мне кажется, что пара лишних операторов заведомо будет ухудшать прозрачность кода. но дело даже не в этом. я на собеседовании задаю вопросы из опросника Юрия Зотова, за что ему респект и уважение безусловно. Так вот, один из вопросов звучит так:

"Что неправильно в этом коде:

...
 try
   Obj := TSomeObject.Create;
   ...
 finally
   Obj.Free;
 end;
...


"


 
KilkennyCat ©   (2008-10-12 21:52) [30]

хм... детский вопрос. Мне казалось, опросник сложнее.


 
Игорь Шевченко ©   (2008-10-12 21:59) [31]

KilkennyCat ©   (12.10.08 21:52) [30]

Так он лет пять назад в потрепаловке активно обсуждался. Тем не менее, есть кандидаты, которые и на этотвопрос не отвечают.


 
Riply ©   (2008-10-12 22:05) [32]

> [29] Игорь Шевченко ©   (12.10.08 21:49)
> я на собеседовании задаю вопросы из опросника Юрия Зотова, за что ему респект и уважение безусловно.

А как можно посмотреть этот "опросник" ? Уж очень интересно.

P.S.
Это не для того, чтобы, подготовившись, пройти у Вас собеседование :)


 
Игорь Шевченко ©   (2008-10-12 22:06) [33]


> А как можно посмотреть этот "опросник" ? Уж очень интересно.


Очевидно, спросить у автора ? :)


 
oxffff ©   (2008-10-12 22:25) [34]

Можно даже так. :)

procedure Guard(GuardCode:TProc;GuardObject:Tobject);inline
begin
 try
 GuardCode;
 finally
 GuardObject.Free;
 end;
end;

procedure UseIt;
var a,b,c:Tobject;
begin
A:=TObject.Create;
Guard(procedure
      begin
      showmessage(a.ClassName);
      b:=TObject.Create;
           Guard(procedure
                 begin
                 showmessage(b.ClassName);
                 c:=TObject.Create;
                     Guard(procedure
                            begin
                            showmessage(c.ClassName);
                            end,
                            C);
                 end,
                 B);
      end,A);
end;


 
Тын-Дын ©   (2008-10-13 00:31) [35]


> Игорь Шевченко ©   (12.10.08 21:49) [29]
> мне кажется, что пара лишних операторов заведомо будет ухудшать
> прозрачность кода. но дело даже не в этом. я на собеседовании
> задаю вопросы из опросника Юрия Зотова, за что ему респект
> и уважение безусловно. Так вот, один из вопросов звучит
> так:"Что неправильно в этом коде:...  try    Obj := TSomeObject.
> Create;    ...  finally    Obj.Free;  end;..."


Давай сравним прозначность и читабельность кода:

function CheckFile1(const FileName: String): Integer;
var
 Ini: TIniFile;
 FC: TFileChecker;
 L: TStringList;
begin
 Ini := nil;
 FC := nil;
 L := nil;
 Result := -1;
 try
   Ini := TIniFile.Create("app.ini");
   FC := TFileChecker.Create;
   L := TStringList.Create;
   L.LoadFromFile(INi.ReadString("Files","MainFile",""));
   Result := FC.Check(L);
 finally
   Ini.Free;
   FC.Free;
   L.Free;
 end;
end;

function CheckFile2(const FileName: String): Integer;
var
 Ini: TIniFile;
 FC: TFileChecker;
 L: TStringList;
begin
 Result := -1;
 Ini := TIniFile.Create("app.ini");
 try
   L := TStringList.Create;
   try
     FC := TFileChecker.Create;
     try
       L.LoadFromFile(INi.ReadString("Files","MainFile",""));
       Result := FC.Check(L);
     finally
       FC.Free;
     end;
   finally
     L.Free;
   end;
 finally
   Ini.Free;
 end;
end;


И какая из них легче читается?


 
Тын-Дын ©   (2008-10-13 00:34) [36]

Что касается кода

...
try
  Obj := TSomeObject.Create;
  ...
finally
  Obj.Free;
end;
...


То здесь 2 ответа на вопрос.
1.
...
 Obj := nil;
 try
   Obj := TSomeObject.Create;
   ...
 finally
   Obj.Free;
 end;
...


2.
...
 Obj := TSomeObject.Create;
 try
   ...
 finally
   Obj.Free;
 end;
...


 
Германн ©   (2008-10-13 00:53) [37]


> Тын-Дын ©   (13.10.08 00:34) [36]

Ну если ты нашёл 2 ответа, то есть ещё и третий :)


 
Тын-Дын ©   (2008-10-13 01:03) [38]


> Ну если ты нашёл 2 ответа, то есть ещё и третий :)


Видимо ты его знаешь?


 
Германн ©   (2008-10-13 01:06) [39]


> Тын-Дын ©   (13.10.08 01:03) [38]

Знаю. Он у ЮЗ самый любимый. :)


 
Юрий Зотов ©   (2008-10-13 01:33) [40]

> Германн ©   (13.10.08 01:06) [39]

Как правило, в достаточно коротких конструкциях, чтоб на одном экране весь блок умещался.

Вообще, странно. Одни люди мне говорят, что мой код читается с трудом, другие - наоборот, что он прост и прозрачен. Где правда, брат?



Страницы: 1 2 вся ветка

Текущий архив: 2008.11.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.017 c
2-1223673497
kami
2008-10-11 01:18
2008.11.23
Утечка AnsiString


15-1222153216
Slider007
2008-09-23 11:00
2008.11.23
С днем рождения ! 23 сентября 2008 вторник


2-1223551306
buzb
2008-10-09 15:21
2008.11.23
Как обойти ошыбку при вычислениях.


6-1195580822
9899100
2007-11-20 20:47
2008.11.23
определить по IP клиента MAC адрес его сетевой


1-1202472995
mega
2008-02-08 15:16
2008.11.23
Пересечение прямоугольников отрезком