ايجاد يك شيء با دستور در دلفي

منظور اين است يك شيء بدون اينكه روي فرم برنامه چيزي باشد ايجاد كرد. يعني از طريق كد. مثال زير، يك DirectoryListBox را از طريق كد ايجاد كرده و ابعاد آن را نيز تنظيم مي نمايند.

procedure TForm1.Button1Click(Sender: TObject);
var n1:TDirectoryListBox;
begin
n1:=TDirectoryListBox.Create(Form1);
n1.parent:=form1;
n1.Left :=100;
n1.Top:=100;
n1.Width :=400;
n1.Height :=200;
end;
اينجا يك DirectoryListBox ايجاد شده و ابعاد آن تنظيم مي گردد. دقت داشته باشيد كه حتما بايد خاصيت Parent را مقدار دهي كنيد چون ما مي خواهيم اين شيء در Form1 نمايش داده شود، پس
n1.parent:=form1;
اگر دو فرم داشته باشيد، ميتوانيد n1.parent:=form2; قرار دهيد در اين صورت اين شيء درون Form2 نمايش داده خواهند شد.   
نویسنده : محمد ; ساعت ۱۱:٥٦ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢

كم حجم كردن فايل اجرايي خود در دلفي

فايلهاي اجرايي كه با دلفي ساخته ميشوند، معمولا كمتر از 280 كيلوبايت نيستند. ولي يك روش براي كم كردن حجم آن وجود دارد. در منوي Project | Options در برگه Packages يك گزينه به نام Build with runtime packages وجود دارد كه اگر در آن تيك بزنيد، فايل اجرايي شما بسيار كوچكتر ميشود.
اگر يك برنامه بسازيد كه فقط يك فرم داشته باشد و هيچ كدي هم ننوشته باشيد، حجم فايل exe شما 286KB ميشود ولي اگر از Build with runtime packages استفاده كنيد، حجم فايل exe، 14KB ميشود. البته اين فايل exe روي كساني كه دلفي نصب كرده اند اجرا ميشود. يعني به فايل vcl50.bpl نياز دارد. براي مثال اگر برنامه اي نوشته ايد و مي خواهيد آن را به دوستتان كه او هم دلفي دارد بدهيد، ميتوانيد به اين روش حجم فايل خود را كم كنيد تا سريعتر برسد.

همان گونه كه ميدانيد، فايلهاي exe اي كه با دلفي درست ميشوند، يعني فايلهايي كه با گزينه Build with runtime packages، ساخته نشده باشند، Standalone هستند يعني به DLL زمان اجرا احتياج ندارند و روي هر كامپيوتري اجرا ميشوند. البته اين، احتمال خطا را بالا ميبرد. يعني اين احتمال وجود دارد كه فايل روي كامپيوتر طرف اجرا نشود. يكي از را حلهاي اين مشكل، استفاده از Build with runtime packages است. يعني شما فايل exe خود را به اين روش درست كنيد و فايل vcl50.bpl را هم براي كسي كه ميخواهد اين برنامه را اجرا كند بفرستيد.

  
نویسنده : محمد ; ساعت ۱۱:٥٥ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢

كار با فايلهاي خواندني-نوشتني باينري در دلفي

