PDA

View Full Version : توضیح در مورد این کد.



حمیدرضاصادقیان
چهارشنبه 08 آذر 1385, 07:50 صبح
سلام .من این کد رو از unit sysutils برداشتم.ببینید وقتی تابع به اتمام رسیده یک begin ,end گذاشته و کدی درون اون نوشته . میخواستم ببینم چه موقع این کد اجرا میشه و آیا به جای دیگه ایی ارتباط داره؟


function AnsiStrLower(Str: PChar): PChar;
{$IFDEF MSWINDOWS}
begin
CharLower(Str);
Result := Str;
end;
{$ENDIF}
{$IFDEF LINUX}
var
Temp: WideString;
Squish: AnsiString;
I: Integer;
begin
Temp := Str; // expand and copy multibyte to widechar
for I := 1 to Length(Temp) do
Temp[I] := WideChar(towlower(UCS4Char(Temp[I])));
Squish := Temp; // reduce and copy widechar to multibyte

if Cardinal(Length(Squish)) > StrLen(Str) then
raise ERangeError.CreateRes(@SRangeError);

Move(Squish[1], Str^, Length(Squish));
Result := Str;
end;
{$ENDIF}

m-khorsandi
چهارشنبه 08 آذر 1385, 09:48 صبح
به خطوطی که در کد مشخص کردم دقت کن، به اینها Conditioanl directives یا اصطلاحاً رهنمودهای شرطی برای کامپایلر گفته میشه، که باعث میشن بخش خاصی از کد کامپایل بشه.
{IFDEF MSWINDOWS$} : اگه در محیط ویندوز باشی، کد داخل این بلاک کامپایل خواهد شد و همینطور در مورد لینوکس.

در کل، یه تابع ست با دو بدنه جداگانه که با توجه به محیط کامپایل میشه.



function AnsiStrLower(Str: PChar): PChar;
{$IFDEF MSWINDOWS}
begin
CharLower(Str);
Result := Str;
end;
{$ENDIF}
{$IFDEF LINUX}
var
Temp: WideString;
Squish: AnsiString;
I: Integer;
begin
Temp := Str; // expand and copy multibyte to widechar
for I := 1 to Length(Temp) do
Temp[i] := WideChar(towlower(UCS4Char(Temp[i])));
Squish := Temp; // reduce and copy widechar to multibyte

if Cardinal(Length(Squish)) > StrLen(Str) then
raise ERangeError.CreateRes(@SRangeError);

Move(Squish[1], Str^, Length(Squish));
Result := Str;
end;
{$ENDIF}