ورود

View Full Version : درمورد ساختار SP, Function ها



حمیدرضاصادقیان
دوشنبه 14 اسفند 1385, 08:21 صبح
سلام دوستان. در بعضی از سورسهای یونیت ها کدهایی مثل کد زیر دیده میشه



function GetPackageModuleHandle(PackageName: PChar): HMODULE;
var
PkgName: array[0..MAX_PATH] of Char;

function CheckPackageName(linkmap: plink_map): Boolean;
var
BaseName: PChar;
begin
Result := True;
if linkmap.l_name <> nil then
begin
// Locate the start of the actual filename
BaseName := StrRScan(linkmap.l_name, PathDelim);
if BaseName = nil then
BaseName := linkmap.l_name // If there is no path info, just use the whole name
else Inc(BaseName); // The filename is actually located at BaseName+1
Result := StrPos(BaseName, PkgName) = nil;
end;
end;

procedure MakePkgName(Prefix, Name: PChar);
begin
StrCopy(PkgName, Prefix);
StrLCat(PkgName, Name, sizeof(PkgName)-1);
PkgName[High(PkgName)] := #0;
end;

begin
if (PackageName = nil) or (StrScan(PackageName, PathDelim) <> nil) then
Result := 0
else
begin
MakePkgName('bpl', PackageName); // First check the default prefix
Result := InitModule(ScanLinkMap(@CheckPackageName));
if Result = 0 then
begin
MakePkgName('dcl', PackageName); // Next check the design-time prefix
Result := InitModule(ScanLinkMap(@CheckPackageName));
if Result = 0 then
begin
MakePkgName('', PackageName); // finally check without a prefix
Result := InitModule(ScanLinkMap(@CheckPackageName));
end;
end;
end;
end;


حالا میخواستم بدونم تفاوت این کد با اینکه ما این دو تابع و پروسیجر رو در اول برنامه ایجاد کرده و در داخل این تابع صدا بزنیم چیه؟ چه فرقی باهم دارند.و بیشتر در چه مواردی استفاده میشوند.

ghabil
دوشنبه 14 اسفند 1385, 11:26 صبح
این روش چندان با Object Oriented جور در نمی آد و بیشتر زبانهای جدید هم پشتیبانیش نمیکنند حتی اگر اشتباه نکنم دلفی دات نت هم پشتیبانیش نمیکنه.
اما معمولا زمانی از این امکان استفاده میشه که در واقع تابعهای کمکی از نظر مفهومی واقعا بخشی از تابع اصلی هستند منتها برای خوانایی بیشتر کد(بخصوص در کدهای طولانی) یا اینکه بخش کوچکی از کد که ممکنه چند بار تکرار بشه بصورت Inline Procedure مینویسندشون و فایده دیگش هم اینه که خب این تابع فقط در Scope تابع اصلی قابل استفاده هست و خارج از اون نیست ، که همونطوری که گفتم با OOP زیاد همخونی نداره.
ولی کلا بنظر من که خیلی امکان باحالیه و من شخصا خیلی ازش استفاده میکنم.

vcldeveloper
سه شنبه 15 اسفند 1385, 09:09 صبح
ولی کلا بنظر من که خیلی امکان باحالیه و من شخصا خیلی ازش استفاده میکنم.
فکر کنم در دلفی 2006 همچین توابعی ، که در داخل یک تابع دیگه ایجاد و فراخوانی میشند، بطور خودکار توسط compiler بصورت inline (کامپایلر بجای فراخوانی تابع مذکور، سورس اون رو به تابع فراخوان در محل فراخوانی تابع اضافه میکنه) تعریف میشند تا کارایی بیشتری داشته باشند.