در روشي كه قبلا براي خواندن فايل باينري گفتم، در يك لحظه فقط ميشد يا خواند يا نوشت. مثلا نمي شد كه يك فايل رو هم براي خواندن و هم براي نوشتن باز كرد. براي اين كار، يك سري توابع ديگري در دلفي وجود دارد كه با استفاده از آنها ميشود فايل را خواندني-نوشتني باز كرد به اين معنا كه هم ميتوان از فايل خواند و هم در آن نوشت.
ابتدا بايد يك متغير صحيح براي نگه داشتن دستگيره فايل (file handle) تعريف كنيد:
var n1:integer;
بعد يك بافر براي نگه داشتن اطلاعاتي كه از فايل مي خوانيم تعريف ميكنيم:
buf:array[1..1024]of char;
سپس بايد با استفاده از تابع FileOpen، فايل را باز كرد.
n1:=FileOpen('c:\autoexec.bat',fmOpenReadWrite);
در اينجا دستگيره فايل در متغير n1 ذخيره ميشود. اگر فايل قابل باز شدن نباشد، n1=-1 ميشود. بنابراين ميتوان يك پيام خطا در اين صورت ايجاد كرد.
if n1=-1 then
begin
Showmessage('File not found.');
exit;
end;
توجه داشته باشيد كه وقتي كه مي خواهيد فايلي را هم براي خواندن و هم براي نوشتن باز كنيد، حتما بايد آن فايل وجود داشته باشد.
سپس براي خواندن فايل، از دستور FileRead استفاده ميكنيم.
numread:=FileRead(n1,buf,sizeof(buf));
در اينجا ما مي گيم كه مي خوايم از فايلي n1، به اندازه buf اطلاعات را خوانده و نتيجه را در buf بريزيم. در اينجا ما به اندازه 1024 بايت (1 كيلوبايت) از فايل خوانده ايم. حاصلي كه اين تابع بر مي گرداند، تعداد بايتهايي است كه واقعا خوانده شده اند! چون اگر در نزديك انتهاي فايل قرار داشته باشيم، به طوري كه كمتر از 1024 بايت به انتهاي فايل مانده باشد، ديگر نميتوانيم 1024 بايت از فايل بخوانيم. بنابراين متغير numread ميگويد كه چند بايت خوانده شده است.

حال براي نوشتن در فايل از دستور FileWrite استفاده ميكنيم.
numwrite:=FileWrite(n1,buf,sizeof(buf));
در اينجا ابتدا اطلاعاتي را كه مي خواهيم در فايل بنويسيم را در buf ذخيره كرده و سپس اين متغير را در فايل مي نويسيم.

براي حركت دادن اشاره گر فايل از تابع FileSeek استفاده ميكنيم.
N:=10;
n2:=FileSeek(n1,n,0);
در اينجا ما اشاره گر فايل را به بايت دهم از ابتداي فايل تغيير ميدهيم.
پارامتر سوم اين تابع تعيين كننده اين است كه ما چه طور مي خواهيم اشاره گر را تغيير دهيم. اگر صفر باشد يعني اين كه عددي كه ما به عنوان اشاره گر ميدهيم كه اينجا 10 داديم، از اول فايل حساب شود. اگر 1 باشد بدين معناست كه اشاره گر فايل به اندازه n تا جلو ميرود. يعني اشاره گر فايل را به مقداري كه ما بخواهيم جلو ميبرد. و اگر 2 باشد، از آخر فايل محسوب ميشود يعني اشاره گر فايل n + sizeof(file) ميشود.
حاصلي كه اين تابع بر مي گرداند، اشاره گر فعلي فايل است. يعني تغييرات اشاره گر را اعمال كرده و سپس اشاره گر جديد فايل را بر مي گرداند. بنابراين اگر بخواهيد اشاره گر فعلي فايل را به دست آورديد، بايد از دستور
n2:=FileSeek(n1,0,1);
استفاده كنيد. يعني مي گوييد كه صفر بايت به اشاره گر فعلي فايل اضافه كن. كه نتيجه همان اشاره گر فعلي فايل ميشود (كلك رشتي!!)


  
نویسنده : محمد ; ساعت ۱۱:٥۳ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢

نحوه گت كردن دايركتوري Desktop

procedure TForm1.Button1Click(Sender: TObject);
var pidl1:PItemIDList;
p1:array[0..1024]of char;
begin
SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,pidl1);
اينجا مي گيم كه ما pidl مربوط به Dekstop رو مي خوايم.
SHGetPathFromIDListA(pidl1,@p1);
اينجا هم مي گيم كه ما مسير اين pidl رو مي خوايم.
edit1.text:=p1;
اينجا هم كه ميندازيم توي TextBox
end;

  
نویسنده : محمد ; ساعت ۱۱:٥٢ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢

نحوه نمايش Browse For Folder DialogBox

