Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Вниз

Какое практическое применение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
1-1211868140
TForumHelp
2008-05-27 10:02
2009.08.09
ДвуХсторонняя печать...


15-1244537205
Neket
2009-06-09 12:46
2009.08.09
Классификация БД


15-1244378423
DevilDevil
2009-06-07 16:40
2009.08.09
Подскажите форум музыкальных исполнителей


11-1205090359
andreil
2008-03-09 22:19
2009.08.09
UnZip для массива


15-1244175479
SPeller
2009-06-05 08:17
2009.08.09
Проектирование интерфейса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский