![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранить число в реестр
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;