شما احتمالا برنامه هايي را ديده ايد كه يك ديالوگ به اسم Browse For Folder مياورند كه همه درايوها و دايركتوري هاي سيستمتان در آن نمايش داده شده و شما بايد يك دايركتوري انتخاب كنيد. يا خود ويندوز هم موقع ToolBar اضافه كردن به TaskBar هم اين كارو ميكنه يا مثلا winamp هم اين ديالوگ رو نمايش ميده. براي نمايش چنين ديالوگي، بايد از توابع SHBrowseForFolder و SHGetPathFromIDListA استفاده كرد.
مثال:
procedure TForm1.Button1Click(Sender: TObject);
var bi:_browseinfoA;
pidl1:PItemIDList;
p1:Array[0..1024]of char;
begin
with bi do
begin
hwndOwner :=handle;
pidlRoot :=nil;
pszDisplayName :='Please Select Folder';
lpszTitle :='Select Folder';
ulFlags :=bif_editbox;
lpfn :=nil;
lParam :=0;
iImage :=0;
end;
ابتدا يك ساختار _BrowseInfoA پر ميكنيم.
pidl1:=SHBrowseForFolder(bi);
سپس با اين تابع، ديالوگ را نمايش مي دهيم و نتيجه درون PIDL1 ميرود.
SHGetPathFromIDListA(pidl1,@p1);
سپس با اين تابع، مقدار PIDL1 را به رشته تبديل ميكنيم.
edit1.text:=p1;

end;   
نویسنده : محمد ; ساعت ۱۱:٥٢ ‎ب.ظ روز دوشنبه ٢٦ خرداد ،۱۳۸٢

يك نكته

شما وقتي كه مي خواهيد برنامه هايي مانند Netstat يا IPConfig و غيره كه در پنجره Dos باز مي شوند را اجرا كنيد و نتيجه آنها را ببينيد، چنانچه در Run ويندوز آنها را بنويسيد و اجرا كنيد، بعد از اينكه كارشون تموم بشه بسته مي شن و ديگه شما نمي تونيد نتيجه اجراي اونها رو ببينيد.
براي رفع اين مشكل شما بايد ابتدا يك Command.com اجرا كنيد و سپس از دورن Command Prompt اين فرامين را صادر كنيد. كه نتيجه آنها نيز همانجا به نمايش در بيايد.
چون برنامه هايي مثل Netstat يا IPConfig برنامه هاي Win32 Console هستند. يعني برنامه هاي تحت ويندوزي كه در پنجره Dos اجرا مي شوند كه بعد از اينكه كارشون تموم شد خود به خود بسته مي شن و ديگه نميشه نتايج اجراي اونها رو ديد.   
نویسنده : محمد ; ساعت ۳:۱٧ ‎ق.ظ روز چهارشنبه ٢۱ خرداد ،۱۳۸٢

wait

Please wait...   
نویسنده : محمد ; ساعت ٢:۳٤ ‎ب.ظ روز شنبه ۱٧ خرداد ،۱۳۸٢

..

..
  
نویسنده : محمد ; ساعت ٤:۳٢ ‎ب.ظ روز یکشنبه ۱۱ خرداد ،۱۳۸٢

پشیمان شدن از ShutDown کردن ویندوز

در ویندوز 98 چنانچه شما تصمیم بگیرید ویندوز رو ShutDown کنید ولی بعدش از این کار منصرف بشید، یک روش برای این کار وجود دارد. و اون اینکه شما باید تا دیر نشده برنامه Rundll32 را End Task کنید. چنانچه به موقع این کار را انجام دهید، دیگه ویندوز ShutDown نمیشه.   
نویسنده : محمد ; ساعت ۱٢:۳٤ ‎ق.ظ روز جمعه ٩ خرداد ،۱۳۸٢

...

...
  
نویسنده : محمد ; ساعت ۱٢:٤٤ ‎ق.ظ روز پنجشنبه ۸ خرداد ،۱۳۸٢

جواب

نويسنده: كامل
جمعه، 2 خرداد 1382، ساعت 21:8

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

E-mail: kamell1@hotmail.com
URL: pentium4.persianblog.ir

خاصيت MultiLine را True کنيد. به همين سادگی.   
نویسنده : محمد ; ساعت ۱:٥٥ ‎ق.ظ روز شنبه ۳ خرداد ،۱۳۸٢