Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранить число в реестр


Страницы:   1 2 3

aslanbek ©   (2008-10-11 17:20:00) 

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


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


> Игорь Шевченко ©   (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;


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


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

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

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-12 22:06:00) [23]


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


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


Riply   (2008-10-12 22:05:00) [24]

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

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

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


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

KilkennyCat ©   (12.10.08 21:52) [30]

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


KilkennyCat   (2008-10-12 21:52:00) [26]

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


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


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


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

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

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


"


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


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


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


KilkennyCat   (2008-10-12 20:33:00) [29]


> Riply ©

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


Riply   (2008-10-12 20:12:00) [30]

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

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


Тын-Дын   (2008-10-12 19:53:00) [31]


> Обычно создание объекта выносят выше, чем блок 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;


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

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

А зачем R := nil ?

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


Тын-Дын   (2008-10-12 15:18:00) [33]


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


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


Тын-Дын   (2008-10-12 12:52:00) [34]


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


Для R.Free.


{RASkov}   (2008-10-12 08:43:00) [35]

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

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


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

))


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


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

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


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

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


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


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

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


Тын-Дын   (2008-10-11 23:28:00) [40]

f unction 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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо