Текущий архив: 2009.08.09;
Скачать: CL | DM;
Вниз
Какое практическое применение UniqueString ? Найти похожие ветки
← →
b/@. © (2009-06-15 15:23) [0]Добрый день.
Рассматривая исходный текст функцииfunction GetFileVersion(const AFileName: string): Cardinal;
изSysUtils
обратил внимание на это:
FileName := AFileName;
UniqueString(FileName);
Но ни из хелпа ни из других примеров так и не понял зачем в этом месте применяетсяUniqueString
. Тем более что её применение в самой VCL не встречается и безUniqueString
код прекрасно работает.
Собственно вопрос:
С какой целью применятсяUniqueString
в этом месте, и почему практически не применяется в других очень похожих участках ?
← →
Palladin © (2009-06-15 15:40) [1]
> Но ни из хелпа ни из других примеров так и не понял зачем
> в этом месте применяется UniqueString.
А что там дальше то в функции по тексту?
← →
b/@. © (2009-06-15 15:48) [2]
function GetFileVersion(const AFileName: string): Cardinal;
var
FileName: string;
InfoSize, Wnd: DWORD;
VerBuf: Pointer;
FI: PVSFixedFileInfo;
VerSize: DWORD;
begin
Result := Cardinal(-1);
// GetFileVersionInfo modifies the filename parameter data while parsing.
// Copy the string const into a local variable to create a writeable copy.
FileName := AFileName;
UniqueString(FileName);
InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
if InfoSize <> 0 then
begin
GetMem(VerBuf, InfoSize);
try
if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
if VerQueryValue(VerBuf, "\", Pointer(FI), VerSize) then
Result:= FI.dwFileVersionMS;
finally
FreeMem(VerBuf);
end;
end;
end;
Вот только в отличии от этого замечания GetFileVersionInfo modifies the filename parameter data while parsing ничего на самом деле не меняется.
Да и если менялось бы, то почему не использовать более популярнуюStrCopy
или передавать параметр через стек а не какconst
?
← →
Palladin © (2009-06-15 15:51) [3]
> ничего на самом деле не меняется.
Ты почему в этом так уверен то?
> более популярную StrCopy
Более популярную? Я ей вообще ни разу не пользовался.
> передавать параметр через стек
При чем здесь стек и const ?
← →
b/@. © (2009-06-15 16:14) [4]
> Palladin © (15.06.09 15:51) [3]
> Ты почему в этом так уверен то?
Потому что неоднократно проверял это на функцииGetFileVersionInfo
, тем более что в хелпе ничего нету по этому поводу.
> Более популярную? Я ей вообще ни разу не пользовался.
Хороший аргумент. А я ниразу не пользовалсяUniqueString
. Для меня популярнееStrCopy
:)
> > передавать параметр через стек
> При чем здесь стек и const ?
А если описать вот такfunction GetFileVersion("тут нету const" AFileName: string): Cardinal;
- то как будет передаваться строка ?
← →
Sapersky (2009-06-15 16:14) [5]UniqueString создаёт отдельную копию строки в том случае, если её RefCount > 1, т.е. если на неё ссылаются 2 и больше переменных. Если этого не сделать - GetFileVersionInfo модифицирует не только FileName, но и все эти переменные.
UniqueString на самом деле применяется очень (ИМХО даже слишком) часто, но обычно она автоматически вставляется компилятором. Например:
Var s : String;
n : Integer;
begin
SetLength(s, 10);
For n := 1 to Length(s) do
s[n] := "a"; // поставить здесь брейкпоинт и нажать Ctrl-Alt-C, когда до него дойдёт
← →
Palladin © (2009-06-15 16:19) [6]
> А если описать вот так function GetFileVersion("тут нету
> const" AFileName: string): Cardinal; - то как будет передаваться
> строка ?
Так же, по ссылке, но если произойдет ее изменение, то как раз вызовется LUniqueString, вставленный компилятором, вот только GetFileVersionInfo ничего не знает о строках Delphi потому последствия будут такие какие написал Sapersky
> Хороший аргумент. А я ниразу не пользовался UniqueString.
> Для меня популярнее StrCopy :)
А я тоже ни разу не пользовался UniqueString, за полной не надобностью, потому она не более популярна нежели StrCopy
← →
Sha © (2009-06-15 20:04) [7]> Какое практическое применение UniqueString ?
например, цикл из [5] для строки с неизвестной уникальностью можно переписать так:
p: pchar;
UniqueString(s);
integer(p):=integer(s);
for i:=0 to Length(s)-1 do p[i]:="a";
Конечно, в данном случае строка и так уникальна из-за SetLength.
Страницы: 1 вся ветка
Текущий архив: 2009.08.09;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.005 c