اون مسئله RTL و اجرا نشدن فایل روی هر سیستمی برمیگرده به تست سمپل های خود C++ builder از فایر مانکی
بستگی داره که منظور شما از اجرا نشدن چی باشه. ببینید ظاهر فرم ها در FM به صورت HD است و برای ترسیم درست آن از پردازنده GPU استفاده میشود. فکر می کنم که منظور شما هم همین باشد. در ضمن FM2 هم نسبت به FM تغییراتی داشته که باعث میشه که همه مثالهایی که با FM1 ساخته شده اند با FM2 سازگار نباشند.
کتابخانه های vcl روی هر سیستمی هستند؟
نه نیستند. به هر حال انتقال پکیجهای VCL مثل .Net دشوار نیست و با کپی کردن چند فایل در کنار برنامه اجرایی، برنامه به راحتی و بدون مشکل اجرا می شود. البته شما می توانید که کتابخانه های مورد نیاز را به صورت استاتیک به برنامه خودتان پیوند بزنید که در این صورت حصل برنامه فقط یک فایل EXE میشود که برای اجرا دیگر فقط به سیستم عامل وابسته خواهد بود و به هیچ فایل دیگری وابسته نخواهد بود. چندی پیش در رابطه با Stand Alone کردن برنامه در این صفحه توضیح داده ام:
http://mtpars.org/showthread.php?tid=249
اون هم که گفتم چرا vcl و fm را با دلفی نوشتن منظورم اینه چرا با چیز سریع تری ننوشتنش , مثل خود C++ که برای ویندوز از win32 api استفاده کنه و برای مک از api های مک , چون کتابخانه های حرفه ای و سریع معمولا اینجورین که با C++ نوشته میشن و برای استفاده از api های ویندوز از win32 و مک api های خودشو استفاده می کنن, مثل adobe , autodesk
این دو موضوع را هیچ وجه تشابهی با هم ندارند. استفاده از Win32 API یک روش دسترسی به API های ویندوز است و VCL و FM هم فریم ورک هستند. شما در Delphi و C++ Builder هم به راحتی می توانید از توابع API سیستم عامل استفاده کنید مثل Visual C++ و ... . در مورد FM و VCL هم دقیقاً همینطور است که می گویید. سازندگان این دو در ویندوز از توابع ویندوز و در مک از توابع مک استفاده کرده اند که انجام این کار با کامپایلهای شرطی انجام شده است. به عنوان مثال این قسمتی از یونیت SysUtils است:
function RemoveDir(const Dir: string): Boolean;
{$IFDEF MSWINDOWS}
begin
Result := RemoveDirectory(PChar(Dir));
end;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
var
StatBuf: _stat;
M: TMarshaller;
P: Pointer;
begin
P := M.AsAnsi(Dir, CP_UTF8).ToPointer;
if (lstat(P, StatBuf) = 0) and S_ISDIR(StatBuf.st_mode) and
S_ISLNK(StatBuf.st_mode) then
begin
Result := unlink(P) <> -1;
end
else
Result := __rmdir(P) = 0;
end;
{$ENDIF POSIX}