PDA

نسخه کامل مشاهده نسخه کامل : زبان Delphi : تمامی مباحث و مسائل



مهمان
12-05-2005, 17:16
سلام دوستان
اين هم تاپيک مربوط به زبان محبوب و مورد علاقه کارلوس و بسياري از برنامه نويسان خوب ايراني.
اميدوارم دوست خوبم کارلوس اين تاپيک را با موضوعات جالبش منفجر کند :wink:

Nesta
12-05-2005, 22:33
سلام
رامبد جان دستت طلا اين شد يک کار درست و منطقی و من سی ميکنم بترکنم شما هم قسمت c# را منفجر کن دستت درد نکنه

double_n
12-05-2005, 23:51
آقا اگه قراره بمبي منفجر بشه به ما هم بگيد تا اختياط كنيم :mrgreen:

ايول :wink:
ديگه ميدونيم از كجا اينجور مطالب رو بخونيم :arrow:

Nesta
15-05-2005, 00:57
...آموزش برنامه نویسی دلفی
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Nesta
15-05-2005, 00:57
آموزش برنامه نویسی وب با دلفی
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Nesta
15-05-2005, 01:01
نحوه نوشتن دی ال ال در دلفی

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Nesta
01-07-2005, 05:43
يكي از مشكلاتي كه بسياري از تازه كاران در دلفي با آن مواجه مي شوند اجراي فايلهاي ديگر يا اجراي دستورات shell است.

در اين مقاله سعي ما بر اين است كه شما را با اجراي فايلهاي ديگر از درون دلفي و كنترل آنها آشنا كنيم. شما پس از خواندن اين مقاله خواهيد توانست به راحتي فايلهاي ديگر -و نه تنها exe- را از درون دلفي اجرا كنيد و حتي دستورات shell را نيز صادر كنيد. به عنوان مثال ممكن است بخواهيد يك فايل html را با Editor پيش فرض كاربر باز كنيد. يا يك فايل html را با Browser پيش فرض كاربر باز كنيد. يا شايد بخواهيد يك فايل BMP را با اديتور پيش فرض كاربر باز نماييد و يا اين كه يك فايل INF را نصب نماييد.

با خواندن اين مقاله شما مي توانيد به راحتي به تمامي اين اهداف برسيد.
تابع APIي وجود دارد به نام WinExec. شكل كلي اين تابع از اين قرار است:


WinExec(lpCmdLine: PAnsiChar; uCmdShow: Cardinal);
كه lpCmdLine خط دستور مورد نظر شما براي اجراي فايل و uCmdShow بايد يكي از مقادير زير را داشته باشد:
SW_HIDE SW_MAXIMIZE SW_MINIMIZE
SW_RESTORE SW_SHOW SW_SHOWDEFAULT
SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWMINNOACTIVE
SW_SHOWNA SW_SHOWNOACTIVATE SW_SHOWNORMAL


براي توضيحات بيشتر راجع به هر كدام از اين ثابت ها به راهنماي Windows SDK دلفي يا MSDN مراجعه كنيد.

تابع WinExec تابع بسيار قديمي و محدودي است و ما قصد نداريم در اين مقاله بيشتر از اين راجع به اين تابع صحبت كنيم.

تابع ديگري وجود دارد به نام ShellExecute. اين تابع در يونيت ShellAPI تعريف شده است. بنابر اين لازم است يونيت ShellAPI را در ليست uses يونيت خود وارد كنيد. اين يكي از توابع بسيار قدرتمند براي اجراي فايل است.
نگاهي به شكل كلي اين تابع بياندازيد:



function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

hWnd Handle پنجره اي كه اين دستور را فراخوانده است.
Operation نوع دستوري مورد نظر جهت اجرا
FileName نام فايل يا شاخه
Parameters پارامترهاي مورد نظر در هنگام اجراي فايل exe
Directory شاخه پيش فرض در هنگام اجراي فايل
ShowCmd مشخص كننده چگوني نمايش فايل در هنگام اجرا


پارامتر اول يك متغيير از نوع HWND است.
لازم است براي كساني كه با مفهوم Handle در ويندوز آشنا نيستند توضيحاتي راجع به Handle بدهم. هر پنجره يا آبجكتي در ويندوز داراي يك Handle است كه براي دسترسي به آن پنجره يا آبجكت شما بايد از اين Handle استفاده كنيد. در واقع يك Handle يك عدد در مبناي 16 است. Handle يك عدد unique يا همتا است كه ويندوز آن را مقداردهي مي كند. اگر از يك پنجره دو Instance اجرا شده باشد (مثلا يك برنامه دو بار اجرا شده باشد) هر كدام از اين Instanceها يك Handle جداگانه دارند.
با اين تفاصيل پارامتر اول Handle پنجره اي است كه اين دستور را صادر كرده است. شما براي اين پارامتر مي توانيد از Application.Handle استفاده كنيد و يا آن را برابر 0 قرار دهيد. به علاوه مي توانيد Handle يك برنامه ديگر را بدهيد.

در صورتي كه شما مي خواهيد پيغام هاي اخطار آن فايل را دريافت كنيد يا آن را كنترل نماييد و يا تا اجراي كامل آن اجراي برنامه را متوقف كنيد با Handle برنامه خود را با استفاده از Application.Handle به اين پارامتر بدهيد.

پارامتر دوم مشخص كننده وظيفه اي است كه قرار است انجام شود. اين پارامتر مقادير پيش فرضي ندارد و بستگي به خصوصيات فايل اجرايي دارد. روي يك فايل از نوع Text كليد سمت راست ماوس را بزنيد. احتمالا موارد بالاي ليست "open"، "Edit with ..." , "print" است. هر كدام از اين رشته هاي مي توانند يك عمليات يا Operation باشند. به عنوان مثال شما مي خواهيد يك فايل Text را چاپ كنيد. در اين صورت كافي است از عبارت print به عنوان operation استفاده كنيد. يا مي خواهيد يك فايل rar را با استفاده از WinRar باز كنيد. در اين صورت مي توانيد از "Extract files" استفاده كنيد. حتما تا به حال متوجه شده ايد كه دستور ShellExecute چه مقدار انعطاف پذير است. با استفاده از اين فرمان مي توانيد هر گونه دستور Shell را اجرا نماييد.

پارامتر سوم مشخص كننده نام فايل يا شاخه اي است كه شما مي خواهيد عمليات بر روي آن انجام شود.
پارامتر چهارم ليست پارامترهايي است كه تمايل داريد فايل exe با اين پارامترها اجرا شود. پارامترها پنجم نيز نام شاخه پيش فرض در هنگام اجراي فايل مورد نظر شماست. اگر شما فايل exe اي را اجرا كنيد و اين فايل exe بخواهد از شاخه جاري فايلهاي اضافه اي را استفاده كند ويندوز شاخه جاري را به اون مطابق با اين شاخه اطلاع خواهد داد. و اما آخرين پارامتر مشخص كننده شكل اجراي فايل است. مقدار اين پارامتر مي تواند يكي از ثابت هايي ليستي باشد كه در ابتداي اين مقاله عنوان شد. به عنوان مثال شما مي توانيد از SW_HIDE استفاده كنيد كه در اين صورت فايل اجراي شما مخفي خواهد بود و يا از SW_SHOWMINIMIZE استفاده كنيد كه در اين صورت برنامه شما Minimizeشده اجرا مي شود.

و حالا به يك نكته خيلي مهم توجه كنيد:
1- رشته هاي اين تابع از نوع PChar هستند بنابراين شما بايد رشته هاي string را به صورت PChar به اين تابع بدهيد. شما مي توانيد به طور عادي رشته مورد نظر خود را به اين تابع بدهيد و يا در صورتي كه رشته مورد نظر شما string است بايد با استفاده با استفاده از دستور PChar آن را Typecast كنيد. به عنوان مثال:


ShellExecute(0, 'open', PChar(ExtractFilePath(Application.ExeName) + 'test.exe') , '', '', SW_SHOWNORMAL);

در اين مثال با استفاده از تابع ExtractFilePath و Application.ExeName كه حاوي آدرس كامل فايل Exe است شاخه اي كه فايل exe در آن قرار دارد را پيدا كرده ايم و سپس فايل test.exe را كه در كنار فايل اصلي اجرايي وجود دارد را به آن اضافه كرده ايم. كل اين عبارت TypeCast شده است به PChar.
جهت اطلاع كساني كه نمي دانند TypeCast چيست. TypeCast فرآيندي است كه شما متغيير يا Objectي را از يك نوع به نوع ديگري تبديل ميكنيد. كد زير را نگاه كنيد و با نوع پيشرفته تري از TypeCast آشنا شويد:



procedure TForm1.Button1Click(Sender: TObject); begin TButton(Sender).Caption := 'Test'; end;

در اين مثال Sender را از نوع TObject است TypeCast كرده ايم به TButton. و پراپرتي Caption آنرا تغيير داده ايم. براي اطلاعات بيشتر راجع به TypeCast به كتب دلفي مراجعه كنيد.


و اجازه دهيد به چند مثال جالب نيز نگاهي بياندازيم:
edit كردن يك فايل HTML با Editor پيش فرض HTML:

ShellExecute(Handle, 'edit', 'test.htm', '', '', SW_SHOW);
نصب يك فايل INF


ShellExecute(Handle, 'install', 'divx.inf', '', '', SW_SHOW);
فشرده ساختن يك فايل با استفاده از winrar و ارسال آن به ايميل:


ShellExecute(Handle, 'compress and mail...', 'test.file', '', '', SW_SHOW);
ارسال ايميل به mamouri@ganjafzar.com و با موضوع "Great Article":


ShellExecute(0, 'open', 'mailto:mamouri@ganjafzar.com?subject=GreatArticle ', '', '', SW_SHOWNORMAL);
چگونه يك فايل exe را اجرا كنيم و تا اتمام آن برنامه را متوقف كنيم؟


uses ShellAPI;
...
function ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile);
lpParameters := PChar(ParamString);
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE) or
Application.Terminated;
Result:=True;
end
else Result:=False;
end;



همان طور كه ملاحظه مي كنيد اين تابع به يونيت ShellAPI نياز دارد و بايد اين يونيت را در ليست uses يونيت خود اضافه كنيد.
در اين تابع از تابع ديگري به نام ShellExecuteEx استفاده شده است. اين تابع بر خلاف ShellExecute فقط يك پارامتر دارد كه بايد برابر متغييري از نوع TShellExecuteInfo قرار بدهيد. در ابتدا بايد با استفاده از تابع FillChar آنرا مقداردهي كنيد و وجود آنرا به ويندوز اطلاع دهيد. در واقع آن را Create كنيد:


FillChar(SEInfo, SizeOf(SEInfo), 0); SEInfo.cbSize := SizeOf(TShellExecuteInfo);

آبجكت ShellExecuteEx داراي پارامترهاي زير است:


cbSize: DWORD;
fMask: ULONG;
Wnd: HWND;
lpVerb: PAnsiChar;
lpFile: PAnsiChar;
lpParameters: PAnsiChar;
lpDirectory: PAnsiChar;
nShow: Integer;
hInstApp: HINST;


براي اطلاعات بيشتر راجع به اين پارامترها به راهنماي Windows SDK دلفي يا MSDN مراجعه كنيد. خروجي اين تابع از نوع boolean است و مشخص كننده اين است كه آيا اين تابع با موفقيت اجرا شده است يا نه؟
تابع ExecAndWait پس از اين كه اطمينان پيدا كرد كه فايل با موفقيت اجرا شده است يك حلقه repeat..until تشكيل داده. در داخل repeat دستور Application.ProcessMessage صادر شده است تا برنامه بتواند messageها را دريافت كند. سپس با استفاده از GetExitCodeProcess مقدار خروجي پروسس اجرا شده دريافت مي گردد. در صورتي كه خروجي اين تابع مخالف STILL_ACTIVE بود (كه نشانگر اجراي پروسس است) حلقه با كار خود ادامه مي دهد.

خروجي اين تابع مشخص كننده اجرا يا عدم اجراي فايل اجرايي است.

و حالا به چند مثال جالب ديگر توجه كنيد:
1- دسترسي به HotMail از درون دلفي:


program dummy;
var ToAddress: string;
EightSpaces: string;
begin
ToAddress := 'john@pacbell.net';
// Don't know why but this is required to get the
// correct compose address...
EightSpaces := ' ';
ShellExecute(Handle, PChar('open'), PChar('rundll32.exe'), PChar('C:\PROGRA~1\INTERN~1\HMMAPI.DLL,MailToProto colHandler' + EightSpaces + ToAddress), nil, SW_NORMAL)
end.

2- نمايش ديالوگ مشخصات يك فايل:



procedure ShowPropertiesDialog(Filename: string);
var
SEI: TShellExecuteInfo;
begin
FillChar(SEI, SizeOf(SEI), 0);
with SEI do
begin
cbSize := SizeOf(SEI);
lpFile := PChar(Filename);
lpVerb := 'properties';
fMask := SEE_MASK_INVOKEIDLIST;
end;
ShellExecuteEx(@SEI);
end;


3- اجراي ديالوگ Screen ويندوز (Control Panel > Display)


ShellExecute(HInstance, nil, PCHAR('rundll32.exe'), PCHAR('shell32.dll, Control_RunDLL desk.cpl, , 3') { 3 is the tab index }, NIL, 1);

همان طور كه متوجه شديد 3 شماره Tabي است كه مورد نظر شماست.

4- يك مثال كامل تر از فرستادن ايميل با استفاده از Outlook يا ارسال كننده پيش فرض email:


var
mail: string;
begin
mail := 'mailto:you@you.com' +
'?subject=hello' +
'&cc=me@me.com' +
'&body=Delphi is cool! ;)';
ShellExecute(Self.Handle, 'open', PChar(mail), nil, nil, SW_SHOWNORMAL);

خروجي هاي تابع ShellExecute يا ShellExecuteEx

خروجي هاي اين دو تابع مي تواند يكي از مقادير زير باشد:

0 سيستم عامل داراي resourceهاي كافي يا حافظه كافي جهت اجرا نيست.
ERROR_FILE_NOT_FOUND فايل مورد نظر پيدا نشد.
ERROR_PATH_NOT_FOUND آدرس مشخص شده پيدا نشد.
ERROR_BAD_FORMAT فايل EXE نامعتبر است يا اين يك فايل EXE از نوع Win32 نيست.
SE_ERR_ACCESSDENIED سيستم عامل دسترسي به فايل مشخص شده ندارد.
SE_ERR_ASSOCINCOMPLETE association فايل مورد نظر شما ناقص يا نامعتبر است. مثلا مشخص نشده كه فايل bmp كه شما مي خواهيد آن را اجراه كنيد بايد با چه برنامه اي باز شود.
SE_ERR_DDEBUSY DDE transaction مربوطه كامل نشد زيرا DDE transactionهاي ديگري در حال اجرا بودند.
SE_ERR_DDEFAIL DDE transaction ناموفق بود.
SE_ERR_DDETIMEOUT DDE transaction نتوانست اجرا شود زيرا درخواست Time Out شد.
SE_ERR_DLLNOTFOUND فايل dynamic-link library يا dll مشخص شده پيدا نشد.
SE_ERR_FNF فايل مورد نظر پيدا نشد.
SE_ERR_NOASSOC هيچ برنامه اي با پسوند فعلي فايل منطبق نشده است. مثلا مشخص نشده كه فايل bmp كه شما مي خواهيد آن را اجراه كنيد بايد با چه برنامه اي باز شود.
SE_ERR_OOM حافظه كافي جهت اجراي عمليات وجود ندارد.
SE_ERR_PNF آدرس مشخص شده پيدا نشد.
SE_ERR_SHARE يك خطاي sharin violation پيش آمد. يعني فايل مورد نظر share شده بود.


خلاصه:
در اين مقاله با سه تابع API مهم به نام هاي WinExec و ShellExecute و ShellExecuteEx آشنا شديم و پارامترهاي آنها را بررسي كرديم. به علاوه مثالهاي متعددي راجع به استفاده از ShellExecute ارائه داديم. به علاوه ثابتهاي استفاده شده در اين تابع ها را ليست كرده و بعضا آنها را مورد بررسي قرار داديم. همچنين تابعي به نام ExecAndWait ارائه داديم كه كار آن اجراي يك فايل exe و متوقف كردن برنامه تا اتمام فايل exe آشنا شديم و ساختمان داخلي اين تابع را مورد بررسي قرار داديم.

موفق و مويد و منصور باشيد

Nesta
01-07-2005, 05:45
يكي از فرمتهاي محبوب وب است و به راحتي مي توان برايflash ساخت Interfaceها در برنامه از آن استفاده كرد. بعضي از برنامه نويسان معتقدند استفاده از Flash سبب سنگين شدن برنامه، وابستگي برنامه به ActiveX فلش، امكان نداشتن تبادل اطلاعات بين Flash و دلفي و مشكلات ديگري مي شود.
در اين مقاله خواهيد ديد كه به راحتي تمامي اين مشكلات را مي توانيد رفع كنيد.

نصب ActiveX فلش
براي نصب ActiveX فلش به Component>Import ActiveX Control برويد. در ليست مربوطه به دنبال Shockwave Flash بگرديد. در صورتي كه آن را پيدا نكرديد. دكمه Add را زده و به آدرس زير برويد:

WIN_DIRECTORY\System32\Macromed\Flash

و فايل Flash.ocx را انتخاب كنيد و سپس Install را بزنيد.
خوب ... تا به اينجا كار نصب اكتيوايكس فلش تمام است. كمپوننت مربوطه را ميتوانيد در پالت ActiveX پيدا كنيد.
نكته: در صورتي كه شاخه مذكور در كامپيوتر شما وجود ندارد، احتمالا شما Flash Player را نصب نكرده‌ايد.
البته نگران نباشيد، با شيوه اي كه در اين مقاله ذكر شده كاربر شما بدون نياز به نصب Flash Player مي تواند برنامه شما را اجرا كند.

استفاده از اكتيوايكس فلش
اكتيوايكس فلش را مي‌توانيد در پالت ActiveX پيدا كنيد. آن را روي فرمتان قرار دهيد. از پراپرتيMovie ميتوانيد براي Load كردن فايل SWF خود استفاده كنيد.
به باقى پراپرتى‌هاى اكتيوايكس فلش دقت كنيد:
(البته توضيحات پراپرتى‌ها را به صورت انگليسى آورده‌ام. چون نوشتن آنها به صورت فارسى زياد جالب نيست. به خاطر اينكه پر از لغاتى هستند كه ترجمه‌شون غير ممكن است.)

ReadyState (get only)
0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete.

TotalFrames (get only) Returns the total number of frames in the movie. This is not available until the movie has loaded. Wait for ReadyState = 4.

FrameNum (get or set) The currently displayed frame of the movie. Setting this will advance or rewind the movie.

Playing (get or set) True if the movie is currently playing, false if it is paused.

Quality (get or set) The current rendering quality (0=Low, 1=High, 2=AutoLow, 3=AutoHigh). This is the same as the QUALITY parameter.

ScaleMode (get or set) Scale mode (0=ShowAll, 1= NoBorder, 2 = ExactFit). This is the same as the SCALE parameter.

AlignMode (get or set) The align mode consists of bit flags. (Left=+1, Right=+2, Top=+4, Bottom=+8). This is the same as the SALIGN parameter.

BackgroundColor (get or set) Override the background color of a movie. An integer of the form red*65536+green*256+blue use -1 for the default movie color.

Loop (get or set) True if the animation loops, false to play once. Same as the MOVIE parameter.
Movie (get or set) The URL source for the Flash Player movie file. Setting this will load a new movie into the control. Same as the MOVIE parameter.


متدها:


Play() Start playing the animation.

Stop() Stop playing the animation.

Back() Go to the previous frame.

Forward() Go to the next frame.

Rewind() Go to the first frame.

SetZoomRect(int left, int top, int right, int bottom) Zoom in on a rectangular area of the movie. Note that the units of the coordinates are in twips (1440 units per inch). To calculate a rectangle in Flash, set the ruler units to Points and multiply the coordinates by 20 to get TWIPS.

Zoom(int percent) Zoom the view by a relative scale factor. Zoom(50) will double the size of the objects in the view. Zoom(200) will reduce the size of objects in the view by one half.

Pan(int x, int y, int mode) Pan a zoomed in movie. The mode can be: 0 = pixels, 1 = % of window.


نصب اكتيوايكس فلش روي كامپيوتر كاربر
براي اين كه كاربر نهايي بتواند از برنامه شما استفاده كند بايد اكتيوايكس فلش را داشته باشد. در واقع شما بايد اكتيوايكس مربوطه را براي او نصب كند. روش كار به اين گونه است كه شما بايد چك كنيد كه آيا كاربر نهايي اكتيوايكس فلش را بر روي دستگاه خود نصب كرده است يا نه و در صورتي كه وي اين اكتيوايكس را ندارد برنامه شما بايد به طور اتوماتيك آن را نصب كنيد.
براي پياده سازي اين روش ما بايد در ابتدا OCX فلش را با استفاده از Resourceها در فايل Exe خود مخلوط كنيم. در صورتي كه شما با Resourceها آشنايي نداريد نگران نباشيد. مراحل زير را انجام دهيد و باقي كار را به دلفي بسپاريد: 1- يك فايل Text بسازيد و اسم آن را SWFActivex.rc بگذاريد
2- خطوط زير را در آن قرار دهيد:

FlashOCX EXTRA Flash.ocx

و فايل Flash.ocx را از مسيري كه قبلا ذكر شد در شاخه پروژه خود قرار دهيد.
3- آن را ضبط كنيد و با استفاده از BRCC32.EXE كه در شاخه Bin محل نصب دلفي وجود دارد، آن را كامپايل كنيد. (خط زير را در Command Line تايپ كنيد يا به سادگي فايل SWFActivex.rc را بر روي فايل BRCC32.EXE دراگ (Drag) كنيد.

BRCC32.EXE MyExeRes.rc

خوب حالا شما يك فايل Resource كامپايل شده داريد به نام SWFActivex.res داريد.
4- خطوط زير را در در سورس كد فرم اصلي خود قرار دهيد:

...
...
implementation
...
...
...
{$R *.dfm}
{$R SWFActivex.RES}
5- حالا اين تابع را به كد خود اضافه كنيد:

function GetResourceFile(S : string; FilePath : string) : Boolean;
var
Res : TResourceStream;
begin
Result := True;
if S <> '' then
begin
if FindResource(hInstance, PChar(S), Pchar('EXTRA')) = 0 then
begin
Result := False;
Exit;
end;
try
Res := TResourceStream.Create(hInstance, S, Pchar('EXTRA'));
except
Result := False;
Exit;
end;
if FileExists(FilePath) then DeleteFile(FilePath);
try
Res.SaveToFile(FilePath);
except
Result := False;
end;
Res.Free;
end;
end;


6- اين تابع را نيز اضافه كنيد:

function GetSystemDir : string;
var
SysPath : PChar;
begin
GetMem(SysPath, MAX_PATH + 1);
GetSystemDirectory(SysPath, MAX_PATH);
Result := StrPas(SysPath)+ '\';
FreeMem(SysPath, MAX_PATH + 1);
end;



7- خوب! حالا بگذاريد به مهمترين قسمت قضيه يعني Register كردن OCX مربوطه بپردازيم. در ابتدا يونيت ActiveX را به ليست uses خود اضافه كنيد. سپس تابع زير را نيز به سورس خود اضافه نماييد.

function RegisterOCX( OCXFileName : string; Flag : Boolean) : Boolean;
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
OCXFileNamePtr : PChar;
begin
Result := True;
if not FileExists( OCXFileName ) then
begin
Result := False;
Exit;
end;
GetMem(OCXFileNamePtr, Length(OCXFileName) + 1);
StrPCopy(OCXFileNamePtr, OCXFileName);
OCXHand:= LoadLibrary(OCXFileNamePtr);
FreeMem(OCXFileNamePtr, Length(OCXFileName) + 1);
OCXFileNamePtr := nil;
if OCXHand = 0 then
begin
Result := False;
Exit;
end;
if Flag then
RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer')
else
RegFunc:= GetProcAddress(OCXHand, 'DllUnregisterServer');

if RegFunc = S_OK then
Result := False;

FreeLibrary(OCXHand);
end;


8- اين سه متغيير را نيز به كد خود اضافه كنيد:

var
FilePath : string;
FlashOCX: TShockwaveFlash;




9- تابع زير را نيز اضافه كنيد:

function CreateFlashOCX : Boolean;
var
FilePath : string;
begin
Result := True;
FilePath := GetSystemDir + 'Macromed\Flash\Flash.ocx';
if not GetResourceFile('FlashOCX', FilePath) then
begin
Result := False;
Exit;
end;
try
FlashOCX := TShockwaveFlash.Create(nil);
except
if not RegisterOCX(FilePath, True) then
Result := False
else
try
FlashOCX := TShockwaveFlash.Create(nil);
except
Result := False;
end;
end;
end;




10- كدهاي زير را به انتهاي فايل خود، قبل از .end اضافه كنيد:


initialization
CoInitialize(nil);
if not CreateFlashOCX then
ShowMessage('An Error Occured!' + #13 + 'Program dosent run correctly!');
finalization
if Assigned(FlashOCX) then
begin
try
FlashOCX.Free;
FlashOCX := nil;
except
end;
DeleteFile(FilePath);
end;
CoUninitialize;
end.

end.


11- در اونت OnCreate فرم خودتون به راحتي از كمپوننت مربوطه استفاده كنيد:

FlashOCX.Parent := Form1;
FlashOCX.Movie := ExtractFilePath(Application.ExeName) + 'Main.swf';
FlashOCX.Play;


Resize شدن درست
يكي از مشكلاتي كه ممكن است با اكتيو ايكس فلش پيدا كنيد مشكل Resize شدن است. همه ما مي دانيم كه يكي از مهمترين مزاياي فلش برداري بودن آن است و اين برداري بودن سبب مي شود كه فايل فلش بتواند در هر اندازه به درستي نشان داده شود. ولي متاسفانه فرم خود را در RunTime تغييراندازه مي دهيد فايل Flash تغيير اندازه نمي يابد. در اين جا يك راه حل ساده براي حل اين مشكل بيان شده كه به خوبي كار ميكند. كافي است كمپوننت فلش را در يك پانل قرار دهيد و پراپرتي Align آن را برابر alClient بگذاريد. حالا پراپرتي Anchor پانل خود را به گونه‌اي تنظيم كنيد كه مايل هستيد كمپوننت فلش Resize شود. سپس در اونت OnResize فرم خود، خطوط زير را درج كنيد:
FlashOCX.Parent := nil;
FlashOCX.Parent := Self;


غيرفعال كردن كليك سمت راست
مساله ديگرى كه ذهن بسيارى از برنامه‌نويسان را مشغول مى‌كند منوى Popup فلش است. غيرفعال كردن اين منو بسيار ساده است. كافي است يك كمپوننت TApplicationEvents را روي فرم خود قرار دهيد و كد زير را در اونت OnMessage اين كمپوننت بنويسيد:


if (Msg.message = WM_RBUTTONDOWN) and (Msg.hwnd := FlashOCX) then
begin
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
Handled := True;
end;



ارتباط بين Flash و دلفى
يكى از مسائل بسيار مهم و اساسى ديگر برقرارى ارتباط بين Flash و دلفي است. فرض كنيد در فايل SWF خود چند Button داشته باشيد و بخواهيد وقتى كاربر روى هر كدام از اين اونتها كليك كرد فرم خاصى باز شود. در اين صورت چه بايد بكنيد. پياده سازى اين كار بسيار ساده است. كافى است در Flash براى هر كدام از دكمه‌هاى خود يك Action تعريف كنيد و از دستور FSCommand استفاده نماييد. از يك مقدار دلخواه مثل fMatn يا fSearch استفاده كنيد و در دلفى نيز از اونت OnFSCommand به صورت زير استفاده كنيد:

if command = 'fMain' then fMain.ShowModal;
if command = 'fSearch' then fSearch.ShowModal;




خوب! فكر كنم با توضيحاتى كه در اين مقاله اومده، قانع شده باشيد كه Flash يكى از بهترين راه حلها براى طراحى Interfaceهاست.
تا مقاله بعد .... به اميد ديدار

Nesta
01-07-2005, 05:50
چگونه با استفاده از شيوه Boyer-Moore جستجو كنيم؟
راه حل اول:



unit BMSearch;

interface

type
{$IFDEF WINDOWS}
size_t = Word;
{$ELSE}
size_t = LongInt;
{$ENDIF}

type
TTranslationTable = array[char] of char; { translation table }
TSearchBM = class(TObject)
private
FTranslate: TTranslationTable; { translation table }
FJumpTable: array[char] of Byte; { Jumping table }
FShift_1: integer;
FPattern: pchar;
FPatternLen: size_t;
public
procedure Prepare(Pattern: pchar; PatternLen: size_t; IgnoreCase: Boolean);
procedure PrepareStr(const Pattern: string; IgnoreCase: Boolean);
function Search(Text: pchar; TextLen: size_t): pchar;
function Pos(const S: string): integer;
end;

implementation

uses
SysUtils;

{Ignore Case Table Translation}

procedure CreateTranslationTable(var T: TTranslationTable; IgnoreCase: Boolean);
var
c: char;
begin
for c := #0 to #255 do
T[c] := c;
if not IgnoreCase then
exit;
for c := 'a' to 'z' do
T[c] := UpCase(c);

{ Mapping all accented characters to their uppercase equivalent }

T['Á'] := 'A';
T['À'] := 'A';
T['Ä'] := 'A';
T['Â'] := 'A';

T['á'] := 'A';
T['à'] := 'A';
T['ä'] := 'A';
T['â'] := 'A';

T['É'] := 'E';
T['È'] := 'E';
T['Ë'] := 'E';
T['Ê'] := 'E';

T['é'] := 'E';
T['è'] := 'E';
T['ë'] := 'E';
T['ê'] := 'E';

T['Í'] := 'I';
T['Ì'] := 'I';
T['Ï'] := 'I';
T['Î'] := 'I';

T['í'] := 'I';
T['ì'] := 'I';
T['ï'] := 'I';
T['î'] := 'I';

T['Ó'] := 'O';
T['Ò'] := 'O';
T['Ö'] := 'O';
T['Ô'] := 'O';

T['ó'] := 'O';
T['ò'] := 'O';
T['ö'] := 'O';
T['ô'] := 'O';

T['Ú'] := 'U';
T['Ù'] := 'U';
T['Ü'] := 'U';
T['Û'] := 'U';

T['ú'] := 'U';
T['ù'] := 'U';
T['ü'] := 'U';
T['û'] := 'U';

T['ñ'] := 'Ñ';
end;

{Preparation of the jumping table}

procedure TSearchBM.Prepare(Pattern: pchar; PatternLen: size_t; IgnoreCase: Boolean);
var
i: integer;
c, lastc: char;
begin
FPattern := Pattern;
FPatternLen := PatternLen;
if FPatternLen < 1 then
FPatternLen := strlen(FPattern);
{This algorythm is based on a character set of 256}
if FPatternLen > 256 then
exit;
{1. Preparing translating table}
CreateTranslationTable(FTranslate, IgnoreCase);
{2. Preparing jumping table}
for c := #0 to #255 do
FJumpTable[c] := FPatternLen;
for i := FPatternLen - 1 downto 0 do
begin
c := FTranslate[FPattern[i]];
if FJumpTable[c] >= FPatternLen - 1 then
FJumpTable[c] := FPatternLen - 1 - i;
end;
FShift_1 := FPatternLen - 1;
lastc := FTranslate[Pattern[FPatternLen - 1]];
for i := FPatternLen - 2 downto 0 do
if FTranslate[FPattern[i]] = lastc then
begin
FShift_1 := FPatternLen - 1 - i;
break;
end;
if FShift_1 = 0 then
FShift_1 := 1;
end;

procedure TSearchBM.PrepareStr(const Pattern: string; IgnoreCase: Boolean);
var
str: pchar;
begin
if Pattern <> '' then
begin
{$IFDEF Windows}
str := @Pattern[1];
{$ELSE}
str := pchar(Pattern);
{$ENDIF}
Prepare(str, Length(Pattern), IgnoreCase);
end;
end;

{Searching Last char & scanning right to left}

function TSearchBM.Search(Text: pchar; TextLen: size_t): pchar;
var
shift, m1, j: integer;
jumps: size_t;
begin
result := nil;
if FPatternLen > 256 then
exit;
if TextLen < 1 then
TextLen := strlen(Text);
m1 := FPatternLen - 1;
shift := 0;
jumps := 0;
{Searching the last character}
while jumps <= TextLen do
begin
Inc(Text, shift);
shift := FJumpTable[FTranslate[Text^]];
while shift <> 0 do
begin
Inc(jumps, shift);
if jumps > TextLen then
exit;
Inc(Text, shift);
shift := FJumpTable[FTranslate[Text^]];
end;
{ Compare right to left FPatternLen - 1 characters }
if jumps >= m1 then
begin
j := 0;
while FTranslate[FPattern[m1 - j]] = FTranslate[(Text - j)^] do
begin
Inc(j);
if j = FPatternLen then
begin
result := Text - m1;
exit;
end;
end;
end;
shift := FShift_1;
Inc(jumps, shift);
end;
end;

function TSearchBM.Pos(const S: string): integer;
var
str, p: pchar;
begin
result := 0;
if S <> '' then
begin
{$IFDEF Windows}
str := @S[1];
{$ELSE}
str := pchar(S);
{$ENDIF}
p := Search(str, Length(S));
if p <> nil then
result := 1 + p - str;
end;
end;

end.




راه حل دوم:
اين يك دمو براى الگوريتم جستجوى Boyer-Moore است. ايده بسيار ساده است. در ابتدا يك فهرست از رشته‌هاى مورد نظر جهت جستجو ساخته و سپس روتين BMsearch را صدا مى‌كنيم. فراموش نكنيد كه در برنامه نهايى خود Range Checking را با سوييج {$R-} خاموش كنيد. در غير اينصورت جستجو 2 الى 3 ساعت بيشتر از زمان عادي طول مي‌كشد.



{Public-domain demo of Boyer-Moore search algorithm.
Guy McLoughlin - May 1, 1993.}

program DemoBMSearch;

{Boyer-Moore index table data definition}
type
BMTable = array[0..127] of byte;

{Create a Boyer-Moore index table to search with.}

procedure Create_BMTable(Pattern: string; var BMT: BMTable);
var
Index: byte;
begin
fillchar(BMT, sizeof(BMT), length(Pattern));
for Index := 1 to length(Pattern) do
BMT[ord(Pattern[Index])] := (length(Pattern) - Index)
end;

{Boyer-Moore Search function. Returns 0 if string is not found. Returns 65,535 if
BufferSize is too large, ie: greater than 65,520 bytes.}

function BMsearch(var Buffer; BuffSize: word; var BMT: BMTable; Pattern: string): word;
var
Buffer2: array[1..65520] of char absolute Buffer;
Index1, Index2, PatSize: word;
begin
if (BuffSize > 65520) then
begin
BMsearch := $FFFF;
exit
end;
PatSize := length(Pattern);
Index1 := PatSize;
Index2 := PatSize;
repeat
if (Buffer2[Index1] = Pattern[Index2]) then
begin
dec(Index1);
dec(Index2)
end
else
begin
if (succ(PatSize - Index2) > (BMT[ord(Buffer2[Index1])])) then
inc(Index1, succ(PatSize - Index2))
else
inc(Index1, BMT[ord(Buffer2[Index1])]);
Index2 := PatSize
end;
until
(Index2 < 1) or (Index1 > BuffSize);
if (Index1 > BuffSize) then
BMsearch := 0
else
BMsearch := succ(Index1)
end;

type
arby_64K = array[1..65520] of byte;

var
Index: word;
st_Temp: string[10];
Buffer: ^arby_64K;
BMT: BMTable;

begin
new(Buffer);
fillchar(Buffer^, sizeof(Buffer^), 0);
st_Temp := 'Gumby';
move(st_Temp[1], Buffer^[65516], length(st_Temp));
Create_BMTable(st_Temp, BMT);
Index := BMSearch(Buffer^, sizeof(Buffer^), BMT, st_Temp);
writeln(st_Temp, ' found at offset ', Index)
end.

Nesta
01-07-2005, 05:51
با سلام

Microsoft Agent يكي از سرگرم كننده ترين فن آوريهاي Microsoft مي باشد كه تا كنون توانسته بسيار مورد علاقه كاربران قرار بگيرد. Agentها به برنامه هاي شما جذابيت زيادي مي دهند و امكان ارتباط بهتر و جالبتري را با كاربر ايجاد ميكنند. در اينجا من مي خواهم شما را با Microsoft Agent و طريقه بكار گيري آن در برنامه هاي خودتان را آموزش بدهم كه اميدوارم مفيد باشد. از آنجايي كه من اين امكان را در دلفي استفاده كرده ام براي شما هم مثالهاي دلفي آورده ام ...

اولين باري كه از اين تكنولوژي استفاده شد در برنامه Office 97 بود كه خيلي مورد علاقه كاربران قرار گرفت. من اون موقع خيلي گشتم تا بتونم از اين امكان استفاده كنم ولي خوب نتونستم ): اما بعد ها با پيشرفت كردن علم برنامه نويسي و همچنين با پيشرفت كردن عقل Microsoft (كه از نظر من بزرگترين كلاه بردار قرن هست) اين تكنولوژي در اختيار ديگران هم قرار گرفت... براي همين در اوايل فقط در Office بود كه از اين امكان استفاده مي شد.

حالا اينا رو گفتم اما ببينيم اصلاً Agent چي هست؟؟!!!

شما اگه از Office استفاده ميكنيد حالا هر كدوم از برنامه هاش كه باشه (Word,Excel,FrontPage,...) يك شكلكي رو ميبينيد كه هميشه نسبت به كارهايي كه انجام ميدين يك سري حركات از خودش نشون ميده كه هم سرگرم كننده هست هم آموزنده. حالا حتماً متوجه شدين كه در مورد چي صحبت ميكنيم (هر چند كه ميدونم ميدونستيد (; ) خوب حالا مي خواهيم ببينيم كه چطور ميشه از اين امكان تو برنامه هاي خودمون استفاده كنيم مثلاً وقتي برنامه داره كار ميكنه يه شكلكي بياد براي كاربر ادا در بياره تا طرف نفهمه كه برنامه چيكار ميكنه (: يا مثلا موقع ذخيره كردن و بازيابي كردن و يا جستجو و ... يك سري حركات مربوط به آن عمل انجام بده...

اينكار خيلي ساده است و فقط كافي هست شما يك Agent رو انتخاب كنيد و در برنامتون تعريفش كنيد و بعد هر كاري كه خواستين رو بهش دستور بدين تا براتون انجام بده . ضمنا شما لازم نيست اصلاً غصه درست كار كردن اون رو بخورين چون خود Windows اونو كنترل ميكنه كه يه وقت كار بدي نكنه ((:

شما نميتونيد كه Agent رو داخل يك جعبه مكالمه (Dialog Box) قرار بدين و فقط ميتونيد جاي اوليه اون رو انتخاب كنيد بعد نمايش بدين و كاربر ميتونه اونو به دلخواه خود تغيير مكان بده با Drag كردن اينكار رو انجام ميده. خوب حالا براي شروع كار به يك سري Agent نياز داريم كه البته همراه ويندوز هميشه يك سري همراه هستند بهترين اونها كه ميتونه كارهاي زيادي انجام بده (منظور حالتهاي زيادي براش تعريف شده) Merlin هست كه يك جادوگر پير مي باشد. براي Download كردن اينها ميتونيد به سايتهايي كه معرفي ميكنم يك سري بزنيد. ضمناً شما خودتون هم ميتونيد يك Agent طراحي بكنيد كه براي اينكار بايد از يك سري نرم افزار استفاده كنيد.

براي اينكه كاربر بتونه از Agent برنامه شما استفاده كنه بايد حتماً Microsoft Agent Server‌ رو نصب كنه. كه البته من تا حالا تو هر ويندوزي كه برنامم رو اجرا كردم نصب شده بوده فكر كنم اين برنامه همراه خود ويندوز هست (; ولي اگه نبود شما ميتونيد يك سري به آدرس زير بزنيد اونجا چيزهاي جالبي در اين مورد داره كه يك مطالعه كنيد بد نيست.

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

در اين آدرس اخرين باري كه رفتم مطالب زير بود حالا اگه تا حالا بيلي جون حوصله اش از اونا سر نرفته باشه و عوض نكرده باشد بايد باشه:

- The Agent Server

- The Characters/Agents

- A Text-to-Speech pices

- A Voice command (input) pices



اين مطالب تحت عنوان Microsoft Agent Software Development Kit هست كه در اونجا شما همچنين ميتونيد نرم افزار Microsoft Agent Character Editor رو براي درست كردن Agent دريافت كنيد. در اين مقاله ما در مورد Voice Command‌ (فرمان هاي صوتي) و طراحي Agent صحبت نميكنيم و فقط طرز استفاده از اين امكان رو شرح ميدم كه خودتون بعداً ميتونيد در موردش بيشتر جستجو كنيد. ما براي كارمون فقط احتياج به Agent Server و يك كاراكتر داريم كه اگه روي ويندوزتون ندارين ميتونيد از اينجا Download بكنيد.

خوب حالا ميريم سر اصل مطلب:

بعد از اينكه مطمئن شدين روي ويندوزتون AgentServer رو دارين دلفي رو اجرا كنيد و مراحل زير رو مو به مو انجام بدين:

1- Component|Import ActiveX Control رو انتخاب كنيد.

2- Microsoft Agent Control رو از تو ليست پيدا كنيد و رو ي دكمه Install كليك كنيد.

3- خوب حالا بايد تو قسمت ActiveX يك آيكوني شبيه به MenInBlack داشته باشيد.

خوب تا يادم نرفته اينو بگم كه براي پيدا كردن يك كاراكتر روي ويندوزتون بايد براي acs.* جستجو كنيد كه البته به طور عادي اگر Agent Server نصب باشه توي شاخه Windows يك msagent بايد وجود داشته باشه و داخل اون هم يك شاخه ديگه به نام Char هم هست كه توش يك يا چند كاراكتر وجود داره كه اگر از XP استفاده ميكنيد حتماً يكيش Merlin.acs هست (كه من خيلي بهش علاقه دارم (: ) براي همين ما بايد تو برنامه مون چك كنيم كه آيا اين شاخه وجود داره يا نه اگه وجود داشت ميدونيم كه Agent Server روي ويندوز كاربر نصب هست و ما مي تونيم از Agent استفاده كنيم .

خوب براي اينكار بايد اول ActiveX رو به روي فرم منتقل كنيم با اينكار يك type با نام TAgent به تعاريف فرم اضافه ميشه . بعد بايد يك متغيير تعريف كنيم كه از نوع Boolean باشه تا با اون چك كنيم كه آيا Agent Server نصب هست يا نه براي اينكار ميشه از Code زير استفاده كرد:



TYourObject

private

AgentInstalled: Boolean;

function AgentIsInstalled: Boolean;

procedure CreateAndLoadAgentIfInstalled;

function GetColorDepth: Word;

function GetWinDir: String;

procedure SetFormColor;

function AgentWasClicked



شما ميتونيد روي ويندوز كاربر به دنبال اون شاخه و كاراكتري كه مي خواهيد از او استفاد هكنيد بگرديد و اگه بود كار رو باهاش شروع كنيد اگه هم نبود خوب ديگه كاربر بايد محيط خشك برنامتون رو تحمل كنه (;

حالا مثلاً ما مي خواهيم از Merlin استفاده كنيم :

{-----------------------------------------------}

function TYourObject.AgentIsInstalled: Boolean;

begin

Result := (FileSearch('Merlin.acs',

Format('%s\MSAGENT\CHARS', [GetWinDir]))<>'');

end;



{-----------------------------------------------}

function TYourObject.GetWinDir : string;

var

WinDirZ : array[0..256] of Char;

begin

GetWindowsDirectory(WinDirZ, SizeOf(WinDirZ));

Result := StrPas(WinDirZ);

end;



نكته : در بالا براي بدست آوردن نام شاخه اي كه ويندوز در آن نصب هست از API استفاده شده كه مسير كامل ويندوز را به ما ميدهد.

حال كه فهميديم كاربر امكان استفاده از Agent رو داره مي تونيم كار رو شروع كنيم. در ادامه بايد يك Object براي Agent خودمون بسازيم تا از اين به بعد از اون استفاده كنيم و مجبور نباشيم از ActiveX استفاده كنيم. براي اينكار از كد زير ميشه استفاده كرد:

implementation



uses

AgentDemoConsts,

Registry,

OLECtrls, AgentObjects_TLB;



{-----------------------------------------------}

procedure

TYourObject.CreateAndLoadAgentIfInstalled;

const

RightBias = 80;

TopBias = 70;

var

tp: TPoint;

begin

if (AgentInstalled) and

not (Assigned(RobotAgent)) then begin

RobotAgent := TAgent.Create(Application);

RobotAgent.Characters.Load('Merlin','Merlin.acs');

{ Move the Agent to the center of the screen }

tp.x := (Screen.Width div 2)-(Width div 2);

tp.y := (Screen.Height div 2)-(Height div 2);

with RobotAgent.Characters.Item['Merlin'] do begin

MoveTo(tp.x+RightBias, tp.y+TopBias, 0);

Show(0);

Play('Greet');

Play('Explain');

Speak(SDemoIntro, '');

Play('Pleased');

Play('RestPose');

Speak(SWhisper, '');

Speak(SMonotone, '');

Speak(SMap, '');

end;

end;

end;





چند خط اول كه مشخص هست چه كار ميكنه . اما بعد از اينكه كاراكتر تعريف شد (RobotAgent) اونو به Merlin نسبت ميديم وبعد هم اونو به وسط صفحه نمايش منتقل ميكنيم و حالا ميرسيم به مهمترين قسمت كار كه دستور دهي به Merlin هست.

با استفاده از Play شما ميتونيد به Agent دستور بدين اما براي هر Agnet دستورات متفاوت هست يعني ممكن هست كه دستوارتي كه براي Merlin كار ميكنه براي Robby (كه يكي ديگر از Agent ها هست) كار نكنه. شما اگه كاراكترتون رو خودتون درست ميكنيد خوب پس ليست دستوراتش رو داريد اما اگه اونو از جايي Download ميكنيد حتما ليست دستوارتش هم همراش هست مثلا شما ميتونيد در مورد Merlinو يا Robby و يا چند Agent ديگه از تو همون آدرسي كه در بالا دادم ليست دستوارتش رو بگيريد.

حالا در كد بالا ميبينيد كه در ابتدا از دستور Show استفاده شده اين دستور براي به نمايش در آوردن Agent هست و در تمامي آنها كار ميكنه . بعد با استفاده از Play كارهاي مورد نظرمون رو به Agent‌ ميگيم. مثلاً من در ابتدا با استفاده از دستور Greet از Agent خواستم كه سلام كنه و بعد هم با استفاده از Explain خواستم كه شروع كنه به گفتن يك سري مطالب كه با دستور Speak اونها رو كه در متغيير SDemoIntro قرار داده ام به صورت يك بالون كه بالاي سرش باز ميشه ميگه. شما براي اينكه بگين مطالب رو با چه حالتهايي بخونه مي تونيد از دستواراتي كه در جدول زير آوردم استفاده كنيد:

Addition

Resulting capability

\Chr="Whisper"\

The Agent will whisper the following text.

\Pau=N\

The Agent will pause for the designated number of milliseconds.

\Emp\

The Agent will give special emphasis to the following phrase.

\Chr="Montone"\

The Agent will emphasize nothing at all.

\Map=

The Agent will say one thing, and = "think" another.

خوب حالا براي اينكه بيشتر متوجه بشين در زير يك سري مثال آوردم كه ميتونيد اونها رو در برنامه استفاده كنيد و نقش هر كدوم از دستوارت رو ببينيد:

SFuzzyWuzzy = 'Fuzzy wuzzy was a bear;\Pau=500\ ' +

'fuzzy wuzzy had no hair;\Pau=500\ ' +

'fuzzy wuzzy wasn't very \Emp\fuzzy, \Emp\was he?';

SWhisper = '\Chr="Whisper"\Now I will whisper: ' +

'Whisper whisper whisper.';

SMonotone = '\Chr="Monotone"\Now I will speak in a ' +

'monotone. Pat Paulsen for President.';

SMap = '\Map="I will now continue to speak in ' +

'English, but you will see my words ' +

'translated into German in the balloon above ' +

'my head. How are you today? I am just ' +

'\Emp\dandy!"="Jetzt werde ich zwar immer ' +

'noch in Englisch reden, sie werden ' +

'aber meine Woerte im Balloon obenauf ins ' +

'Deutsch uebersetzt sehen. Wie geht es ' +

'Ihnen heute? Mir geht es ganz gut!"\';



خوب ديگه همين بود تمام ماجرا حالا شما اگه مي خواهين بيشتر در اين مورد كار كنيد من در مقالات بعدي يكي سري سايت و مطلب ديگه هم براتون ميزارم البته به زبون اصلي خودشون حتماً خيلي مفيد خواهد بود.

ضمنا شما ميتونيد از Event ها هم در Agent استفاده كنيد و مثلا براي رويداد OnClick روي Agent‌ يك چيزي تعريف كنيد.



خوب در آخر از شما كه تا اينجا آمديد متشكرم و يك سري نكات رو هم بايد ذكر كنم :

1- اين مطالب حاصل تجربه خودم و همچنين برگرفته از يك سري مقالاتي بوده كه در اين مورد مطالعه كردم.

2- در مورد استفاده از اين كدهايي كه در اين مقاله آورده ام و همچنين در پايان اين مقاله ضميمه كرده ام هيچ گونه مسئوليتي بعهده من نخواهد بود كه درست كار كنه يا بزنه كامپيوتر شما رو بسوزونه !!!!!

3- استفاده از اين مقاله به شرط ذكرنام و آدرس اصلي مقاله در سايتها و جاهاي ديگر آزاد است .

4- اگه در اين مورد نظري دارين يا حتماً براي من ايميل كنيد خوشحال خواهم شد بشنوم.







موفق باشيد

Nesta
01-07-2005, 05:52
اين مقاله مناسب كاربراني مي باشد كه استفاده زيادي
از گرافيك در برنامه هاي خودشان مي كنند. توسط اين مقاله
مي توانيد تا يك تصوير نقشه بيتي را در داخل صفحه
با زواياي مختلف بچرخانيد .


( شكل شماره – 1 )

اجازه دهيد تا در ابتدا نگاهي به اين موضوع از نظر رياضيات
بياندازيم. از نظر رياضيات ، هر نقطه اي مي تواند حول
يك نقطه ديگر و با زواياي مختلف بچرخد. اگر به شكل شماره 1
توجه فرماييد ، خواهيد ديد كه نقطه ( يا نيم خط ( P مي تواند
حول نقطه O و در زواياي مختلفي بچرخد.

فرمولي كه در رياضي براي چرخاندن يك نقطه حول نقطه ثابت
و با زاويه مشخص است ، بدين صورت مي باشد :


حال اگر بخواهيم نقطه مذكور را حول يك نقطه ديگر بچرخانيم
به اين فرمول احتياج پيدا خواهيم كرد :


اين فرمولها به صورت ماتريسي نوشته شده اند.
به طور كلي ماتريسها كمك بسيار زيادي در رابطه با گرافيك
و تغييرات آن اعمال مي كنند. در بسياري از روشهاي ويرايش
يك تصوير يا گرافيك ، ما از ماتريسها كمك مي گيريم.

حال اجازه دهيد اين فرمول را به دستورات دلفي تبديل كنيم
و نتيجه آن را مشاهده كنيم ...


كد:

CONST
MaxPixelCount = 32768;

TYPE
TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
...

// "Simple" approach. For pixel (i,j), use "reverse" rotation to find
// where the rotated pixel must have been before the rotation.
// Don't bother with center of pixel adjustment.
// Assumes input BitmapOriginal has PixelFormat = pf24bit.
FUNCTION RotateBitmapMethod1 (CONST BitmapOriginal: TBitmap;
CONST iRotationAxis, jRotationAxis: INTEGER;
CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;

VAR
cosTheta : EXTENDED;
i : INTEGER;
iOriginal : INTEGER;
iPrime : INTEGER;
j : INTEGER;
jOriginal : INTEGER;
jPrime : INTEGER;
RowOriginal: pRGBTripleArray;
RowRotated : pRGBTRipleArray;
sinTheta : EXTENDED;
BEGIN
// The size of BitmapRotated is the same as BitmapOriginal. PixelFormat
// must also match since 24-bit GBR triplets are assumed in ScanLine.
RESULT := TBitmap.Create;
RESULT.Width := BitmapOriginal.Width;
RESULT.Height := BitmapOriginal.Height;
RESULT.PixelFormat := pf24bit; // Force this

// Get SIN and COS in single call from math library
sincos(AngleOfRotation, sinTheta, cosTheta);

// If no math library, then use this:
// sinTheta := SIN(AngleOfRotation);
// cosTheta := COS(AngleOfRotation);

// Step through each row of rotated image.
FOR j := RESULT.Height-1 DOWNTO 0 DO
BEGIN
RowRotated := RESULT.Scanline[j];
jPrime := j - jRotationAxis;

FOR i := RESULT.Width-1 DOWNTO 0 DO
BEGIN
iPrime := i - iRotationAxis;
iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta);
jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta);

// Make sure (iOriginal, jOriginal) is in BitmapOriginal. If not,
// assign blue color to corner points.
IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
(jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
THEN BEGIN
// Assign pixel from rotated space to current pixel in BitmapRotated
RowOriginal := BitmapOriginal.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
END
ELSE BEGIN
RowRotated[i].rgbtBlue := 255; // assign "corner" color
RowRotated[i].rgbtGreen := 0;
RowRotated[i].rgbtRed := 0
END

END
END
END {RotateBitmapMethod1};



همان طور كه در كد بالا ملاحظه مي فرماييد ما از دستور ScanLine جهت
چاپ و نمايش پيكسلهاي تصوير استفاده كرده ايم. اين دستور يكي از
بهترين دستورات دلفي براي نمايش پيكسلهاي تصوير مي باشد.
اين دستور به صورت اسمبلي تدوين شده است و نتيجه آن بسيار سريع
مي باشد و سرعت نمايش آن نسبت به ساير دستورات ترسيم ، به خاطر
خطي بودن آن ، بسيار بالاتر مي باشد.

در ابتدا ما به صورت موقت يك تصوير نقشه بيتي ديگر مي سازيم. سپس
تصوير اوليه را با استفاده از فرمول ذكر شده ، مي چرخانيم و در تصوير
جديد قرار مي دهيم. نتيجه يا همان Result اين Function به صورت يك
تصوير نقشه بيتي مي باشد كه همان تصوير چرخانده شده است.

به خاطر داشته باشيد كه تمامي دستورات مربوط به گرافيك و سرعت
عملكرد آنها بستگي كامل به سرعت كامپيوتر كاربر دارد.

موفق باشيد

Nesta
01-07-2005, 05:53
محيط دلفي براي برنامه نويسي يكي از بهترين محيطهاي برنامه نويسي است گذشته از كاركرد داخلي و كمپايلر آن كه بسيار قوي و سريع است، محيط آن يعني IDE آنهم قدرت بسيار زيادي دارد كه باعث شده يكي از بهترين اديتورها باشد. در اين مقاله من سعي بر اين داشته ام تا با ارائه يك سري از نكات و كليدهاي ميانبر كه مي توانند براي كار در دلفي بسيار مفيد و كارا باشند، كمك كنم تا شما بتوانيد با قدرت بيشتر به برنامه نويسي و كار در اين محيط قدرتمند ادامه دهيد.
در قسمت اول مقاله كه در حال حاضر در مقابل شماست من يك سري از كليدهاي ميانبر و تركيبي مورد استفاده در IDE دلفي را بصورت ليست وار و همراه يك توضيح كوچك آورده ام. با توجه به اينكه اين مطالب حاصل تجربه هاي خودم در كار با دلفي (از 1 تا 7) بوده ممكنه كه يك سري موارد ديگري هم باشد كه من تا حالا برخورد نداشتم كه دوستان عزيز ميتونند به اين ليست اضافه كنند و نام خود را در انتهاي اين مقاله ذكر كنند و حتما يك نسخه از آن را براي من ارسال كنند.
اميدوارم كه اين سري مقالات با كمك شما در اثر مرور زمان بهتر و مفيد تر شود.
دوستان عزيز برنامه نويس ممكنه كه شما مدتها با دلفي مشغول برنامه نويسي بوده باشيد اما من يقين دارم كه در اين ليست نكات و روشهاي جديدي را خواهيد آموخت.

قسمت اول - كليدهاي ميانبر و تركيبي:

جستجو در متن بصورت مستقيم:
براي اينكار كليدهاي Ctrl+E را بفشاريد و بدنبال آن شروع به تايپ كلمه مورد نظر كنيد نتيجه آن را خود ببينيد. براي اينكه به كلمه بعدي برويد كافيست كليد F3 را بزنيد.

ايجاد فرورفتگي در كد:
بعضي اوقات - كه خيلي هم پيش مي‌آيد - لازم است كه يك مقداري از متن را بصورت بلوك شده به جلو و يا عقب ببريم. منظور دندانه دار كردن متن است كه به خوانايي برنامه كمك مي كند. براي اينكار مي تونيد از كليد Ctrl +Shift+I براي جلو بردن و Ctrl+Shift+U براي عقب برگرداندن متن بلوك شده استفاده كنيد.

پرش به قسمت تعريف يك شي (Object):
براي اينكه ببنيد شي مورد نظرتون (از قبيل VCL, Procedure, Function,...) در كجا و چطور تعريف شده مي توانيد كليد Crtl رو پايين نگه داشته و روي شي مورد نظر Click كنيد.

براي تغيير حالت كاراكترها:
شما مي توانيد يك قسمت از متن (كه ممكن است با حروف بزرگ و يا كوچك تايپ شده باشد) را انتخاب كنيد و با زدن كليدهاي Ctrl+o+u به ترتيب تمامي حروف كوچك آن قسمت از متن را به حروف بزرگ و تمامي حروف بزرگ آنرا به حروف كوچك تبديل كنيد.
براي تعيير حالت يك كلمه نيز ميتوانيد روي كلمه مورد نظر رفته و كليدهاي Ctrl+k+f براي بزرگ كردن و كليدهاي ctrl+k+e را براي كوچك كردن حروف آن كلمه بكار برد.

درست كردن ماكرو متني:
اين امكان بسيار مفيد است و مي توانيد بسياري از كارهاي نوشتاري را كاهش دهد با اينكار شما ميتوانيد يك سري از كارهاي تكراري كه روي متون انجام مي دهيد را بصورت ماكرو در آورده و از آنها به راحتي استفاده كنيد. براي شروع به ضبط ماكرو كليدهاي ctrl+shift+r را بفشاريد و آن سري كارهايي را كه مي خواهيد را انجام دهيد و سپس براي اينكه به كار ضبط ماكرو پايان دهيد كليدهاي ctrl+shift+r را دوباره بزنيد. حال براي استفاده از ماكرو كافيست در هر جا كه لازم بود كليدهاي Ctrl+Shift+P را بفشاريد.

انتخاب متن بصورت مربعي:
اگر شما از كهنه كارهاي كامپيوتر باشيد حتما از زمان داس يادتون هست كه برنامه اي بود به نام PE2 كه يكي از امكانات بسيار جالبش اين بود كه يك مربع از متن رو ميتوانستين انتخاب
كنيد و آنرا كپي يا حذف كنيد. بله درست متوجه شديد در محيط دلفي هم شما اينكار را ميتوانيد انجام دهيد اما نه به مشكلي PE2 بلكه اينكار را ميتوانيد فقط با گرفتن كليد Alt و كشيدن
موس روي متن انجام دهيد. هر چند ممكن است در نگاه اول زياد اين امكان مفيد به نظر نيايد ولي بعضي وقتهاي خيلي كار را راحت ميكنه، كه حتماً تجربه خواهيد كرد.


گذاشتن علامت روي متن:
اين كار كه به BookMark معروف است بسيار مفيد و كارا مي باشد. در هنگامي كه شما روي قسمتي از متن برنامه كار ميكنيد و مي خواهيد به يك قسمت ديگر برويد ممكن است براي برگشتن به مكان اول خود كمي مشكل پيدا كنيد. ولي شما ميتوانيد با زدن چند دكمه به محل مورد نظرتون باز گرديد. براي اينكار در خطي كه قصد داريد علامت بگذاريد كليدهاي Ctrl+Shift+0..9 را بفشاريد. منظور اينست كه كليدهاي ctrl+Shift را نگه داريد و يكي از اعداد 0 تا 9 را وارد كنيد تا آن خط به همان شماره علامت گذاري شود و سپس هر جا كه خواستيد برويد و سپس هر بار كه كليد Ctrl را نگه داريد و شماره مورد نظر را وارد كنيد به همان خط باز خواهيد گشت. البته توجه داشته باشيد كه فقط مي توانيد 10 خط را با اين روش علامت گذاري بكنيد و براي برداشتن علامت ها كافيست روي همان خط دوباره كليد Ctrl+shift و شماره‌اي كه براي آن خط وارد كرده ايد را بفشاريد با اينكار علامت آن خط برداشته مي شود.


ايجاد كلاس مورد نظر :
شما هنگامي كه در قسمت Private و يا Public يك type، روال يا تابع درست كرديد لازم داريد كه قسمتي را براي قرار دادن كدهاي مربوط به آن روال يا تابع را ايجاد كنيد. براي اينكار شما پس از اينكه نام تابع را تايپ كرديد مي توانيد كليدهاي Ctrl+Shift+C را فشار دهيد تا دلفي يك قسمت براي نوشتن كدهاي مورد نظرتان ايجاد كند.

ظاهر كردن پنجره Code insight :
شما حتما به اهميت و مفيد بودن اين قسمت دلفي واقفيد كه در هنگام كد نويسي تا چه حد مي تواند كارها را راحت كند. بله در هنگام وارد كردن كدها بعد از وارد كردن نام يك كلاس و يا Object با زدن يك نقطه (.) پنجره Code Insight‌ ظاهر مي شود. حال در بعضي وقتها شما ممكن است كه نقطه را قبلا وارد كرده باشيد و يا در مواقع ديگر اين پنجره ظاهر نشود. در
اين صورت براي اينكه پنجره را ظاهر كنيد بايد دوباره نقطه را وارد كنيد ولي راه اسانتري هم وجود دارد و آن اينست كه كليدهاي Ctrl+Speacebar را فشار دهيد.


ظاهر كردن پنجره Code Parameter:
همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنماي توابع كه معمولاً بعد از گذاشتن پرانتز مربوط ظاهر ميشود و در مورد پارامترهاي لازم مي باشد نيز مي توانيد از كليدهاي Ctrl+Shift+SpaceBar استفاده كنيد.

رفتن از قسمت تعريف توابع و روالها به قسمت كد آنها:
هميشه اين نياز وجود خواهد داشت كه شما در هنگامي كه داريد به دنبال يك روال در قسمت type ميگرديد بعد از پيدا كردن نام آن مي خواهيد كه خود آن تابع يا روال را نيز ببنيد. براي اينكار خوب حتما نام آن را جستجو ميكنيد ولي يك راه آسانتر اينست كه شما روي نام آن تابع قرار گيريد و كليدهاي Ctrl+Shift+Up/Down را بزنيد. در اينحالت اگر روي كد تابع باشيد به قسمت تعريف آن خواهيد رفت.



خوب اين هم قسمت اول اين مقاله كه اميدوارم مفيد بوده باشد.

من منتظر شنيدن نظرات و تجربيات شما هستم.

استفاده از اين مقاله در سايتها و ديگر رسانه ها بشرط ذكر نام و نشاني نويسنده بلامانع مي باشد.

Nesta
01-07-2005, 05:54
كمي تاريخچه
FastReport قبلا با نام FreeReport عرضه مي شد و يك محصول رايگان بود. ولي بعدها به FastReport تغيير نام پيدا كرد و به صورت تجاري عرض گرديد. البته هنوز كمپوننت FreeReport توسعه مي يابد و نسخه هاي جديدتر آن را از سايت [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] يا [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] مى‌توانيد داون لود كنيد.

آشنايي كلي با شكل گزارش سازي در FastReport
اين كمپوننت يك محيط Report Desinger در اختيار شما قرار مي دهد كه با استفاده از آن مي توانيد Reportها را طراحي كنيد، اسكريپت نويسي كنيد و يا فرم هاي جديد براي انتخابي كردن گزارش خود ايجاد كنيد. براي وارد شدن به اين Report Desinger بايد از كمپوننت TfrReport استفاده كنيد. كافي است يك كمپوننت TfrReport روي فرم بگذاريد و روي آن دابل كليك كنيد يا كليد سمت راست را زده و گزينه Design Report را انتخاب كنيد. ممكن است اين محيط كه موسوم به Desinger است در ابتدا كمي شلوغ به نظر بيايد ولي در انتهاي اين مقاله آموزشي كاملا با استفاده از اين Desinger آشنا خواهيد شد.

شما مي توانيد گزارش هاي خود را در فايلهايي با پسوند frf. ضبط كنيد و در موقع نياز هر كدام از آنها را Load نماييد و همچنين اگر برنامه شما تنها يك گزارش دارد مي توانيد آن گزارش را در خود فايل EXE نگهداري كنيد.

ساخت يك گزارش ساده
يك كمپوننت TfrReport را روي فرم قرار دهيد و روى آن دابل كليك كنيد تا به محيط Report Designer برويم. خوب ... مى‌خواهيم براى شروع يك گزارش بسيار ساده بسازيم.

از ToolBar سمت چپ گزينه Insert rectangle object را انتخاب كنيد. آيكن اين گزينه شبيه به آيكن كمپوننتMemo است.
مىبينيد كه وقتى اين كمپوننت را در محل مربوطه قرار مى‌دهيد پنجره اى باز مي شود:

همانند شكل در قسمت بالا تايپ كنيد: "سلام دوستان!" و سپس اين پنجره را ببنديد.
خوب! اولين گزارش خودمون رو ساختيم. حالا به سادگى گزارش را Save كنيد و اسم اون رو بگذاريد Test. اين فايل رو در همون جايى ضبط كنيد كه پروژه تون در اونجا Save شده است.
حالا Designer رو ببنديد و يك Button روي فرمتون بگذاريد و و در اونت OnClick آن كد زير رو بنويسيد:

frReport1.LoadFromFile('Test.frf');
frReport1.ShowReport;

خوب! كار ساخت اولين گزارشمون تمام شد. ما خيلي ساده در ابتدا گزارشى را كه قبلا ساخته بوديم Load كرديم و بعدش هم از متد ShowReport براى نمايش گزارش استفاده كرديم. البته مى‌توانستيم از متد PrintPreparedReportDlg براى چاپ مستقيم گزارش بدون نمايش پيش‌نمايش يا Preview استفاده كنيم.
نكته: در صورتى كه بخواهيم ميتوانم با True كردن پراپرتي StoredInDFM گزارش را در EXE خود ضبط كنيم. در آن صورت لازم نيست گزارش را ضبط كنيم و همچنين احتياجى نيست كه آن را در كد Load بكنيم.
اين حالت تنها وقتى مفيد است كه برنامه شما فقط يك گزارش داشته باشد.
خوب! ما تا حالا اصول استفاده از FastReport رو ياد گرفتيم. در باقي اين مقاله آموزشى گزارش‌هاى پيشرفته‌ترى مى‌سازيم و آرام آرام شما با FastReport احساس راحتى مى‌كنيد.

ساخت يك گزارش ديگر
خوب ... يك كمپوننت TTable رو از پالت BDE روى فرمتون قرار دهيد و پراپرتي DatabaseName آن را برابر DBDEMOS و پراپرتى TableName را برابر Biolife قرار دهيد.
يك كمپوننت TfrReport و همچنين يك كمپوننت TfrDBDataSet روى فرم قرار دهيد و پراپرتى DataSet آن را برابر نام Table1 قرار دهيد و پراپرتى DataSet كمپوننت TfrReport را برابر frDBDataSet1 قرار بدهيد. حالا با كليك بر روى كمپوننت frReport1 وارد محيط Designer شده و Tools>Tools>Insert DB Fields را انتخاب كنيد.
خوب شما انتخاب كنيد و آن را روي فرم قرار دهيد. پنجره اي شبيه به شكل زير نمايش داده مى‌شود:


تمام فيلدها را انتخاب كنيد و OK را بزنيد.....
خوب تقريبا كارمان تمام است. اگر خوب نگاه كنيد مي بينيد كه دو باند روى فرم گزارش اضافه شد كه يكى Page Header و ديگرى Master Data نام دارد. File>Preview را انتخاب كنيد و ببينيد گزارش شما چه شكلى خواهد بود. گزارش خودتان را Save كنيد و از روشى كه قبلا ذكر شد براى نمايش گزارش در زمان اجرا يا Run-Time استفاده كنيد.

ساخت گزارش‌هاى پيشرفته‌تر
به موارد زير توجه كنيد:
1- اگر بخواهيد از كمپوننتهايى مثل RichEdit - Chart - CheckBox و ... در گزارش خود استفاده كنيد بايد كمپوننت مربوطه را روى فرم برنامه خود قرار دهيد.
2- اگر بخواهيد امكان Export گزارش به فرمتهاى HTML - Text - CSV يا DOC را به برنامه خود بدهيد بايد كمپوننت مربوطه را روى فرم برنامه خود قرار دهيد.
3- اگر بخواهيد گزارش Master-Detailى بسازيد بايد از دو باند Master data و Detail data استفاده كنيد.
4- اگر بخواهيد مجموع مقادير يك فيلد رو در انتهاى يك گزارش بنويسيد بايد از يك باند Master footer استفاده كنيد و گزينه Insert rectangle object را انتخاب كنيد. سپس Insert Expression را انتخاب كنيد. Functions را انتخاب كنيد و از تابع Count براى انجام اين كار استفاده كنيد. همچنين مى‌توانيد Variables را انتخاب كنيد و از مواردى همچون شماره صفحه، كل صفحات، تاريخ و ... استفاده كنيد.

اميدوارم اين مقاله بتونه هر چند اندك شما رو با FastReport آشنا كنه

Nesta
01-07-2005, 05:54
برخي مواقع بعضي از برنامه هاي شما احتياج به خواندن اطلاعات از روي
CD را دارند. قبل از اجراي برنامه مي توان با استفاده از دستورات مختلفي
مانند FileExists وجود CD مورد نظر در CD-Rom را بررسي كرد و در صورت صحيح
بودن آن برنامه را اجرا كرد.

اما اگر كاربر در هنگام اجراي برنامه CD حاوي اطلاعات را از CD-Rom خارج كند
به چه صورت مي توان آن را تشخيص داد.

شايد بررسي مكرر توسط دستوراتي از قبيل FileExists كار درستي نباشد.
ويندوز براي شما يك دستور تدارك ديده كه توسط آن مي توانيد وارد و خارج شدن
CD از CD-Rom را تشخيص دهيد.

زماني كه شما يك CD را وارد CD-Rom مي كنيد آن به عنوان يك Device جديد
براي ويندوز شناخته مي شود. پس از اين روش مي توان وارد و خارج كردن آن را
در هنگام اجراي برنامه تشخيص داد.

به كد زير توجه فرماييد :


type
TForm1 = class(TForm)
private
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
// اين قسمت فراموش نشود
public

end;

{...}

implementation

{$R *.DFM}

procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
var
myMsg: string;
begin
inherited;
case Msg.wParam of
DBT_DEVICEARRIVAL: myMsg := 'CD inserted!';
DBT_DEVICEREMOVECOMPLETE: myMsg := 'CD removed!';
end;
ShowMessage(myMsg);
end;



به همين سادگي مي توان اين عمل را تشخيص داد.
البته راههاي ديگري نيز براي تشخيص اين اعمال وجود دارند اما بهترين
و راحت ترين راه ممكن ، همان راهي است كه من براي شما نوشته ام.

از اين كد در برنامه هاي خود استفاده كنيد و جلوي Error هاي برنامه را در
صورت عدم وجود CD در CD-Rom بگيريد.

برنامه را اجرا كنيد ، سپس يك CD در درايو قرار دهيد ، بار ديگر CD را از
درايو خارج نماييد و نتيجه آن را مشاهده كنيد.

موفق باشيد

Nesta
01-07-2005, 05:55
*** دو کد زير در دلفي 7 تحت ويندوزهاي 98، 2K و XP تست شده اند ***


يک روش ساده براي نمايش فايلهاي داخل يک folder همراه با Icon آنها و اعلام نوع فايل (استفاده از API)
يک ListView، يک ImageList و يک Buttonروي فرم قرار دهيد.
کد از نايتي


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ImgList, ShellAPI;

type
TForm1 = class(TForm)
ImageList1: TImageList;
Button1: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure InsertFilesInList( strPath: String; ListView: TListView; ImageList: TImageList);
var
pFile: Integer;
Icon: TIcon;
SearchRec: TSearchRec;
ListItem: TListItem;
FileInfo: SHFILEINFO;
begin
// Create a temporary TIcon
Icon := TIcon.Create;
ListView.Items.BeginUpdate;
try
// search for the first file
pFile := FindFirst(strPath + '*.*', faAnyFile, SearchRec);
while pFile = 0 do
begin
with ListView do
begin
// On directories and volumes
if ((SearchRec.Attr and FaDirectory <> FaDirectory) and
(SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
begin
ListItem := ListView.Items.Add;
//Get The DisplayName
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_DISPLAYNAME);
Listitem.Caption := FileInfo.szDisplayName;
// Get The TypeName
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_TYPENAME);
ListItem.SubItems.Add(FileInfo.szTypeName);
//Get The Icon That Represents The File
SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo,
SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
Icon.Handle := FileInfo.hIcon;
ListItem.ImageIndex := ImageList.AddIcon(Icon);
// Destroy the Icon
DestroyIcon(FileInfo.hIcon);
end;
end;
pFile := FindNext(SearchRec);
end;
finally
Icon.Free;
ListView.Items.EndUpdate;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Assign a Imagelist to the ListView
ListView1.SmallImages := ImageList1;
// Show Listview in Report Style and add 2 Columns
ListView1.ViewStyle := vsReport;
ListView1.Columns.Add;
ListView1.Columns.Add;
InsertFilesInList('C:\', ListView1, ImageList1);
end;

end.



گاهي بد نيست براي انجام بعضي کارها از خود سيستم کمک بگيريم. کد زير اندازه فايلي که انتخاب ميشود را بر ميگرداند. بد نيست، به درد Text-fileها ميخوره .
يک Button، يک Label، يک OpenDialog روي فرم قرار دهيد.
کد از کريس بري

procedure TForm1.Button1Click(Sender: TObject);
var
SearchRec: TSearchRec;
begin
if OpenDialog1.Execute then
if FindFirst(OpenDialog1.FileName, faAnyFile, SearchRec) = 0 then
Label1.Caption := FloatToStrF(SearchRec.Size/1048576, ffFixed, 7, 2)+' MB';
FindClose(SearchRec);
end;

Nesta
01-07-2005, 05:56
تبديل خصوصيات فونتها به يك رشته و برعكس

بعضى اوقات ضرورى است كه خصوصيات يك Object خاص را به شكل string يا رشته داشته باشيم. به عنوان مثال، اگر يك برنامه به كاربر اجازه تغيير فونت را بدهد، برنامه شما بايد اين تغييرات را در Registry ضبط كند؛ در آن صورت شما بايد اين تنظيمات را به عنوان رشته ذخيره كنيد. دو تابع زير به شما اجازه مى‌دهد كه خصوصيات يك Object فونت را به رشته تبديل كنيد و آنگاه آن راشته را به يك Object فونت تبديل نماييد.

const
csfsBold = '|Bold';
csfsItalic = '|Italic';
csfsUnderline = '|Underline';
csfsStrikeout = '|Strikeout';

//
// Expected format:
// "Arial", 9, [Bold], [clRed]
//
procedure StringToFont(
sFont : string; Font : TFont );
var
p : integer;
sStyle : string;
begin
with Font do
begin
// get font name
p := Pos( ',', sFont );
Name :=
Copy( sFont, 2, p-3 );
Delete( sFont, 1, p );

// get font size
p := Pos( ',', sFont );
Size :=
StrToInt( Copy( sFont, 2, p-2 ) );
Delete( sFont, 1, p );

// get font style
p := Pos( ',', sFont );
sStyle :=
'|' + Copy( sFont, 3, p-4 );
Delete( sFont, 1, p );

// get font color
Color :=
StringToColor(
Copy( sFont, 3,
Length( sFont ) - 3 ) );

// convert str font style to
// font style
Style := [];

if( Pos( csfsBold,
sStyle ) > 0 )then
Style := Style + [ fsBold ];

if( Pos( csfsItalic,
sStyle ) > 0 )then
Style := Style + [ fsItalic ];

if( Pos( csfsUnderline,
sStyle ) > 0 )then
Style := Style + [ fsUnderline ];

if( Pos( csfsStrikeout,
sStyle ) > 0 )then
Style := Style + [ fsStrikeout ];
end;
end;

//
// Output format:
// "Aril", 9, [Bold|Italic], [clAqua]
//
function FontToString(
Font : TFont ) : string;
var
sStyle : string;
begin
with Font do
begin
// convert font style to string
sStyle := '';

if( fsBold in Style )then
sStyle := sStyle + csfsBold;

if( fsItalic in Style )then
sStyle := sStyle + csfsItalic;

if( fsUnderline in Style )then
sStyle := sStyle + csfsUnderline;

if( fsStrikeout in Style )then
sStyle := sStyle + csfsStrikeout;

if( ( Length( sStyle ) > 0 ) and
( '|' = sStyle[ 1 ] ) )then
begin
sStyle :=
Copy( sStyle, 2,
Length( sStyle ) - 1 );
end;

Result := Format(
'"%s", %d, [%s], [%s]',
[ Name,
Size,
sStyle,
ColorToString( Color ) ] );
end;
end;

Nesta
01-07-2005, 05:57
با سلام
كسانيكه با اينترنت كار ميكنند مطمنا براي يكبار هم شده از فايلهاي real استفاده كرده اند فايلهايي كه
با پسوند هاي rm,ra,ram,... مي باشند و فرمتهاي صوتي و تصويري را پشتيباني ميكنند .با اين توضيح به نكات
ذيل توجه كنيد!
اين نرم افزار توانايي دارد يك فايل mpeg با حجم 15 مگابايت را به فايل تصويري به حجم
1 مگابايت تبديل كند.البته لازم به توضيح است كه كيفيت تصوير چندان مطلوب نمي باشد و در مواردي مي توان از آن استفاده كرد.
همچنين فايلهاي صوتي حتيMP3 با كيفيت مطلوب توسط اين سيستم به مقدار قابل توجهي كم حجم ميشوند.
نرم افزاري هايي از قبيل REAL PRODUCER قابليت تبديل فايلها را با هر فرمتي به REAL دارا مي باشند واحتياجي به سخت افزار نمي باشد
چگونگي استفاده از اين امكانات در دلفي:
ابتدا بايد نرم افزار REAL بر روي رايانه شما نصب شود سپس در دلفي به :
را انتخاب كنيد.import activex control\commponent
در پنجره جديد real player activeX control library(version X,x) را انتخاب كرده و دكمه install را بزنيد.
حال در قسمت activex ايكوني آبي رنگ با علامت play داريد.آن را به فرم اضافه كنيد!
يك حستجو گر صوتي بر روي فرم شما ايجاد ميشود كه تصوير آن بستگي به نسخه نصب شده REAL بر روي سيستم شمادارد.
براي پخش يك فايل شما ميتوانيد نام آن را در source وارد كرده و برنامه را اجرا كنيد ويا براي كنترل فايل توسط
برنامه ميتوانيد از دستورات زير استفاده كنيد.

raelaudio1.source =:('path\filename');
realaudio1.doplay;

براي استفاده يك كايد جهت play/pause مانند دستگاههاي video cd نيز ميتوانيد از دستور زير استفاده كنيد.

real audio1.doplaypause;

و

realaudio1.dostop;جهت پايان دادن به پخش
realaudio1.getitle;مشخصات فايل كه در زمان ساخت به آن معرفي ميگردد
realaudio1.setmute:=true/false;جهت قطع صدا
realaudio1.autostart:=true/false;جهت شروع خودكار در زمان اجراي برنامه

همچنين دستوراتي نيز براي كنترل فريم هاي فايل (ff,rew,...) وجود دارد كه در مقاله بعدي به همراه چگونگي استفاده از قابليت تصويري اين كنترل كه بسيار جالب مي باشد شرح خواهم داد. ان شا الله
با تشكر

Nesta
01-07-2005, 05:57
طريقه بدست آوردن اطلاعات مربوط به هارد ديسک - سي دي رام - فلاپي ديسک
اطلاعاتي که روالهاي زير برمي گرداند عبارتست از شماره سريال - نوع سيستم فايل -
پشتيباني از نام فايلهاي طولاني و نام درايو


From The Windows.Pas
--------------------
--------------------

function GetVolumeInformationA(lpRootPathName: PAnsiChar;
lpVolumeNameBuffer: PAnsiChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PAnsiChar; nFileSystemNameSize: DWORD): BOOL; stdcall;

function GetVolumeInformationW(lpRootPathName: PWideChar;
lpVolumeNameBuffer: PWideChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PWideChar; nFileSystemNameSize: DWORD): BOOL; stdcall;

function GetVolumeInformation(lpRootPathName: PChar;
lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL; stdcall;

Example
-------
-------

Used Variables
--------------
Path : PChar;
--> String that contains the root directory of the volume to
be described.
VolumeName : PChar;
--> Points to a buffer that receives the name of the specified
volume.
VolumeNameSize : DWord;
--> Specifies the lenght in characters of the buffer that
receives the volume name.
SerialNumber : DWord;
--> Points to a variable that receives the volume's serial
number.
MaxLength : DWord;
--> Receives the maximum length in characters of a filename
supported by the specified file system.
(to indicate if long file names are supported)
- long file names --> value : 255
Flags : DWord;
- FS_CASE_IS_PRESERVED
- FS_CASE_SENSITIVE
- FS_UNICODE_STORED_ON_DISK
- FS_PERSISTENT_ACLS
- FS_FILE_COMPRESSION
- FS_VOL_IS_COMPRESSED
(for more info on the flags look in the help file)
FileSystem : PChar;
--> Points to a buffer that receives the name of the specified
file system.
FileSystemNameSize: DWord;
--> Specifies the lenght in characters of the buffer that
receives the filesytem name.

Code
----
Path := 'C:\';
VolumeNameSize := 256;
FileSystemNameSize := 256;
GetVolumeInformation(Path,VolumeName,VolumeNameSiz e,
@SerialNumber,MaxLength,Flags,FileSystem,FileSyste mNameSize);

Nesta
01-07-2005, 05:58
بالاترين 9 بسته Installساز
اگر به دنبال ابزارى ميگرديد كه برنامه خود را منتشر كرده و تحويل دهيد بيش از اين نگرديد! اين گزارش را بخوانيد.

DeployMaster
اگر به دنبال يك ابزار مناسب براى توزيع انتشار برنامه ويندوزى خود يا فايلهاى كامپيوترى خودتان مى‌گرديد و به علاوه ساير Installسازها شما را خسته كرده‌اند آنگاه JGsoft DeployMaster راه حلى است كه شما لازم داريد.


Emma Setup
نسخه 3 Emma Setup يك Installساز 32 بيتي است. لازم نيست كه يك برنامه‌نويس باشيد تا بتوانيد يك Install شخصى و حرفه‌اى بسازيد. در حالى كه خصوصيات حرفه‌اى خيلى زيادى دارد قيمت آن بسيار پايين و كار كردن با آن بسيار ساده است. اين برنامه براي بسيارى از موارد بهترين انتخاب است.

gInstall
فقط تصور كنيد كه يك Installer قابل Skin گذارى چقدر مى‌تواند مفيد باشد. مشتريان شما برنامه شما را از همان آغاز دوست خواهند داشت. اجازه دهيد مشتريانتان با استفاده از شركت يا برنامه شما خودشان را بشناسند. آيا دوست نداريد Setup برنامه شما دقيقا به شكل و تيپ برنامه خودتان باشد.

Install Shield
Install Shield قابليت كنترل كامل بر روى Installer ويندوز را به شما مي دهد و خصوصيات جديد و قدرتمند Installer ويندوز را در اختيار شما قرار مي‌گذارد. برنامه نويسان بدون نوشتن حتي يك خط كد مي توانند از تمامي قابليتهاي Installer ويندوز استفاده كنند.

Wise Solutions
Wise انقلاب بعدي در زمينه ساخت Installer براي ويندوز است كه كاربران را كاملا در سيكل زماني ساخت Setup قرار مي دهد. شما قابليتهايي از قبلي ساخت Installهاي حرفه‌اي و قابل اطمينان را خواهيد داشت.

Inno Setup
Inno Setup يك Setup ساز رايگان براي ويندوز است كه تمامي نسخه هاي 32بيتي ويندوز را پيشتيباني مي كند. اگرچه رايگان است ولي بسيار بسيار قدرتمند است و سورس آن به زبان دلفي نيز مهيا مي باشد.

ICE (Install Creation Environment)
يك Installساز قوي كه به شما اجازه مي دهد Setup برنامه هاي خود را كه با دلفي يا C++ Builder نوشته ايد بسازيد. احتياج به يادگرفتن يك زبان scripting نيست. كار كردن با اين نرم افزار بسيار ساده است و اصولا براي ساخت Install براي دلفي و C++ Builder ساخته شده است.

GP-Install
GP-Install يك Setup ساز است كه خصوصيات "ساده بودن" و "قابل درك بودن" را با هم تركيب كرده است. Setup ساخته شده بسيار فشرده است. و به شما اجازه مي دهد كه Setup خود را هر گونه كه دوست داريد بياراييد. جالبتر از همه اين كه آن رايگان است.

Instyler
اگر به دنبال يك Installer ارزان قيمت و آسان ميگرديد تا برنامه هاي خود را انتشار دهيد SmartSetup را آزمايش كنيد. اين برنامه قابليت هايي همچون: مديريت پروژه، انوع مختلف Setup، سازگاري با Registry/Ini، شكل قابل تغيير Setup، پشتيباني از uninstallat، امكان upgrade، امكان حفاظت با استفاده از رمز، استفاده ار shortcutها و بسياري خصوصيات استاندارد و حرفه اي ديگر.

Nesta
01-07-2005, 05:59
در اين مقاله طريقه اجرا يا باز کردن نرم افزار هاي خارج از محيط دلفي را با استفاده از تابع API ويندوز ShellExecute را ياد خواهيد گرفت.
چرا بايد برنامه ها را از دلفي اجرا کرد؟
شايد اين سوال براي شما پيش بيايد چرا بايد نرم افزارها را خارج از دلفي اجرا کرد. شما در يکي از موارد ذيل ممکن است نياز به اجراي يک نرم افزار خارج از دلفي داشته باشيد
• برنامه هاي نصب و عزل
• برنامه هاي سيستمي
• برنامه هاي اپليکيشن سرور
• برنامه هاي گزارش گيري
• و ....
موارد بسياري است که ممکن است شما بخواهيد از اين دستور استفاده کنيد که به چندي از آنها اشاره شد.

دستور ShellExecure
اين دستور به ما اجازه ميدهد که برنامه هاي ديگر را اجرا کنيم. نحو اين دستور به شکل ذيل مي باشد.

HINSTANCE ShellExecute(HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);

جدول زير پارامترهاي اين دستور را شرح ميدهد.

پارامتر ورودي/خروجي توضيحات

hwnd

ورودي

دستگيره يا هندل پنجره اصلي - براي گزارش خطاها حتما نياز است

lpOperation

ورودي

اشاره گر - اين پارامتر به نوع عمليات اشاره مي کند

lpFile

ورودي

اشاره گر به نام فايل اجرايي شما

lpParameters

ورودي

اشاره گر به پارامترهاي ارسالي به نرم افزار شما - در صورتي که پارامتر نباشد به صورت تهي بماند

lpDirectory

ورودي

دايرکتوري پيش فرض براي اجراي نرم افزار

nShowCmd

ورودي

اشاره گر تنظيم حالت نمايش برنامه بعد از اجرا


د ر صورتي که دستور shellexcute به درستي اجرا نشود يک کد خطا برمي گرداند شما مي توانيد با استفاده از تابع GetLastError خطا رخ داده را متوجه شويد. در صورتي که دستور Shellexecute به درستي اجرا شود کد خطاي بازگشتي بزرگتر از 32 مي باشد . در صورتي که کد خطا بازگشتي کمتر يا برابر با 32 باشد يک خطا رخ داده است. براي دريافت اطلاعات بيشتر در مورد کدهاي خطا اين دستور به MSDN مراجعه کنيد.
در دلفي شما به راحتي با استفاده از دستور SysErrorMessage مي توانيد آخرين خطا را بدست آوريد.نمونه کد زير روش استفاده از اين دستور را نشان داده است.

if ShellExecute(Handle, 'print', PChar('c:\log.txt'), nil, nil, SW_SHOWNORMAL) <= 32 then
ShowMessage(SysErrorMessage(GetLastError));


پارامتر lpOperation
با استفاده از دستور ShellExecute مي توان نرم افزارها و آبجکتهاي مختلف را اجرا کرد . مقادير قابل قبول براي پارامتر دوم اين دستور lpOperation به شرح جدول ذيل مي باشد.


lpOperation مقدار پارامتر

شرح

edit

باز کردن يک سند براي ويرايش در يک ويرايشگر

explore

مرورگر فايلهاي ويندوز براي مرور دايرکتوري خاص ...

find

جستجو به دنبال يک فايل در دايرکتوري خاص...

open

باز کردن يک فايل يا برنامه

print

چاپ يک سند

NULL

اطلاعات بيشتر در پايين ...



در صورتي که مقدار پارامتر lpOperation برابر با null قرار بگيرد براي باز کردن فايل يا برنامه از رجيستري ويندوز و از قسمت تخصيص فايلهاي اجرايي به پسوند فايلها براي اجراي دستور فوق استفاده مي گردد.
پارامتر nShowCmd
اين پارامتر به دستور ShellExecute مي گويد که بعد از اجراي يک برنامه آن را به چه حالتي نمايش بدهد. انواع حالات مختلف در جدول ذيل آمده است.



nShowCmd مقدار پارامتر

شرح

SW_HIDE

مخفي کردن پنجره

SW_MAXIMIZE

بزرگ کردن پنجره

SW_MINIMIZE

به حداقل رساندن پنجره

SW_RESTORE

فعال کردن يک پنجره در صورتي که به حالت حداقل يا حداکثر باشد

SW_SHOW

نمايش پنجره در حالت و موقعيت پيش فرض

SW_SHOWDEFAULT

نمايش پنجره به حالت پيش فرض در برنامه

SW_SHOWMAXIMIZED

فعال و به حداکثر رساندن پنجره

SW_SHOWMINIMIZED

فعال و به حداقل رساندن يک پنجره

SW_SHOWMINNOACTIVE

نمايش يک پنجره در حالت غير فعال و حداقل

SW_SHOWNA

نمايش يک پنجره در وضعيت فعلي

SW_SHOWNOACTIVATE

نمايش و فعال کردن يک پنجره - ويندوز اين پنجره را در حالت پيش فرض خود نمايش مي دهد.

SW_SHOWNORMAL

نمايش و فعال کردن پنجره به حالت عادي

وقتي که شما براي اولين بار يک برنامه را اجرا مي کنيد بايد از مقدار SW_SHOWNORMAL استفاده کنيد.

استفاده از دستور ShellExecute
درقسمت پايين چند نمونه از حالتهاي استفاده از اين دستور آورده شده است. شما مي توانيد اين دستورات را براي کار خود تغيير دهيد. در دلفي براي استفاده از اين دستور بايد دو يونيت Windows و ShellAPI در قسمت Uses قرار گرفته باشد.


اجراي برنامه Demo.exe از دايرکتوري C:\app

ShellExecute(Handle,NIL,PChar('C:\apps\demo.exe'), nil,nil,SW_SHOWNORMAL);

باز کردن فايل log.txt

ShellExecute(Handle,'open',PChar('c:\log.txt'), nil,nil,SW_SHOWNORMAL);

پخش فايل ending.mp3

ShellExecute(Handle,'play',PChar('c:\ending.mp3'), nil,nil,SW_SHOWNORMAL);

چاپ فايل log.txt

ShellExecute(Handle,'print',PChar('c:\log.txt'), nil,nil,SW_SHOWNORMAL);

باز کردن مروگر فايل ويندوز از C:\

ShellExecute(Handle,'explore',PChar('c:\'), nil,nil,SW_SHOWNORMAL);

ساخت يک نامه الکترونيکي جديد به واسطه Outlook Express

Procedure CreateEmail(Const EmailAddr, Subject, Body: String);
var
ConcatEmailStr: String;
Begin
ConcatEmailStr := EmailAddr + '?subject=' + Subject + '&body=' + Body;

ShellExecute(Handle,'open',PChar(ConcatEmailStr), nil, nil, SW_SHOWNORMAL);
end;

براي کسب اطلاعات بيشتر به آدرس ميکروسافت
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مراجعه فرماييد.

Nesta
01-07-2005, 05:59
آيا به دنبال راهى مى‌گرديد كه اپلت‌هاى كنترل پانل را از داخل برنامه تان بدون باز كردن خود كنترل پانل باز كنيد؟

آيا احتياج داريد كه كاربرانتان بتوانند تاريخ/زمان سيستم را تغيير دهند، يك مودم اضافه كنند يا تنظيمات مربوط به joystick را تغيير دهند؟ يك راه ساده براي انجام چنين كارهاي بدون اين كه كاربر را مجبور كنيد Control Panel را باز كند وجود دارد. مسئله جالب اين است كه شما مي توانيد از اين روش در هر ويندوزى و يا در يك BATch فايل ساده استفاده كنيد.

اجرا كردن دستور زير در برنامه شما سبب انجام اين حقه خواهد شد (CPL نام فايلهاي اپلت كنترل پانل است. ليستى از اين فايلها را مى‌توانيد در انتهاى اين مقاله پيدا كنيد. مضافا اينكه مي توانيد به دنبال فايلهايى با پسوند CPL در شاخه ويندوز Search كنيد و ليست كامل فايلهاي را بيابيد)


rundll32.exe shell32.dll,Control_RunDLL CPL


به عنوان مثال براى نشان دادن پنجره "تنظيمات تاريخ/زمان" از كد زير استفاده كنيد:


rundll32.exe shell32.dll,Control_RunDLL timedate.cpl

مثال كد دلفي / C++ Builder
يونيت زير را در پروژه خود قرار دهيد و تابع RunControlPanelApplet را همراه با نام Applet مورد نظرتان صدا كنيد تا باز شود. به عنوان مثال: RunControlPanelApplet( 'timedate.cpl' );


unit open_cpl;

interface

function RunControlPanelApplet(
sAppletFileName : string) : integer;

implementation

uses Windows;

function RunControlPanelApplet(
sAppletFileName : string) : integer;
begin
Result :=
WinExec(
PChar('rundll32.exe shell32.dll,'+
'Control_RunDLL '+sAppletFileName),
SW_SHOWNORMAL);
end;

end.


چگونه نام فايلهاى اپلت را پيدا كنيم؟
اپلتهاى كنترل پانل پسوند CPL دارند. براى پيدا كردن ليستى از اپلتهاى نصب شده بر روي سيستم خود به شاخه SYSTEM (در ويندوزهاي 95) يا شاخه SYSTEM32 (در ويندوزهاي NT) برويد و به دنبال فايلهايى بگرديد كه پسوند CPL دارند.
در زير ليستي از اپلتهاى عمومى را در ويندوز 95 و ويندوز NT مى‌بينيد:


access.cpl: Accessibility Properties
appwiz.cpl: Add/Remove Programs Properties
desk.cpl: Display Properties
intl.cpl: Regional Settings Properties
joy.cpl: Joystick Properties
main.cpl: Mouse Properties
mmsys.cpl: Multimedia Properties
modem.cpl: Modems Properties
sysdm.cpl: System Properties
timedate.cpl: Time/Date Properties

Nesta
01-07-2005, 05:59
چگونه از فايلهاى PDF در دلفى استفاده كنيم؟
1. دلفى را آغاز كرده و Component | Import ActiveX Control را انتخاب كنيد.
2. به دنبال "(Acrobat Control for ActiveX (Version x.x" بگرديد و به Install را بزنيد.
3. نام پالتى كه كمپوننت مورد نظر بايد در آن نصب شود را انتخاب كنيد.
4. Install را كليك كنيد.
5. Packageي كه قرار است كمپوننت در آن نصب شود را انتخاب كنيد يا يك Package جديد براى كنترل جديد TPdf بسازيد.
6. بر روي OK كليك كنيد.
7. دلفى به شما پيغام مى‌دهد كه آيا مايل به Rebuild كردن Package جديد/تغييريافته هستيد؟
8. Yes را كليك كنيد. دلفى به شما پيغام مى‌دهد كه كمپوننت TPdf نصب شده است.
9. Package را ببنديد و به دلفى اجازه دهيد كه آن را Save كند.
10. حالا كمپوننت در تب ActiveX موجود مى‌باشد.
13. كمپوننت TPdf را روي فرم بكشيد.
14. با استفاده از Object Inspector پراپرتي src را مطابق آدرس يك فايل PDF كه روى كامپيوتر شما يا وب موجود مى‌باشد قرار دهيد. حالا تنها كارى كه بايد انجام دهيد تغيير اندازه كمپوننت مورد نظر است.



نكات:
1. اگر شما ActiveX مربوطه را نداريد، همين حالا آن را از سايت [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] داون لود كنيد. چون براي اين مثال ضرورى است.
2. مي‌توانيد آخرين مرحله (مرحله 14) را در زمان اجرا يا RunTime انجام دهيد. بنابراين شما مى‌توانيد هر فايلى را در اجرا باز كرده و آنرا تغيير اندازه دهيد.

Nesta
01-07-2005, 06:00
چگونه يك HotKey يا ميان بر سيستم درست كرده و آن را مديريت كنيم؟ (كه در تمامي برنامه ها كار كند)
مرجع: [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


{**********************

Copyright © by Jim McKeeth Licensed under LGPL
( [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] )

Demo of creating a system wide hotkey or shortcut
This was written in Delphi 7,
but should work in most other versions
(but obviously not Kylix)
You need a form with
1) a THotKey named HotKey1
2) a TCheckBox named CheckBox1
To demo
1) Change the hotkey in the value
2) Check the box
3) Minimize the application
4) Press the hot key
5) Be impressed
---------}
unit SystemHotKeyUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, StdCtrls, ComCtrls, Dialogs,
// Menus need to be added for calls in the code
Menus;

type
TForm1 = class(TForm)
HotKey1: THotKey;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
protected
// Handle the global hot key
messages when they are sent to the window
procedure HotyKeyMsg(var msg:TMessage); message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
myAtom: integer;

function ShiftState2Modifier(const Shift: TShiftState):Word;
begin
Result := 0;
if ssShift in Shift then
Result := Result or MOD_SHIFT;
if ssAlt in Shift then
Result := Result or MOD_ALT;
if ssCtrl in Shift then
Result := Result or MOD_CONTROL;
end;

function GetShortCutKey(ShortCut: TShortCut):Word;
var
shift: TShiftState;
begin
ShortCutToKey(ShortCut,Result,shift); // call in Menus!
end;

function GetShortCutModifier(ShortCut: TShortCut):Word;
var
key: Word;
shift: TShiftState;
begin
ShortCutToKey(ShortCut,key,shift); // call in Menus!
Result := ShiftState2Modifier(shift);
end;

function RegisterHotShortCut(const h:THandle; const Atom: integer;
const ShortCut: TShortCut):Boolean;
var
key : Word;
Shift: TShiftState;
begin
UnregisterHotKey(h,Atom); // call in Windows
ShortCutToKey(ShortCut,key,shift);
Result := RegisterHotKey(h,Atom,ShiftState2Modifier(Shift),k ey);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// you need to type cast it as a pChar if you are using a string
myAtom := GlobalAddAtom(pchar('HotKeyDemo'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle,myAtom);
GlobalDeleteAtom(myAtom);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
RegisterHotShortCut(Handle,myAtom,HotKey1.HotKey)
else
UnregisterHotKey(Handle,myAtom);
end;

procedure TForm1.HotyKeyMsg(var msg: TMessage);
begin
if (msg.LParamLo=GetShortCutModifier(HotKey1.HotKey))
and (msg.LParamHi=GetShortCutKey(HotKey1.HotKey)) then
begin
Application.BringToFront;
Showmessage('Hey, now that is a system wide hot key!')
end;
end;

end.

Nesta
01-07-2005, 06:01
در اين مقاله ياد خواهيد گرفت که چگونه با استفاده از کد نويسي در دلفي Activex يا dll مورد نياز برنامه خود را در دستگاه کاربرانتان نصب کنيد.
براي رسيدن به اين هدف از دستور regsvr32.exe استفاده مي کنيم.
اين دستور يکي از دستورات ويندوز است که براي رجيستر کردن Activex يا dll ها بکار مي رود.
خط فرمان اين دستور به شکل زير مي باشد.

Regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
/s – در موقع نصب هيچ پيام يا پنجره اي نمايش نده
/u – حذف فايل

ما با استفاده از اين دستور ويندوز و کد دلفي زير مي توانيم به نتيجه مورد نظر خود برسيم.

procedure RegisterOCX;
type
TRegFunc = function : HResult; stdcall;
var
ARegFunc : TRegFunc;
aHandle : THandle;
ocxPath : string;
begin
try
ocxPath := ExtractFilePath(Application.ExeName) + 'Flash.ocx';
aHandle := LoadLibrary(PChar(ocxPath));
if aHandle <> 0 then
begin
ARegFunc := GetProcAddress(aHandle,'DllRegisterServer');
if Assigned(ARegFunc) then
begin
ExecAndWait('regsvr32','/s ' + ocxPath);
end;
FreeLibrary(aHandle);
end;
except
ShowMessage(Format('Unable to register %s', [ocxPath]));
end;
end;

در روال بالا مقدار ocxpath برابر با مسير فايل dll يا ocx ما مي باشد. ممکن است نصب يک dll ياocx طول بکشد و بعد از اجراي روال بالا دستور لازم براي نصب صورت گرفته و برنامه ادامه کار خود را پيگيري مي کند. اگر اين مدت زمان زياد باشد برنامه شما اجرا شده ولي هنوز dll يا ocx رجيستر نشده است. به همين منظور از تابع ExecAndWait استفاده مي کنيم. اين تابع بعد از اجراي يک دستور منتظر مي ماند تا کار به طور کامل انجام پذيرد. کد اين تابع به شرح ذيل مي باشد.

uses shellapi;
...
function ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
begin
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile);
lpParameters := PChar(ParamString);
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
Result:=True;
end
else Result:=False;
end;

اميدوارم که از اين مقاله استفاده لازم را برده باشيد.

Nesta
01-07-2005, 06:02
در اين مقاله ميخواهم نحوه برقراري ارتباط با پروتکل ياهو مسنجر يکي ازمعروفترين و مهمترين مسنجرهاي اينترنتي را بيان کنم. در صورتي که علاقه منديد که با Msn مسنجر ارتباط برقرار کنيد مي توانيد از مقالات ديگر که در اين زمينه نوشته ام در همين سايت استفاده کنيد. براي برقراري با پروتکل ياهو مسنجر بايد با دستورات و روش برقراري ارتباط با آن مطلع باشيم. ولي در حال حاضر نمي خواهم به نکات ريز و نحو دستورات اين پروتکل بپردازم . بلکه يک برنامه در دلفي مينويسيم که با استفاده از آن بشود با ياهو مسنجر ارتباط برقرار کرد و از مزاياي آن استفاده کرد. در اين مثال از کمپوننتهاي ايندي Indy استفاده کرده ام ولي شما مي توانيد بر حسب نياز يا سليقه خود از هر کمپوننت ارتباطي ديگري براي برقراري ارتباطات tcp/ip استفاده کنيد.
کد دلفي

<-------------------------------BEGIN UNIT CODE ------------------------------>
unit YahooLogin;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, Id[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] idGlobal;

type
TForm1 = class(TForm)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] TId[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
ListBox1: TListBox;
Label3: TLabel;
ListBox2: TListBox;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FRemoteFile: TStringList;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
LoginURL = '[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';

procedure TForm1.Button1Click(Sender: TObject);
var
Tmp, UserName, Password: String;
i, BuddyBegin, BuddyEnd: Integer;
begin
if (Edit1.Text = '') or (Edit2.Text = '') then
raise Exception.Create('Login/Password cannot be blank');

UserName := URLEncode(Edit1.Text);
PassWord := URLEncode(Edit2.Text);
Tmp := Format(LoginURL, [UserName, PassWord]);

FRemoteFile.Text := [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ](Tmp);

if FRemoteFile[0] = 'OK' then
begin
for i := 0 to [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] -1 do
if pos('Set-Cookie', [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][i]) > 0 then
begin
//We only care about the first cookie
ShowMessage('Received Cookie: '+ Copy([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][i], Length('set0cookie.'), Length([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ][i])));
//So we break after getting the first cookie
Break
end;

//Buddy list is delimited by a BEGIN BUDDYLIST and END BUDDYLIST
BuddyBegin := FRemoteFile.IndexOf('BEGIN BUDDYLIST') +1;
BuddyEnd := FRemoteFile.IndexOf('END BUDDYLIST') -1;

for i := BuddyBegin to BuddyEnd do
//These is the "raw" buddy list parsing is needed for it to make sense
//Since this is an example I discarded this code
ListBox1.Items.Add(FRemoteFile[i]);

BuddyBegin := FRemoteFile.IndexOf('BEGIN IGNORELIST') +1;
BuddyEnd := FRemoteFile.IndexOf('END IGNORELIST') -1;

for i := BuddyBegin to BuddyEnd do
ListBox2.Items.Add(FRemoteFile[i]);

for i := 0 to FRemoteFile.Count -1 do
if pos('Mail=', FRemoteFile[i]) > 0 then
begin
Tmp := Copy(FRemoteFile[i], length('mail01'), Length(FRemoteFile[i]));
if StrToInt(Tmp) = 1 then
ShowMessage('You have a yahoo mail account')
else
ShowMessage('You dont have a yahoo mail account');
Break;
end;
end else
raise Exception.Create('Couldnt log you on');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FRemoteFile := TStringList.Create;
end;

end.
<-----------------------------END UNIT CODE--------------------------------->

<-----------------------------BEGIN FORM CODE------------------------------->
object Form1: TForm1
Left = 192
Top = 121
Width = 379
Height = 443
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 120
TextHeight = 16
object Label3: TLabel
Left = 16
Top = 136
Width = 65
Height = 16
Caption = 'Buddys list'
end
object Label4: TLabel
Left = 194
Top = 138
Width = 64
Height = 16
Caption = 'Ignore lists'
end
object Panel1: TPanel
Left = 11
Top = 3
Width = 342
Height = 113
TabOrder = 0
object Label1: TLabel
Left = 11
Top = 24
Width = 63
Height = 16
Caption = 'Username'
end
object Label2: TLabel
Left = 11
Top = 56
Width = 60
Height = 16
Caption = 'Password'
end
object Edit1: TEdit
Left = 94
Top = 18
Width = 233
Height = 24
TabOrder = 0
end
object Edit2: TEdit
Left = 96
Top = 51
Width = 233
Height = 24
TabOrder = 1
end
object Button1: TButton
Left = 139
Top = 82
Width = 75
Height = 25
Caption = 'Login'
TabOrder = 2
OnClick = Button1Click
end
end
object ListBox1: TListBox
Left = 15
Top = 160
Width = 171
Height = 239
ItemHeight = 16
TabOrder = 1
end
object ListBox2: TListBox
Left = 192
Top = 160
Width = 171
Height = 239
ItemHeight = 16
TabOrder = 2
end
object [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] TIdHTTP
Request.Accept = 'text/html, */*'
Request.ContentLength = 0
Request.ContentRangeEnd = 0
Request.ContentRangeStart = 0
Request.ProxyPort = 0
Request.UserAgent = 'Mozilla/4.6 (compatible; Indy Library)'
Left = 320
Top = 48
end
end
<-----------------------------END FORM CODE ------------------------------->


اميدوارم که از کد فوق استفاده لازم را ببريد. انشالله درمقالات بعدي به تشريح کامل روشهاي برقراري ارتباط با اين پروتکل خواهم پرداخت.

Nesta
01-07-2005, 06:03
سلام من حدود 10 تا چیز جدید یا بهتر بگم مقاله جدید گذشتم اگه خوشتون اومد نظر یادتون نده .همش با مثال و کد هست همش هم تست شده و کار می‌کنه.
متشکر .

m_h_hadavi
04-07-2005, 05:23
خيلي خوب بود دستت درد نكنه :lol:

Nesta
04-07-2005, 11:54
خيلي خوب بود دستت درد نكنه :lol:
سلام خواهش می‌کنم دوست عزیز اگه مشگلی‌ داشتی‌ حتما بگو که حل کنیم .
متشکر .
:wink:

Erfaan
06-07-2005, 03:34
كدهاي اجراي برنامه ها و فايلها را مي خاستم.
--------
كدهاي اجرايي برنامه ها و فايلها يعني كدي كه در دلفي بنويسيم و يك برنامه يا مسير يك فايل از هر نوعي را برايش تعريف كنيم كه با اجرا شدن برنامه ما كد موجود در آن كه وظيفه اجراي برنامه يا فايل ديگري را دارد فعال شود و به اجراي فايل مورد نظر ما بپردازد.
براي مثال اگر خاستيم نرم افزار نوت پد را در درون برنامه خود با كليدي اجرا كنيم كدي كه مسير در آن قرار ميگيرد چيست.
اميدوارم كه ديگه نگيد واضح نيست . حالا نوبت شماست دوست عزيزم . اگه واقعا چيزي حاليته دريغ نكن...
با تشكر فراوان

Nesta
06-07-2005, 04:50
كدهاي اجراي برنامه ها و فايلها را مي خاستم.
سلام دوست عزیز سوال شما یا درخواست شما واضح نیست کد های اجرائی‌ یعنی‌ چی‌؟
شما قوانین این قسمت رو ملاحظه کنید .
کمی‌ توضیح بدین که کد های اجرائی‌ و فایل ها یعنی‌ چی‌ ؟ اگه کمی‌ توضیح بدید من کمک می‌کنم.
:wink: :shock:

ghafar
10-07-2005, 07:42
با سلام
چندتا سوال در مورد نوشتن كد ماشين حساب در دلفي داشتم :
توابع كتابخونه اي سينوس و كسينوس بعضي از زاويه ها مثلا سينوس 180 درجه (5-) را اشتباه جواب مي دن چيكار بايد كرد كه اين مشكل حل بشه ؟
دو دكمه exp و F-E روي ماشين حساب xp هستن كارشون چيه ؟
در مورد نوشتن كد براي چهار عمل اصلي چه كدي براي هر كدوم بايد نوشت كه طوري كار كنند كه مثل ماشين حساب ويندوز هر بار كه مساوي زده ميشه عدد محاسبه شده با عددي كه آخرين بار وارد شده جمع يا ضرب يا.. بشه؟

Nesta
10-07-2005, 18:48
سلام دوست من من جواب شما رو قبلان دادم ولی‌ شما بهتر هست از یک کمپننت استفاده کنین چون برای محاسبه ماشین حساب به کلی‌ زمان نیز دارید چون باید ارک تانژانت .کسینوس و سینوس و قدر مطلق و اعشاری ..
خلاصه خیلی‌ درد سر داره یعنی‌ هم باید ریاضی‌ خیلی‌ قوی و خوبی‌ داشته باشی‌ هم اینه برنامه نویسی‌ خوبی‌ داشته باشی‌.

ghafar
10-07-2005, 21:56
با سلام
در مورد exp نمي دوني كارش چيه و F-E

impostor
12-07-2005, 22:22
ويرايش شد ...

Nesta
12-07-2005, 22:54
سلام دوست عزیز اینجا بحث های اموزنده هست و کار های هک به اینجا مربوط نمی‌شه .اینجا برای یاد گرفتن زبان برنامه نویسی‌ دلفی‌ و سوالات اموزنده در این زبان هست .برای پروژه ها و شرکت ها و ...
متشکر .

impostor
20-07-2005, 14:14
ويرايش شد ...

Nesta
20-07-2005, 18:41
Mesl in ke bayad khodam dast be kar besham
vali aghe poshtibani nashe ke nemishe baba :arrow:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام دوست عزیز .
1- من ورود شما به این انجمن خصوصا انجمن دلفی‌ رو خوش آمد میگویم.
2- اگه امکان داره دوست عزیز فارسی‌ تایپ کن.
3-منم والا دیدم که استقبال نشده یا هنوز دوستان در این حد حرفه ای نشودند من کمتر فعالیت کردم در اینجا .
متشکر از شما.
:wink:

impostor
20-07-2005, 19:19
ويرايش شد ...

Nesta
20-07-2005, 19:26
سلام دوست عزیز
اگه می‌شه کمی‌ راجب خود همین Melt Afther Install توضیح بدین که بهتر متوجه بشن چون منم درست نفهمیدم که چی‌ کار می‌کنه .
:D

impostor
21-07-2005, 09:19
ويرايش شد ...

مهمان
21-07-2005, 12:40
سلام جناب impostor
من فکر مي کنم آدرس وبلاگ خودتان را اشتباه تايپ کرديد.
جاي حرف i جابجا شده
با تشکر از مطلبي که در اين قسمت قرار داديد.
واقعا جالبه
اميدوارم باز هم از اين کدهاي جالب قرار بدهيد.

impostor
23-07-2005, 16:40
ويرايش شد ...

Nesta
23-07-2005, 18:17
سلام دستت درد نکنه آقا این خیلی‌ جالب بود و اموزنده امیدوارم که ادامه داشته باشه.

MOHAMMAD_SAT
23-07-2005, 18:25
دستت درد نکنه :D

ZiTaNiX
25-07-2005, 14:26
سلام
من میخوام واسه یه دکمه یه کد بزارم که تمتم خانه های stringgrid رو که ایجاد کردم و پاک کنه
چه کدی باید بذارم؟
میخوام فقط خونه ها خالی بشه نمیخوام کلا پاک بشه ممنون
:wink:

Nesta
25-07-2005, 15:59
سلام زیتانیکس جان .شما باید کد زیر را در یک دکمه وارد کنید و زمانی‌ که روی این دکمه کیلیک می‌کنید هر دفعه پاک می‌کنه.
procedure TForm1.Button3Click(Sender: TObject);
var i,j,k,l:integer;
begin
stringgrid1.FixedCols:=0;
stringgrid1.FixedRows:=0;
for i:=1 to 5 do
for j:=1 to 5 do

for k:=1 to 10 do
for l:=1 to 10 do

case id of
a:stringgrid1.Cells[i-1,j-1]:='';

b:stringgrid1.Cells[k-1,l-1]:='';
end;
end;

Nesta
25-07-2005, 16:00
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ZiTaNiX
25-07-2005, 21:46
حالا این مشکل هیچ چی
اگه ما کلا بخواهیم تمام خونه های این جدول رو با یه چیز چر کنیم باید چی بنویسیم؟
مثلا یه stringgrid 5 * * میسازیم
بعد میخواهیم برای یه دکمه یه کد بزاریم که کل خونه های جدول رو با کلمه ali پر کنه
اونوقت چی؟
:?:

ZiTaNiX
25-07-2005, 23:34
راستی یه پیشنهاد هم دارم
میگم چطوره یکم نوشتن برنامه های کوچیک رو تو دلفی آموزش بدید
مثلا همون زوم کردن عکس و این حرفا
اول بگید چه عناصری تو فرم بزاریم و بعدش تو هر قسمت چه کدی بزاریم
این طوری تاپیک متحول میشه
فکر هم نکنم زیاد وقت ببره
:wink: :mrgreen:

Nesta
25-07-2005, 23:53
سلام زیتنیکس جان من هم می‌خوام این کار هرو بکنم و من و امیر منتظر این هستیم که مدیر این بخش انتخاب بشه و اون موقع با نظر مدیر این بخش اینجا رو میترکنیم .
ولی‌ در مورد سوال شما اگه بخوای همه خونه ها رو علی‌ کنی‌ .
var
a,b:array [10..10] of string;
begin
for a:1 to 10 do
for b:1 to 10 do

; inttostr ina ham yadet nare/3 :write(a*b)

ZiTaNiX
26-07-2005, 00:46
با این کد ها چه جوری تو خونه ها عی میشه؟
اینجا که علی نداره
نمیشه مثلا بنویسیم
Stringgrid1.cells[ , ]:=' Ali ' ;
میخوام بدونم نمیشه یه دستوری چیزی وارد کرد که بهش بفهمونی که تو همه خونه ها بزن علی؟

Nesta
26-07-2005, 01:07
سلام دوست من .این کارا بیشتر به درد پاسکال میخره دلفی‌ خیلی‌ قوی تر از این حرفا هست.می‌دونم داری یاد میگیری .
ولی‌ خوب سعی‌ کن که بری بیشتر جلو .
راستی‌ با اون کودی که دادم نگفتی‌ که کارت حل شد آیا پاک کرد یا نه؟

ZiTaNiX
26-07-2005, 01:23
نه ارور داد
برنامه اجرا نشد
خوب من میخوام برم جلو اما چه طوری
تو این کتاب آقای قمی همش با اعداد سرو کار داره
منم تو اینترنت گشتم مطلب خوب پیدا نکردم یعنی هست اما من سر در نیاوردم
باید مقدماتی باشه مثال هاش
بعدش خوب شما چی کار داری اینجا مدید داره یا نداره :mrgreen:
از نظر ما مدید تویی
پس یکم از اون مثال هایی که خودت میدونی واسمون بزار تا ماهم یاد بگیریم
:wink:

ZiTaNiX
26-07-2005, 12:27
سلام سعید جون
اقا خودم فهمیدم چه کدی بزارم تا همه خونه های جدول خالی بشه البته با راهنمایی شما :wink:
باید تو یک دکمه این کد ها رو میزاشتم
var i,j:integer;
begin
for i:=1 to 10 do
for j:=1 to 10 do
stringgrid1.cells[i-1,j-1]:='';
راستی یه چیز باحال دیگه که ازت یاد گرفتم در مئرد ریدیو باتم ها بود من لقمه رو دور سرم می چرخوندم و با دستور شرطی case of میرفتم
اما الان با if تو در تو
:wink:

Nesta
26-07-2005, 12:51
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام زیتانیکس جان من هم همین رو گفتم ولی‌ شما گفتی‌ که error.میگیره و نمی‌شه.
من خوشحالم که موفق شودی و خیلی‌ بیشتر خوشحالم که پشت کار داری و خوب داری میری جلو همینطوری ادامه بدی 2 ماه دیگه یک برنامه راحت می‌نویسی‌ که حال کنی‌.
:wink: :wink:

ZiTaNiX
26-07-2005, 13:49
میشه یکن از اون مثال های ساده رو اینجا قرار بدین؟
یه همون روشی که تو پست های بالا گفتم
این طوری آدم بیشتر یاد میگیره
:mrgreen:

Nesta
26-07-2005, 14:13
سلام زیتانیکس جان من یک سری برنامه دارم که این در یک فایل زیپ هست و از سطح خیلی‌ خیلی‌ ساده میاد جلو و همش هم به صورت فایل دلفی‌ هست اونارو اپلد می‌کنم که برات مثالی‌ باشه.و راحت هم میتونی‌ اجرا کنی‌.و کد هارو یادشت کنی‌.یا یاد بگیری.

ZiTaNiX
26-07-2005, 14:52
ممون سعید جان
اگر هم به مشکلی بر خوردم همین جا میگم بهت :wink:

Nesta
27-07-2005, 03:46
سلام دوستان
.یه pack فایل از سری برنامه های دلفی‌ که از سطح مبتدی شروع تا نسبتا پیشرفته همراه با کد و مثال .
برای دوستانی‌ که میخواهند مثال هائی‌ ببینن و یاد بگیرن من توصیه می‌کنم که این فایل 3 مگا بایت رو بگیرن که کلی‌ مثال دارش هست و اگه میخواید که برنامه اجرا بشه فقط کلید F9 رو بزنید.
بد روی هر دکمه یا هر چیزی که داخلش کد داشته باشه بروید میتوانید با کدهائی‌ که به درد شما میخوره آشنا بشید .
متشکر.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Friend
29-07-2005, 01:39
آقا با دلفی می شه ویروس ساخت

Nesta
29-07-2005, 02:47
آقا با دلفی می شه ویروس ساخت
سلام دوست عزیز .
بله خیلی‌ از ویروس ها رو با دلفی‌ میسازند منتها باید کد های خاصی‌ بلد باشی‌.
و البته همه بلد نیستند.چون شما باید انتی‌ ویروس هم بتونی‌ درست کنی‌.

Nesta
01-08-2005, 03:44
سلام دوستانی‌ که اینو ندیدن حتما دانلد کنن به داردشون میخوره .
سلام دوستان
.یه pack فایل از سری برنامه های دلفی‌ که از سطح مبتدی شروع تا نسبتا پیشرفته همراه با کد و مثال .
برای دوستانی‌ که میخواهند مثال هائی‌ ببینن و یاد بگیرن من توصیه می‌کنم که این فایل 3 مگا بایت رو بگیرن که کلی‌ مثال دارش هست و اگه میخواید که برنامه اجرا بشه فقط کلید F9 رو بزنید.
بد روی هر دکمه یا هر چیزی که داخلش کد داشته باشه بروید میتوانید با کدهائی‌ که به درد شما میخوره آشنا بشید .
متشکر.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Masoud.ebi
02-08-2005, 07:15
سلام دوستان
من یه مشکل در رابطه با دلفی دارم
من یه برنامه نوشتم با استفاده از دیتابیس پارادوکس و single هستش حالا میخوام اون تحت شبکه اش کنم میخواستم بدونم آیا با همین دیتابیس پارادوکس میشه این کار رو کرد یا اینکه باید سراغ چیز دیگه ای برم

Nesta
02-08-2005, 15:47
سلام دوست عزیز.
این یکی‌ از برنامه های نادر هست که من براتون اپلد می‌کنم تبدیل database Paradox To Sql Server
که با خود دلفی‌ 7 نوشته شده .که بانک اطلاعاتی‌ شما رو تبدیل می‌کنه به SQL server
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Masoud.ebi
03-08-2005, 00:54
سلام کارلوس جان
دمت گرم برنامه باحالی بود
حالا یکم اطلاعات در مورد SQL Server میخوام چون اصلا تا حالا باهاش کار نکردم و اطلاعاتم در موردش کمه
ممنون میشم کمکم کنی
با تشکر

Nesta
03-08-2005, 02:08
سلام مسعود جان خواهش می‌کنم ولی‌ باید در جای خودش سوال بشه برای نظم هر چه بیشتر این انجمن باید در قسمت SQL SERVER سوال کنید .متشکر. :D

ali_yousefian19
04-08-2005, 18:31
سلام كارلوس جان
دو تا سوال استادمون ازمون كرده كه براي جواباش گذاشتتمون تو خماري
اگه ميشه يه كمك بكن
1)چطوري ميشه تو برنامه ي دلفي كليدهاي ctrl+alt+del را از كار انداخت
2)چطوري ميشه صفحه ي اصلي دلفي را (همون فرم) را يكم بي رنگ كرد (بلدم رنگش را كاملا بي رنگ كنم) استادمون از اصطلاح آينه ي استفاده ميكرد
مرسي

Nesta
04-08-2005, 22:34
سلام علی‌ جان من درست متوجه نشدم عزیز
.شما می‌خواهید برنامه ای بنویسید که این ترکیب کلید ها کار نکنه یعنی‌ برنامه ای بنویسید که زمانی‌ که کیلید های Ctrl+Alt+del زده شد پنجره ای باز نشه .درسته ؟ اگه کمی‌ توضیح بدین که چه برنامه ای باشه البته این اصولا طرفند های پیشرفت هست در دلفی‌ .متشکرم. :D

impostor
05-08-2005, 14:57
ويرايش شد ...

ali_yousefian19
05-08-2005, 18:31
impostor جان خوب ميگفتي چطوري ميشه اين كار را كرد :mrgreen:
ما را بي نصيب نميذاشتي
در ضمن كي لاگر چيه؟
اوون لينكه چيه؟
مممممم ررررر س ي

ZiTaNiX
20-09-2005, 18:15
سعید یه پیشنهاد
برنامه نویسی من و که می دونی چه طوریه
همش با اعداد و ارقام سروکار داشتم
حالا می خوام بزنم تو خط برنامه های کار بردی
برنامه های کوچولو موچولو
مثلا همون زوم کردن عکس و چمی دونم خالی کردن سطل آشغال و این چیزا
دوست دارم بیشتر کامند ها مربوط به ویندوز باشه
مثلا یه برنامه که هر درایوی رو گفتی فرمت کنه یا حجمش رو بگه یا یه چیزای کوچیکی تو این مایه ها
می تونی کمکم کنی؟

Nesta
20-09-2005, 21:27
سلام آقا خوبی‌ .
یک سریع به اینجا بزن من قبلا یه حمصهین کاری کردم اینو دانلد کنی‌ کلی‌ توش مثال هست که میتونی‌ همش رو یاد داشت کنی‌ و یاد بگیری .
اگه دلفی‌ 2005 استفاده میکنی‌ برای شروع خوب نیست خیلی‌ سنگین باز می‌شه و کلا خیلی‌ وحشتناک سنگین هست .اگه می‌خوای یاد بگیری از دلفی‌ 7 شروع کن این مثال ها رو نگاه کن کار کن تا بد ببینیم که چی‌ می‌شه خوبه ؟


سلام دوستانی‌ که اینو ندیدن حتما دانلد کنن به داردشون میخوره .
سلام دوستان
.یه pack فایل از سری برنامه های دلفی‌ که از سطح مبتدی شروع تا نسبتا پیشرفته همراه با کد و مثال .
برای دوستانی‌ که میخواهند مثال هائی‌ ببینن و یاد بگیرن من توصیه می‌کنم که این فایل 3 مگا بایت رو بگیرن که کلی‌ مثال دارش هست و اگه میخواید که برنامه اجرا بشه فقط کلید F9 رو بزنید.
بد روی هر دکمه یا هر چیزی که داخلش کد داشته باشه بروید میتوانید با کدهائی‌ که به درد شما میخوره آشنا بشید .
متشکر.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ZiTaNiX
20-09-2005, 23:09
من یه برنامه نوشتم
اولین برنامه زندگیم
ولی نمی دونم درست ذخیره کردم یا نه
داش سعید یه نگاهی بنداز
برنامه ای نوشتم یه سری تغیرات تو رجیستری میده
ببین نظرت رو بگو
البته ضعف زیاد داره ولی اولین برنامم بود به خدا
با دلفی 2005 هم نوشتمش
پسورد فایل: p30world.com
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Nesta
21-09-2005, 00:24
سلام چه تغیراتی‌ تو رجیستری خوب ایجاد نکنه آقا سیستم نترکه ..شوخی‌ می‌کنم آخه میترسم که یه کاری نکنه چون تست هست چرا اول دست رو جاهای خطر ناک گذاشتی‌ ؟

ZiTaNiX
21-09-2005, 00:30
آخه خیلی راحته کار با رجیستریش
نه خطرناک نیست خیالت راحت

Nesta
21-09-2005, 01:55
سلام بد نیست حالا یه چیزی این رو سیستم من که دلفی‌ نصب هست کار می‌کنه اگه یکی‌ بود رو سیستمش دلفی‌ نصب نبود تکلیف چی‌ هست؟ حتما باید اینرو درست کنی‌ پک کنی‌ تا همه جا قابل استفاده باشه الان ببری رو یه سیستم که دلفی‌ نصب نباشه ارر میگیره ..

ZiTaNiX
21-09-2005, 17:37
چه طوری؟
اخه من تا حالا پروژه هام رو ذخیره نکردم بدم بیرون

Nesta
22-09-2005, 04:16
چه طوری؟
اخه من تا حالا پروژه هام رو ذخیره نکردم بدم بیرون
سلام چطوری که دیگه باید بری خونه دوستت که دلفی‌ نصب نیست و اونجا تست کن ببین که چه پیغام خطا ای میده و متوجه می‌شه .
اگه سعی‌ بر این داری که برنامه های کاربردی بنویسی‌ تا در آینده به دردت بخوره به نظر من برنامه هائی‌ رو شروع کن که مثلا نام و نام خانوادگی‌ و شماره شناسنامه و ... بگیره و در بانک اطلاعاتی‌ ذخیره کنی‌ حالا بتونی‌ آنها رو ویرایش کنی‌ بتونی‌ حذف کنی‌ و جستجو کنی‌ این کار ها بخصوص جستجو که به صورت ترکیبی‌ باشه ..
و همچنین بیشتر ارتباط با بانک اطلاعاتی‌ مهم هست .رو اینا اگه کار کنی‌ میتونی‌ آینده خوبی‌ داشته باشی‌ ولی‌ تو کار های رجیستری اگه وقت بگذری اصلا فایده نداره چرا چون که کسی‌ نمیاد برنامه کار با رجیستری شما رو استفاده کنه و این همه برنامه توپ مربوط به رجیستری رو ول کنه مثلا میگما ..
ولی‌ کسی‌ هست که برای شرکتش یا مغازش همچین برنامه هائی‌ که من گفتم رو براش بنویسی‌ و پول هم بده باید در این کار آینده نگار باشی‌ .
حالا میگی‌ من می‌خوام شروع کنم .جواب من اینه که چرا با اون برنامه ها شروع کنی‌ با این برنامه هائی‌ که من میگم شروع کن .

ZiTaNiX
22-09-2005, 10:06
خوب میگم دیگه
چه طوری برنامه رو ذخیره کنم که تو همه جا اجرا بشه بلد نیستم خوب سوال کردم دیگه

Nesta
22-09-2005, 15:45
خوب میگم دیگه
چه طوری برنامه رو ذخیره کنم که تو همه جا اجرا بشه بلد نیستم خوب سوال کردم دیگه
سلام دوست عزیز .
ربطی‌ به چطوری ذخیره کردن نداره که منم گفتم که چه کار کنید باید پک کنید pack or setup
اول که برنامه رو دیدی داره درست اجرا می‌شه شما ctrl+9 رو بزن بد یک فایل exe درست می‌شه بد با یکی‌ از برنامه های ساخت setup میتونی‌ درست کنی‌ همین.

Deco
22-09-2005, 16:47
با سلام خدمت دوستان عزيز

متشكر ميشوم اگر كسي من را راهنمايي كند.

لطفا در مورد دستور Insert متعلق به sql در دلفی کمی راهنمایی کنید.

من وقتی از این دستور استفاده میکنم خطایی رخ میدهد که نمیدانم علتش چیست.

MasterData
22-09-2005, 20:00
ااگه پيام خطايي كه ميده رو بذاري خيلي راحتتر ميشه بهت كمك كرد
ولي به طور كلي دو صورت داره
INSERT INTO target [(field1[, field2[, ...]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, ...]
FROM tableexpression
در اين حالت بايد اسم فيلدهايي كه مقدار دهي ميشن تعيين كني و مقاذير از طريق يه دستور select به داخل جدول درج ميشن

Single-record append query:

INSERT INTO target [(field1[, field2[, ...]])]
VALUES (value1[, value2[, ...])

اما توي اين حالت پس از تعيين فيلدها مقادير رو به نرتيب درج ميكني
البته مي توني توي دلفي از طريق پارامتر مقادير رو ارسال كني

ZiTaNiX
22-09-2005, 20:29
سعید ممنون از لطفت
فقط بگو وقتی فایل اجرایی رو هم ساختیم بعدش کدوم فابل ها رو بریزیم کنارش؟

Nesta
23-09-2005, 01:54
سلام آقای دکو ورود شما رو تبریک میگم .
و این که بانک اطلاعاتی‌ شما چی‌ هست و این که آیا با query or ado کار می‌کنید یا این که با چیز دیگه و dbexpress اگه در این مورد توضیح بدین و این که می‌خواهید رکورد جدید درج کنید یا فیلد جدید درج کنید بیشتر توضیح بدید .ممنون میشم .
آقای بهروز عزیز .شما اگه برنامتون با بانک اطلاعاتی‌ کار می‌کنه بهتر هست که یک پوشه به نام database اگه وجود نداشت موقع پک کردن بسازی و اون فایل ها رو در آنجا کپی‌ کنی‌ که موقع نصب روی سیستم در پوشه مقصد نصب بشه .و یک فایل exe که کامپایل میکنی‌ کافی‌ هست .
اگه البته با گزارشگیری هم کار میکنی‌ برای اون هم یک پوشه به نام report بساز .

golab
05-10-2005, 09:43
با سلام خدمت دوستان عزيز
بنده مشكلي در زمينه دلفي دارم كه اگر كسي لطف كنه جواب بده كمال تشكر را دارم
در يك فرم mdi چگونه مي توان فرم child را احضار كرد با توجه به اين كه بنده كد
frmcustomer.show را هم استفاده كردم ولي پيغام خطا مي دهد

سوال دوم اينكه در همين برنامه كه mdi مي باشد مي خواهم ابتدا فرم login كه خاصيت child ندارد ظاهر شود سپس بعد از گرفتن نام كاربري و كلمه رمز فرم login بسته و فرم mdi ظاهر شود.

دوستان اگر لطف كنند سريع جواب دهند ممنون مي شوم چون خيلي احتياج دارم

Nesta
05-10-2005, 14:39
سلام دوست عزیز شما از چه نسخه ای استفاده می‌کنید از نسخه 7 یا 2005؟
شما فعلا اینجا رو نگاه کنید .در قسمت object inspector یک قسمت داره واسه parent و این که کدام اول نشان داده بشه اگه می‌خواهید ابتدا username and password ظاهر بشه من به شما component بسیار کامل و خوب suipack رو پیشنهاد می‌کنم که فقط کافی‌ هست که روی فرم بگذارید و موقع اجرا در event formactivate or form create آن این کامپننت رو صدا کنید بد که بسته بشه میره در صفحه اصلی‌ شما .
حالا شما نسخه دلفی‌ که باهاش کار می‌کنید رو بگید بهتر می‌شه کمک کرد .

golab
06-10-2005, 09:28
سلام آقا سعید nesta
ممنون از کمکت عرض کنم که از دلفی 7 استفاده می کنم
باید بگم که فرم لوگین را دستی طراحی کردم و formstyleآن را از حالت child درآوردم و از کادر محاوره ای project option هم در کادر main form فرم لوگین را انتخاب کردم مشکل اینجاست که وقتی فرم لوگین ظاهر می شود و یوزر پسورد را وارد می کنم نمی دونم با چه دستوری یا متدی فرم mdi را show یا creat کنم یا وقتی از متد show استفاده می کنم پیغام خطا می دهد

در مورد اون کامپوننتی که فرمودید هیچ اطلاعی ندارم از کامپونتهای دلفی است یا باید آن را تهیه کنم اگه لطف کنی بگی چیکار باید بکنم بازم ممنون می شم

Nesta
08-10-2005, 04:00
سلام دوست عزیز .
کلا برای نمایش دادن فرم که فرمان ها با هم فرق نمی‌کنه چرا که فقط میخواهیم نمایش بدیم همین .
برای این کار شما باید بگید که در صورت درست بودن username and password فرم فلان مثلا show or showmodal
اینطوری همین بد هم زیر به نظر من به این صورت بزنی‌ .
close form1;
showmodal form2;
با این کار فرم اولی‌ بسته شده یا حالا اگه حرفه ای تر بخوای که میگم بهت ولی‌ بطور کل دوست من این کار روش صحیحی‌ نیست و کمتر برنامه نویس خوبی‌ همچین کاری انجام میده ‌.
برای آن کامپوننت هم باید بگم که شما هر کجا بزنی‌ coponent suipack 5 for delphi 7 البته کرکک شده ها .گیر میاری ،و نظر بعدی من این هست که چرا فرم midi ? چرا به صورت فرم معمولی‌ استفاده نمیکنید .و کار child or parent هم برای استفاده های خاصی‌ انجام می‌شه مثلا که یک فرم یا فرم های تو در تو ایجاد کنی‌ .بد مثلا بگی‌ آقا فونت فرم پدر فرق کنه یا این که حاشیه یا رنگ فرم پدر با فرم فرزند متمایز باشه .
برای همچین کار هائی‌ استفاده نمی‌شه حالا اگه شما اون کامپوننت رو بگیری کارت خیلی‌ راحت حل می‌شه ولی‌ من سوالام این هست که شما آیا username password رو در بانک اطلاعاتی‌ ذخیره و در صورت چک کردن آن فرم اصلی‌ ظاهر می‌شه یا نه الکی‌ هست .چون اینطوری فقط کار زیاد کردن هست .البته شرمنده ها من رک میگم.در کل برای نمایش فرم ما 3-4 تا دستور نداریم تازه شما باید کاری کنید که علامت ضربدر فرم لاگین غیر فعال بشه یعنی‌ چی‌ اگه شما دقت کنید هنگامی‌ که کسی‌ نخواهد user passs رو وارد کنه و close رو بزنه اتماتیک میره به فرم اصلی‌ و این خوب نیست شما باید کودی بدید که اون کلا عمل نکنه که کاربر مجبور بشه که یا user pass بده در غیر این صورت خارج بشه از برنامه .

golab
08-10-2005, 10:45
سلام دوست من
باید بگویم که این فرم لوگین ما به بانک اطلاعاتی متصل است و از نظر کارکرد هیچ مشکلی ندارد حتی در مراحل بعدی قابلیت تعریف کاربران جدید را نیز دارا می باشد
مشکل من اصلا ارتباطی به فرم لوگین ندارد بنده آن کدهایی را هم که فرمودید قبلا در شرط فرم لوگین بعد از صحت یوزر و پسورد قرار داردم ولی متآسفانه عمل نمی کند برای روشن شدن مسئله جسارتا می خواهم شمار ا به زحمت بیندازم البته پیشاپیش تشکر می کنم و شما با حل مشکلات من کمک بزرگی به بنده می نمایید چو ن واقعا مرجعی برای رفع اشکال ندارم باز هم ممنونم
بنده پروژه ای در دست گرفتم که مربوط به یه آژانس می باشدتقریبا اکثر فرمهای آن طراحی شده فقط اشکالات ریزی مرا به دردسر انداخته
این پروژه شامل یک پنجره mdi و چند پنجره parentمی باشد
جسارتا شما دو فرم ایجاد کنید به نامهای form1 و form2
سپس خاصیت formstyle را برای form2 به fsMDIForm تنظیم نمایید
دکمه ای روی form1 قرار دهید
حالا شما کدی را در رویداد onclick دکمه بنویسید که بتواند form 2 را ظاهر کند
اگر عمل کرد آن کد را برای من ارسال کنید

برای مشکل دوم هم یک منو باری برای form 2 یعنی فرمی که mdi است طراحی کنید و برای آن یک گزینه مثلا open انتخاب کنید
حال form3 را هم درست کنید و formstyle آن را fsMDIChild تغییر دهید به طوری که form3 فرزندی برای form2 باشد
حال قطعه کدی برای گزینه open بنویسیدکه form3 را بعد از بسته شدن ظاهر نماید
البته قبل از این کار در رویداد onclose واقع در Event بر روی form3 این قطعه کد را بنویسید.
Action := caFree;
لطفا در صورت به نتیجه رسیدن ما را بی خبر نگذارید و مچکرم

Nesta
08-10-2005, 16:47
سلام دوست عزیز والا من که اینطوری میزنم کار می‌کنه .

form2.showmodal;
در مورد سوال منو هم که یک mainmenu روی فرم می‌ گذارید .و داخل اون اگه می‌خواهید باز همین رو میزانید .آخه چیز پیچیده ای نیست من عرض کردم که کلا کار با midi در اینجا رو من اشتباه می‌دونم .چرا باید فرم midi باشه خوب اگه معمولی‌ شما امتحان کنید اصلا مشگلی‌ نیست .اصلا کد پیچیده ای نمیخواد احتمالا دلفی‌ شما قاطی‌ کرده .بعضی‌ اوقات برای من هم می‌شه مثلا کد 100% درسته ولی‌ ارر های عجیب میده .

golab
09-10-2005, 09:42
سلام آقا سعید
شما درست می فرمائید در صورتی که فرمهایی که استفاده می کنیم MDI نباشد در ست کار می کند
مشکل اینجاست که من می خواهم با زدن دکمه ok روی یک فرم SDI که البته parent هم نمی باشد این فرم بسته و فرم MDIظاهر شود
در مورد اینکه شاید دلفی قاطی کرده بعید می دونم چون روی چندتا سیستم دیگه هم امتحان کردم جواب نداد
در ضمن من خودم هم با MDI زیاد موافق نیستم ولی چه کنم که انجوری ازم خواستن
امیدوارم اذیتت نکرده باشم

تکنیک برتر
10-10-2005, 08:48
به دست آوردن ليست سيدي درايوهاي متصل به كامپيوتر
يك فانشكن مينويسيم كه يك استرينگ بر ميگرداند




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
:biggrin:

تکنیک برتر
10-10-2005, 08:51
با استفاده از اين فانكشن ميتونيد در هر نوع سيدي درايوي رو باز و بسته كنيد
در اثر فشارهاي مكرر دوستان من ترجمه فارسي توضيحات رو هم به كدها اضافه كردم

کد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Nesta
10-10-2005, 21:02
سلام دوست عزیز متشکر ،و خوشحالم که به جمع دلفی‌ کار ها امدی .مرسی‌.

تکنیک برتر
11-10-2005, 10:51
ممنون ومتشکر جناب نستا جان.
من سعی می کنم که مطالب مفیدی ارائه کنم

تکنیک برتر
11-10-2005, 11:07
تغيير Volume ويندوز

يك TrackBar در فرم خود قرار دهيد و Max value را به 15 تغيير دهيد و در رويداد OnChange آن كد زير را قرار دهيد:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تکنیک برتر
11-10-2005, 11:10
تغيير Resolution مونيتور

بايد يك پروسيجر به شكل زير بنويسيم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تکنیک برتر
11-10-2005, 11:12
قرار دادن يك Bitmap در يك متافايل

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تکنیک برتر
11-10-2005, 11:14
بدست آوردن Serial Number درايو

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تکنیک برتر
11-10-2005, 11:18
اميدوارم مورد قبولتان واقع شود

Nesta
12-10-2005, 06:00
سلام این پست آخری دیگه یه کمی‌ زیاد بود .ولی‌ من تشکر کردم از طرف دوستان.در ضمن اینجا فعلا به دلیلی‌ راکد مونده .بدا اینجا فعال تر می‌شه.

siyasiya
15-10-2005, 01:23
هر چی مربوط به فارسی کردن دلفی اعم از کامپوننت ها سورس کد و تاریخ شمسی و... هست رو لطفا یکی توضیح بده......

سیمین ی.

Nesta
15-10-2005, 02:55
سلام خانم عزیز .
یک سیدی در بازار هست که کامپوننت مخصوص دلفی‌ و همش هم فارسی‌ هست در بازار وجود داره .مثل تاریخ شمسی‌ تا datepicker و کلا مجموعه کملی‌ کاملی‌ هست.برای فارسی‌ نویسی‌ هم که IPT خوب جواب میده تو دلفی‌ .منتها برای نسخه 2005 کامپوننت های زیادی نیست .

mehdi_mj
18-10-2005, 15:14
با سلام
من یک سی دی دلفی 6 دارم که موقع نصب برای فایلهای java خطا میگیره و در فولدر برنامه کپی نمیشن.
اشکالش از سیدی برنامه هست چون خودم خواستم به صورت دستی کپیش کنم که اصلا موجود نبود.
اگر ممکنه یک نفر این فایلها رو که 32 تا هستند لینک دانلودشو برام لطف کنه یا اینکه اونا رو برام آپلود کنه.

در ضمن من از چند جا سی دی دلفی رو خریدم که همشون تقریبا مشکل مشابه هم رو داشتند.
خیلی ممنون

تکنیک برتر
22-10-2005, 03:48
یه چند روز صبر کنید تا یکی پیدا بشه

مهمان
27-10-2005, 22:48
با سلام
من یک سی دی دلفی 6 دارم که موقع نصب برای فایلهای java خطا میگیره و در فولدر برنامه کپی نمیشن.
اشکالش از سیدی برنامه هست چون خودم خواستم به صورت دستی کپیش کنم که اصلا موجود نبود.
اگر ممکنه یک نفر این فایلها رو که 32 تا هستند لینک دانلودشو برام لطف کنه یا اینکه اونا رو برام آپلود کنه.

در ضمن من از چند جا سی دی دلفی رو خریدم که همشون تقریبا مشکل مشابه هم رو داشتند.
خیلی ممنون

اگر لیست اسامی فایلها را دارید بگویید تا بشود روی وب براتون جستجو کرد

hp1361
29-10-2005, 06:12
با عرض سلام

چندتا سوال داشتم كه ممنون ميشم جواب بدين

من توي برنامه اي كه نوشتم از چند تا فرم استفاده مي كنم

وقتي كه به يكي از فرم ها غير از فرم اصلي مراجعه ميكنم ويزيبلش فعال ميشه . بعد از اتمام استفاده اونرو بايد ببنديم اما اگه كاربر محل اون تغيير بده در مراجعه بعدي باز هم در همون جا ظاهر ميشه اين مشكل رو چطور ميشه حل كرد ؟


سوال دوم : من اطلاعاتي بصورت ركورد سه فيلدي در اكسس دارم كه مي خوام در دلفي استفاده كنم براي تبديل اين اطلاعات چكار بايد كنم. يعني چه كدي بنويسم و از چه عناصري استفاده كنم كه اين اطلاعات بصورت فايل ركوردي دات دت من ذخيره بشه .

ممنون

sh_samira
01-11-2005, 13:27
مشكل من توي برنامه نويسي دلفي اين است كه وقتي دلفي 7 را نصب مي كنم نمي توانم در كامپوننت ها فارسي بنويسم در صورتي كه فارسي ويندوزم فعال است. مثلا تايتل فرم را به فارسي بنويسم. لطفا اگر كسي اطلاعي در اين مورد دارد حتما بگويد. مرسي

mehdi_mj
07-11-2005, 18:25
باسلام
من فايلهايي روکه درنصب دلفی6 ارورميگرفت براتون نوشتم
متشکرم
error 1309.error reading from file :

j:\INSTALL\program files\Borland\Delphi6\Demos\Cobra\Idl2pas\EJB\euro co nverter\java\classes
\Generated
Sourse\Sequence_of_anyHelper.java.
Sourse\Sequence_of_anyHolder.java.
j:\INSTALL\program files\Borland\Delphi6\Demos\Cobra\Idl2pas\EJB\euro co nverter\java\classes
\Generated Source\...\EuroConverter.java.
EuroConverterHelper.java.
EuroConverterHolder.java.
EuroConverterHome.java.
EuroConverterHomeHelper.java.
EuroConverterHomeHolder.java.
EuroConverterHomeOperations.java.
EuroConverterHomePOA.java.
EuroConverterHomePOAInvokeHandler.java.
EuroConverterHomePOATie.java.
EuroConverterOperations.java.
EuroConverterPOA.java.
EuroConverterPOAInvokeHandler.java.
EuroConverterPOATie.java.
_EuroConverterHomeStub.java.
_EuroConverterHome_Stub.java.
_EuroConverterStub.java.
_EuroConverter_Stub.java.
j:\INSTALL\program files\Borland\Delphi6\Demos\Cobra\Idl2pas\EJB\euro co nverter\java\classes
\currencyconverter\EuroConverter.class.
EuroConverterBean.class.
EuroConverterBeanTestClient1.class.
EuroConverterHelper.class.
EuroConverterHolder.class.
EuroConverterHome.class.
EuroConverterHomeHelper.class.
EuroConverterHomeHolder.class.
EuroConverterHomeOperations.class.
EuroConverterPOA.class.
EuroConverterHomePOAInvokeHandler.class.
EuroConverterOperations.class.
EuroConverterPOA.class.
EuroConverterPOAInvokeHandler.class.
_EuroConverterHomeStub.class.
_EuroConverterHome_Stub.class.
_EuroConverter_Stub.class.
package.uml.
j:\INSTALL\program files\Borland\Delphi6\Demos\Cobra\Idl2pas\EJB\euro co nverter\java\classes
\dependency
cache\currencyconverter.dependency.
j:\INSTALL\program files\Borland\Delphi6\Demos\Cobra\Idl2pas\EJB\euro co nverter\java\src\
currencyconverter\EuroConverter.java.
EuroConverterBean.java.
EuroConverterBean.jbx.
EuroConverterBeanTestClient1.java.
EuroConverterHome.java.
EuroConverterHome.jbx.

ALI-RE
08-11-2005, 23:04
سلام
از اطلاعات خوبت مچكرم
باز هم از اين كارها بكن
فقط در مورد Agent راستش من نفهميدم اين يونيت هاي بخش Uses به چه كار مي ياد
چون برنامه من از يونيت ها خطا ميگيره

hp1361
11-11-2005, 17:32
يكي نيست طريقه نمايش فرم دريافت پاسوورد رو به من آموزش بده؟

Giutrist
18-11-2005, 10:33
سلام دوست عزیز .
با دلفی‌ چند شما کار میکنی‌ و یه کمی‌ اگه می‌شه دقیق تر توضیح بدی بهتر متوجه میشم.

hp1361
18-11-2005, 17:34
با دلفي 7 كار ميكنم
مي خواستم در مورد فرم parent و mdi و چگونگي نمايش فرم ها توضيح بدين ممنون

NaserM
21-11-2005, 10:10
من میخوام یه سری دیتا رو بفرستم رو پورت Usb یا Lpt (مثل یک عدد) لطفا راهنمایی کنید

hp1361
24-11-2005, 15:30
مثل اينكه هيچ كي بلد نيست ما رو راهنمايي كنه نه؟!
بابا جواب بدين ديگه

ALI-RE
01-12-2005, 23:30
سلام
يه سوال؟؟؟؟؟؟
توي دلفي چه جوري مي شه با مودم كار كرد؟؟؟؟؟كامل لطفا!!!!!!1 :biggrin:

hp1361
02-12-2005, 17:51
مثل اينكه هيچ كي نمي خواهد ما رو راهنمايي كنه

بابا بيل گيتس ها ما رو هم دريابين

اگه كسي مي خواهد ما رو دريابه در باره استفاده از اطلاعات بر روي اكسل در دلفي راهنمايي كنه(جستجو،ويرايشو...)

ممنون ميشم

hp1361
12-12-2005, 17:34
بابا ریچی ها کجایین ما رو هم دریابین

mina0
12-12-2005, 22:45
سلام
مي خوام يه برنامه بنويسم كه تعداد كاراكتر هاي يك متن رو حساب كنه
لطفا اگه كسي مي دونه راهنمايي كنه
مرسي

batri
17-12-2005, 06:03
سلام.
کسی که نمی دونه .
شما از توابع strtoint یا
intTostr
باید استفاده کنید.

hp1361
17-12-2005, 18:51
سلام
مي خوام يه برنامه بنويسم كه تعداد كاراكتر هاي يك متن رو حساب كنه
لطفا اگه كسي مي دونه راهنمايي كنه
مرسي

با سلام

شما میتونید از تابع GetTextLen استفاده کنید

این تابع تعداد کل کاراکتر های یک عنصر را بصورت عدد صحیح بر می گرداند

GetTextLen . نام عنصر
برای مثال

x:= Memo1.GetTextLen ; 1

این دستور تعداد کاراکتر های عنصر Memo1 را در x قرار می دهد.

موفق باشید

مرد مباح
19-12-2005, 00:06
سلام دوستان.
من يك برنامه نويس دلفيم.
در زمينه Database كار مي كنم.

مي خواستم ببينم كه آيا دلفي Component براي ساخت برنامه گوشي داره يا نه؟

اگه داره لطفا لينكشو بدين.

و اگرهم نه هر كسي در اين رابطه اطلاعاتي داره منو راهنمايي كنه.

پيشاپيش ممنون.

batri
20-12-2005, 18:51
سلام.
به نظر من شما در برنامه های p2p جستجو کنید.
مثلا component for delphi mobile
البته برای نسخه 2005 که بعید میدونم راحت پیدا بشه.
راستی شما database در دلفی کار می کنید یعنی چی!!
paradox 7? Dbxpress

batri
22-12-2005, 03:39
سلام.
آقا کسی نمی دونه افکت چطوری میشه گذاشت تو دلفی ؟
مثلا برنامه که اجرا میشه با افکت باشه؟

مرد مباح
23-12-2005, 14:20
من در زمينه ديتابيس كار مي كنم.
با هرچي كه بسه.
ولي معمولا Access و يا SQL.
چطور مگه؟

امير جان
25-12-2005, 18:20
با سلام :
چطور ميتوان سريال سي پي يو --- هارد - مادر برد --و .... را در دلفي بدست آورود

hadisezar
05-01-2006, 12:47
در باره بانك اطلاعاتي در دلفي يك مقاله خوب مي خواهم

NaserM
19-01-2006, 22:31
سلام کسی فونت traffic رو داره که رو Windows Service Pack 2 به بالا نصب بشه ؟
من یکی دارم که روی service pack 1 نصب میشه اما روی 2 نصب نمیشه
اگه میتونین راهنمایی کنید
اگه کسی این فونت را میخواد بگه که براش میل بزنم .
راستی من چون برای کار دلفی میخوام در این قسمت نوشتم .

sahar_f
23-01-2006, 02:03
سلام دوستان يه سوال دارم
ميخوام در برنامه امكاني را بگذارم كه بتونه Ip آدرسهايي رو كه بهش ميدي نشان بده (وقتي كه به اينترنت وصله)؟

ممنون ميشم اگه كمكم كنيد؟

NoneForce
26-01-2006, 11:28
سلام
از اين كد مي تونيد براي گرفتن آي پي استفاده كنيد

function GetIPFromHost(const HostName: string): string;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := '';
phe := GetHostByName(PChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nil do
begin
Result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
WSACleanup;
end;

كبريت
26-01-2006, 14:20
سلام
از اين كد مي تونيد براي گرفتن آي پي استفاده كنيد

function GetIPFromHost(const HostName: string): string;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := '';
phe := GetHostByName(PChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nil do
begin
Result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
WSACleanup;
end;

خوب توضيح بده اين كد رو بايد كجا بنويسيم
مال چه برنامه اي هست
واسه دلفيه يا نه
لطفا يكم كامل تر توضيح بده

NoneForce
26-01-2006, 15:33
خوب توضيح بده اين كد رو بايد كجا بنويسيم
مال چه برنامه اي هست
واسه دلفيه يا نه
لطفا يكم كامل تر توضيح بده

سلام
هرجايي مي تونيد بنويسيد(در و ديوار هم قبوله) ولي اگه تو محيط دلفي باشه بهتره
مال برنامه خاصي نيست . با اين تابع مي تونيد آي پي يك آدرس را بدست آوريد

NoneForce
26-01-2006, 15:35
با سلام :
چطور ميتوان سريال سي پي يو --- هارد - مادر برد --و .... را در دلفي بدست آورود

سلام
مي تونيد از كامپوننت MiTeC System Information Suite 9.4.3 استفاده كنيد

highermelody
30-01-2006, 14:59
folderسلام عزيز.
مي خواستم بدونم چه جور ميشه دستور كپيه folder توسط دلفي نوشت.
ممنون.

NoneForce
04-02-2006, 10:24
folderسلام عزيز.
مي خواستم بدونم چه جور ميشه دستور كپيه folder توسط دلفي نوشت.
ممنون.


سلام
اين هم روش

uses
ShellAPI;

procedure TForm1.BtnCopyClick(Sender: TObject);
var
fileOp: TShFileOpStruct;
fromDir: string;
toDir: string;
begin
FillChar(fileOp, Sizeof(TShFileOpStruct), 0);
fromDir := DirectoryListBox1.Directory + '\*.*'#0;
toDir := DirectoryListBox2.Directory + #0;
with fileOp do
begin
wnd := Handle;
wfunc := FO_COPY;
pFrom := PChar(fromDir);
pTo := PChar(toDir);
fFlags := FOF_ALLOWUNDO;
fAnyOperationsAborted := false;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(fileOp);
end;

samira455
04-02-2006, 10:45
سلام به همه دوستان:
من به کمک فوری نیاز دارم.کسی میدونه چطور در دلفی می شه ساعت سیستم را گرفت؟لطفا توضیح کامل دهید.

NoneForce
04-02-2006, 12:14
سلام
var
DateTime : TDateTime;


DateTime := Time;
str := TimeToStr(DateTime);
Caption := str;

فكر نكنم گشتن تو راهنماي خود دلفي كار سختي باشه
اگه خواستين بگين يك راهنماي كامل در اين مورد را ارسال كنم

samira455
04-02-2006, 13:10
ممنون می شم اگر ارسال کنید.

samira455
04-02-2006, 13:11
ممنون می شم اگر ارسال کنید.(به فکرم نرسیده بود از help استفاده کنم.ممنون از راهنمائی تون)

NoneForce
04-02-2006, 15:22
ممنون می شم اگر ارسال کنید.(به فکرم نرسیده بود از help استفاده کنم.ممنون از راهنمائی تون)

سلام
از نشاني زير راهنماي استفاده از راهنماي دلفي را دريافت كنيد.(بصورت فارسي)
اميدوارم مشكل شما و ديگر دوستان برنامه نويسي كه در استفاده از راهنماي دلفي مشكل دارند رفع شود.

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

ahmad_h
06-02-2006, 12:14
يه راه براي كرك كردن اگزه هاي دلفي ميخوام

NoneForce
06-02-2006, 14:03
يه راه براي كرك كردن اگزه هاي دلفي ميخوام

سلام
مگه اگزه هاي دلفي با بقيه فايلهاي اجرايي فرق مي كنند؟

Moh3en_DDD
08-02-2006, 23:47
چرا كامپونت هاي ACtivx فقط روي بعضي از كامپيوتر ها جواب ميد ه؟

NoneForce
09-02-2006, 10:36
چرا كامپونت هاي ACtivx فقط روي بعضي از كامپيوتر ها جواب ميد ه؟

سلام
براي استفاده از اكتيوايكس بايد اون فايل روي دستگاه مقصد باشه و رجيستر هم شده باشه

mnasir
16-02-2006, 16:26
اکتیو ایکس ها [quote]

hp1361
24-02-2006, 18:19
با سلام

يكي به ما ياد بده چطور از چند تا فرم توي برنامه استفاده كنيم كه يكيش براي دريافت پسورد باشه

ممنون

FGIT
26-02-2006, 09:46
با سلام

يكي به ما ياد بده چطور از چند تا فرم توي برنامه استفاده كنيم كه يكيش براي دريافت پسورد باشه

ممنون
چند تا راه داريد
1- فرم Password فرم اصلي برنامه ات باشه و اگر رمز درست وارد شد فرمهاي بعدي نمايش داده بشه.
2- داخل OnFormShow فرم اصلي ات فرم passwordرو showmodal كن و تا وقتي كه رمز رو درست وارد نكردن خارج نشو توي onclosequery فرمت هم شرط canclose رو بذار شرط درست بودن رمز

hp1361
26-02-2006, 23:51
سلام

آقا دستت درد نكنه مشكل منو حل كردي اف جي اي تي عزيز

خيلي خيلي ممنونم

من با استفاده از راه حل دوم مشكلم رفع شد ميشه روند انجام كار رو برام توضيح بدي (يعني اينكه هر دستوري چكار ميكنه )

بازم ممنونتم

FGIT
12-03-2006, 22:43
من با استفاده از راه حل دوم مشكلم رفع شد ميشه روند انجام كار رو برام توضيح بدي (يعني اينكه هر دستوري چكار ميكنه )
كدوم دستور؟؟
منظورت Show Modal , Can Close هست؟
showModal يك فرم رو نمايش ميده و كنترل رو به دست اون ميسپاره و منتظر ميشه تا اون فرم كارش تموم بشه.
Can Close هم اجازه بستن يك فرم رو ميده كه اگه False باشه فرم اجازه بسته شدن نداره

hp1361
03-05-2006, 21:11
سلام

عزيز اگه ممكنه بگين چطوري به اين crystal report دسترسی داشته باشم کافیه

من با rave desiner ور رفتم و تقربا مشکلم حل شد اما نمی دونم چرا موقع پرینت گرفتن پرین رو بر عکس میگیره

منظورم لند اسکیپ و او ن یکیه

تویه اون برنامه هم نمیشه اینارو تغییر داد

اگه یه کم با این کریستاله هم ور برم یادش میگیرم

ممنون

rkhasehtarash
28-05-2006, 16:19
من به دنبال يك برنامه نويس دلفي كار .net مگردم تا يك پروژه رو با هم انجام بدهيم وحاضرم هزينه انجام آنرا بپردازم :

azghanimr
21-07-2006, 09:52
سلا دوستان
من منوهای برنامه ام را فارسی نوشتم ولی در کامپیوتر خودم همه چیز درست نشون داده می شه ولی تو کامپیوتر دیگه به جای کلمه های فارسی علامت سوال نشون داده می شه . ممنون می شم اگه کمکم کنید

مرد مباح
21-07-2006, 11:12
من به دنبال يك برنامه نويس دلفي كار .net مگردم تا يك پروژه رو با هم انجام بدهيم وحاضرم هزينه انجام آنرا بپردازم :


دوست عزيز.
ميشه بگي كارت چيه كه بايد با .net بنويسيش؟
شما فرمودين هزينشو ميدين.
معمولا هزينه كاراي اينجوري اگه رفاقتي نياشه و فقط حرفه اي به قضيه نگاه كني بالاي 200 تومانه.

يك توضيح درباره كارت بده.

مرد مباح
21-07-2006, 11:14
سلا دوستان
من منوهای برنامه ام را فارسی نوشتم ولی در کامپیوتر خودم همه چیز درست نشون داده می شه ولی تو کامپیوتر دیگه به جای کلمه های فارسی علامت سوال نشون داده می شه . ممنون می شم اگه کمکم کنید

دوست عزيز.
اولا همه جا اين پست رو منتقل نكن.
سوالت رو در بخشي كه مرتبط هست بزار.
جواب شما رو توي بخش فيلد فارسي نوشم.
به اونجا مراجعه كنيد.

azghanimr
26-07-2006, 18:33
ولی مشکل من حل نشد
برنامه هایی که من در اونها فارسی می نویسم در یک کامپیوتر دیگه کلمه های فارسی علامت سوال می شن.
خواهش می کنم کمکم کنید

مرد مباح
27-07-2006, 10:12
رفيق.
اون كارايي كه گفتم رو كردي؟
از سي دي ويندوز استفاده كردي؟

اصلا ويندوز شما چيه؟
98 يا آكس پي؟

azghanimr
27-07-2006, 23:19
دوست عزیز ویندوز من ایکس پی هست در ضمن من فارسی ساز هاشو هم نصب کردم و در رابطه با اونا مشکلی ندارم
در کامپیوتر خودم هیچ مشکلی نیست در ضمن من یک برنامه که با دلفی نوشته شده دانلود کردم که اونم همین جوری علامت سوال برای کلمه های فارسی نشون می ده.

مرد مباح
28-07-2006, 10:14
يه بخش يكي از دوستان براي فارسي كردن توي صفحه اصلي درست كرده.
به اونجا برو.

blue2006
24-02-2007, 20:02
سلام
اگه نمي خنديد يه سوال ازتون بپرسم
من دفعه اوليه كه با دلفي كار ميكنم . يه برنامه خيلي ساده درست كردم و دكمه run رو زدم . يه فايل exe از برنامه درست كرد ولي وقتي دلفي را uninstall كردم اجرا نمي شه .
خلاصه از توي گل درم بياريد

MasterData
25-02-2007, 07:45
يه فايل exe از برنامه درست كرد ولي وقتي دلفي را uninstall كردم اجرا نمي شه .

بعضي وقها برنامه نياز به يه سري DLL و يا امكانات ديگه اي داره كه با انينستال كردن برنامه اونا از سيسم حذف شده باشه

blue2006
25-02-2007, 08:36
می شه یه مقدار در مورد اینکه چطوری میشه یه پروژه را به صورت فایل exe تبدیل کرد توضیح دهید . ( منظور آموزش اونه)

m2d
11-05-2011, 23:40
با سلام خدمت همه دوستان کسی میدونه داخل برنامه نوشته شده بادلفی چطوری میشه بازدن اینتر فوکاس رو به منو اون برنامه داد
یعنی بازدن اینتر منو انتخاب بشه