الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هيا لنبدأ بالApi

مغلق
بدأه reda في 16 مارس 2003 · 26 رد · 9,402 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سنبدأ

الجميع يعرف أن الApi هي

APPLICATION PROGRAMING INTERFACE

من خلال هذا الشرح سنقوم بشرح كل تابع مع مثاله

: Getwindowsdirectory

صيغته:

Getwindowsdirectory (p: pchar, size: integer);

يستخدم هذا التابع للحصول على اسم دليل الـ Win ولكن يجب علينا للحصول على اسم هذا الدليل التعامل مع الذاكرة وحجز جزء منها باستخدام التابع getmem الذي يستخدم لحجز موقع من الذاكرة باسم محدد وحجم محدد وعند الانتهاء يجب إفراغ هذه الذاكرة وإلغاؤها تماما باستخدام التابع Freemem .

وله متحولين الأول p من النوع pchar وهو عبارة عن مؤشر إلى محرف يتم التعامل معه كمحرف الثاني Size من النوع Integer يحدد عدد البايتات الواجب استخدامها للحصول على اسم الدليل

مثال

procedure TForm1.Button1Click(Sender: TObject);
var
p:pchar;
begin
getmem(p,255);
getwindowsdirectory(p,255);
label1.caption:=p;
freemem(p,255);
end;

الشرح

Getmem (p, 255);

يتم من خلالها تعريف جزء من الذاكرة باسم P وبحجم Size =255 byte وذلك وفقا لعدد المحارف المطلوب إرجاعها.

Getwindowsdirectory (p, 255);

يتم من خلالها إسناد اسم دليل الـ Win إلى المتحول P ذو الحجم 255 .

Freemem (p, 255);

يتم من خلالها تحرير كتلة الذاكرة التي سبق حجزها بالتابع Getmem.

Getsystemdirectory:

صيغته:

Getsystemdirectory (p: pchar, size: integer);

يستخدم هذا التابع للحصول على اسم دليل الـ System ولكن يجب علينا للحصول على اسم هذا الدليل أيضا التعامل مع الذاكرة وحجز جزء منها باستخدام التابع Getmem الذي يستخدم لحجز موقع من الذاكرة باسم محدد وحجم محدد وعند الانتهاء يجب إفراغ هذه الذاكرة وإلغاؤها تماما باستخدام التابع Freemem .

وله متحولين الأول p من النوع Pchar وهو عبارة عن مؤشر إلى محرف يتم التعامل معه كمحرف الثاني Size من النوع Integer يحدد عدد البايتات الواجب استخدامها للحصول على اسم الدليل.

مثال

procedure TForm1.Button2Click(Sender: TObject);
var
p:pchar;
begin
getmem(p,255);
getsystemdirectory(p,255);
label1.caption:=p;
freemem(p,255);
end;

Getmem (p, 255);

يتم من خلالها تعريف جزء من الذاكرة باسم p وبحجم Size =255 byte وذلك وفقا لعدد المحارف المطلوب إرجاعها.

Getsystemdirectory (p, 255);

يتم من خلالها إسناد اسم دليل الـ system إلى المتحول P ذو الحجم 255

Closewindow :

صيغته:

closewindow (HWND:hwnd) : boolean;

يستخدم هذا التابع لتصغير النافذة المحددة إلى حجمها الأصغري وله متحول وحيد من نوع Hwdn الذي يمثل النافذة المحددة

يعيد هذا التابع القيمة true في حال نجح التابع في تنفيذ مهمته وإلا يعيد القيمة false .

مثال :

if not (closewindow(form1.Handle)) then
 closewindow(form1.Handle);

أعتقد المثال واضح

:Gettimezoneinformation

صيغته:

Gettimezoneinformation (time_zone_information)

يستخدم هذا التابع لجلب المعلومات الأساسية حول المنطقة الزمنية، أي الإعدادات الإقليمية للمنطقة الزمنية الحالية ولهذا التابع مجموعة من المتحولات أهمها:

Bias: وهذا المتحول من النوع Longinteger يعبر عن الفارق الزمني بين المنطقة الزمنية الحالية والمنطقة الزمنية الأساسية.

:Standardname وهذا المتحول من النوع المحرفي String بطول 32 محرف ويعيد هذا المتحول اسم المنطقة الزمنية.

Daylightname: هو متحول محرفي من النوع String ويعيد التوقيت الحالي حسب التوقيت الصيفي أو الشتوي بفارق ساعة زمنية واحدة.

يعيد هذا التابع إحدى القيم التالية:

Time_zone_id_unknow: تدل هذه القيمة على عدم قدرة التابع على تحديد المنطقة الزمنية للحاسب وهذا الاحتمال نادر الحدوث ولا يحصل إلا بوجود خطأ في الإعدادات المنطقة الزمنية للحاسب.

Time_zone_id_standard: تدل هذه القيمة على أن إعدادات المنطقة الزمنية للحاسب هي الإعدادات النظامية للمنطقة الزمنية العالمية.

Time_zone_id_daylight: تدل هذه القيمة على وجود فارق زمني بين الصيف والشتاء في التوقيت أي إعدادات المنطقة الزمنية للحاسب ليست نظامية.

مثال

procedure TForm1.Button1Click(Sender: TObject);
var
aa:time_zone_information;
begin
gettimezoneinformation(aa);
label1.caption:=inttostr(aa.bias);
label2.caption:=aa.standardname;
label3.caption:=aa.daylightname;
end;

كما ذكرت سابقا سأقوم بجمع المواضيع والشروحات على شكل برنامج

وسأقوم بكتابته على شكل قاعدة بيانات ربما ستكون paradox

كما أنني سأقوم بمناقشة خوارزميات البرنامج وشرحها تفصيلا

إلى اللقاء القريب إن شاء الله أخوكم رضا

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:29

#2

شكرا لك أخي على جهودك...

ونرجو المزيد....(f)

#3

السلام عليكم...

ممتاز أخي العزيز رضــا؟:cool:

أخــــــوك..:cool:

#4

اخي العزيز رضى

اتمنى لك المزيد من التوفيق

وجزاك الله الخير كله

#5

أنتظروني سأضيف الكثير بعد أيام قليلة(clock)

أخوكم رضا(f)

#6

السلام عليكم

شكرا لكل من تفاعل مع الموضوع

كما وعدت المجموعة الثانية من التوابع

وسنقوم بزيادتها تباعا على قدر تفاعلكم ودعمكم ونقدكم البناء

عذرا لان الشرح قد يكون مملا للبعض لكن الهدف حو محاولة تغطية الفج العميق للنقص في هذه اللغة فلسنا مضطرين لتعلم الفيجوا بيسك كي نتعلم الapi

علما أن الApi في الDElphi لاتحتاج إلى كل التعقيدات الموجودة في الفيجوال

loadkeyboardlayout:

صيغته:

loadkeyboardlayout("رقم سداسي عشري",klf_activate)

حيث أن هذا الرقم السداسي العشري يعبر عن نوع الخط .

يستخدم هذا التابع لتحميل نوع الخط واعتباره خطاً افتراضياً لهذا التابع متحولين:

1- رقم الخط ويعبر عنه بالنمط Hex (السداسي عشري).

2- نوع التحميل حيث يأخذ القيمة Klf_activate و ذلك عند الرغبة بتحميل الخط المحدد و بفرض أن هذا الخط موجود مسبقاً فإنه لايتم تحميله.وبعد تحميل هذا الخط يوضع في مقدمة الخطوط ويصبح هو الخط الفعال الحالي(الافتراضي).حيث أن الأرقام و الخطوط المتعارف عليها هي:

1-"00000401" حيث يعبر هذا الرقم عن خط المملكة العربية السعودية.

2-"00000409" حيث يعبر عن خط الولايات المتحدة الأميركية .

مثال

loadkeyboardlayout('00000409',klf_activate);

حيث يعبر عن خط الولايات المتحدة الأميركية الذي تم تحميله كخط افتراضي.

loadkeyboardlayout('00000401',klf_activate);

حيث يعبر عن خط المملكة العربية السعودية الذي تم تحميله كخط افتراضي.

Flashwindow:

صيغته:

flashwindow(HWND:hwnd,boolean)

يستخدم هذا التابع لوضع شريط النافذة في حالة وميض أي حالة فعالية أو عدم فعالية و بالتناوب.

له متحولين:

الأول handel: يعبر عن النافذة التي نريد التعامل معها .

الثاني: يعبر عن الحالة الابتدائية لشريط عنوان النافذة التي نريد التعامل معها،فعال أم غير فعال،وهو من النوع boolean حيث أن True يعني أن الحالة الابتدائية لشريط النافذة في وضع الفعالية و False يعني أن الحالة الابتدائية لشريط النافذة في وضع عدم الفعالية.

مثال

procedure TForm1.Timer1Timer(Sender: TObject);
begin
flashwindow(handle,true);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.enabled:=true;
end;

في مثالنا السابق كنا قد قد ضبطنا الtimer عل interval قدره 600

flashwindow(handle,true);
يتم كتابة هذا البيان في العنصر Timer بزمن 600 ميلي ثانية لتحقيق حالة الوميض.
timer1.enabled:=true;
يتم كتابة هذا البيان في الزر المفروض لتفعيل و تأهيل عنصر الـ Timer ووضعه في حالة العمل

.

Getcomputername :



صيغته:

getcomputername(ipbuffer,nsize)

يستخدم هذا التابع لجلب اسم الحاسب المحدد،حيث أن المتحول Ipbuffer من النوع Pchar أي أنه مؤشر إلى محرف،أما المتحول nsize فهو من النوع Word مضاعف أي يحجز له 8Byte وبأعداد موجبة، وهو يحمل محارف اسم الحاسب والتي هي بطول محدد ويستخدم لهذا المتحول الثابت Max_computername_length الذي يعبر عن الطول الأعظمي لاسم الحاسب

المثال

procedure TForm1.Button1Click(Sender: TObject);
var
pccomputer:pchar;
dwcsize:dword;
result:string;
begin
dwcsize:=max_computername_length+1;
getmem(pccomputer,dwcsize);
try
if windows.GetComputerName(pccomputer,dwcsize) then
result:=pccomputer;
label1.caption:=result;
finally
freemem(pccomputer);
end;
end;

الشرح

شرح الخوارزمية:
dwcsize:=max_computername_length+1;

getmem(pccomputer,dwcsize);
لحجز موقع من الذاكرة بحجم محدد قدره Dwcsize باسم محدد Pccomputer 
try
if windows.GetComputerName(pccomputer,dwcsize) then
result:=pccomputer;
label1.caption:=result;
finally
لجلب اسم الحاسب ووضعه في المتحول Result الذي هو متحول خاص في Windows والذي هو من النوع المحرفي String .
freemem(pccomputer);
لتحرير موقع الذاكرة الذي تم حجزه مسبقا.

لقد تم إرفاق المثال الاخير مع المرفقات وذلك تجنبا للأخطاء علما أنه معمول على Delphi 7

وإلى لقاء قريب جدا بإذن الله

شكرا لصاحب الفكرة الرئيسية جعلها الله في موازين حسناته

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:31

#7

عفوا هذا هو الملف المرفق

get_computer_name.zip

1
#8

يمكن وضع الكود التالي لاظهار الفورم على شكل قطع ناقص

var K:THandle;

Begin

K:= CreateEllipticRgn(0, 0, Width, Height);

SetWindowRgn(Handle, K, True);

API كما يمكنني أن اضيف الكثير من أوامر ال

#9

بسم الله الرحمن الرحيم

مشكور الأخ رضــا ..هل بالأمكان ..شرح ألية تبديل خصائص

الأعدادت الأقلمية ...وجزاك الله خيراً(f)

#10

(f)السلام عليكم

مالذي لم تفهمه أخي محمد حتى أعيد شرحه

أخي barca

شكرا زجيلا لك (f)

لكن الهدف من هذه الدروس هو دورة على الApi

وليس أمثلة فقط;)

الرجاء شرح التابع المستعمل ومن ثم شرح المثال

أرجو منك تقبل الموضوع ونحن جاهزون لاي فكرة مفيدة تطرحها والاخوان(f)

#11

كيف يتم تغير قائمة النظام MENU SYSTEME

ترجمة وتفصيل زكيري عبد العالي

الفهرس

1-مقدمة

2-الهدف

3-استعمالات

4-الخلاصة

1-مقدمة :

قائمة النظام هي القائمة التي تضهر عند النقر بالزر الايمن على شريط العنوان لاي نافذة او عند الضغط على Alt+Ecpasse نقول أن هذه القائمة هي PopUpMenu ليست للتغيير مباشرة وانما للضرورة فقط لانها من خصائص المكونة Form لــDelphi وفي هذا الدرس نتعلم كيف نقوم بتغيير محتويات هذه القائمة .

2-دواعي تغيير قائمة النظام :

من دواعي تغيير قائمة النظام :

- عندما نريد تعطيل تعليمة غلق البرنامج close X)) و زر الاختصار Alt+F4.

- عندما لا ننترك المستعمل يقوم بتصغير او تكبيير النافذة.....

- عندما نريد اضافة بعض الاوامر اللزمة وكثييرة الاستعمال في البرنامج .

3- تغيير قائمة النظام :

نستطيع تغيير هذه القائمة عن طريق دوال API ولكن بتحفظ لاانا مثلا لوغييرنا الخاصية FormStyle التابعة للفورم نكون قد الغيينا التغيير وساعطيك عزيزي الطلب بعض الامثلة :

قبل ان نبدا ساشرح بصفة عامة بعد الدوال :

GetSystemMenu وهي دالة موجودة في ملف user32.dll وهي ترجع لنا اسم قائمة النظام من النافذة المحددة .

SysMenu := GetSystemMenu(form1.handle,false);

ModifyMenu وهو اجراء موجودة في ملف user32.dll يسمح بالتغيير في القائمة :

ModifyMenu(SysMenu,A التعليمة التي نريد تغييرها,X,B العمل الجديد لهذه التعليمة, 'تغيير شكل التعليمة');

X: تحمل قيمتين هما او mf_ByCommand mf_Byposition

B,A : تحمل قيم Sc_Move sc_Close ....الخ

هذا المثال يقوم بحذ تعليمة التحريك من القائمة

procedure TForm1.FormCreate(Sender: TObject);
var
SysMenu: hMenu;
Begin
{ لاسترجاع الهندل   handel من القئمة }
SysMenu := GetSystemMenu(Form1.handle,false);
{لحذف من القائمة « تحريك »}
DeleteMenu(SysMenu, Sc_Move, mf_ByCommand);
end;
ملاحظة 

{ باعطاء اسم }
DeleteMenu(SysMenu, sc_Close, mf_ByCommand);
{باعطاء رقم}
DeleteMenu(SysMenu,6,Mf_ByPosition);

هذا المثال يقوم بالتغيير تعليمة الأغلاق القائمة

{لتغيير في القائمة }
ModifyMenu(SysMenu, sc_Close, mf_ByCommand, sc_Close, '&Exit'#9'Alt+F4  '  ); '

لكن لنطرح السؤال هل تعليمة الغلق الموجودة في القائمة تغلق فقط النافذة الشاغرة ام التطبيق ككل ؟

الجواب : لا تعليمة الغلق هنا تشبه تعليمة close وليست application.terminat .

اذن فما العمل عندما نريد ان نغلق البرنامج من نافذة ثانية form2

الجواب :

2- في هذا المثال تكون الاجابة

*-نضيف نافذة اخرى للمشروع الاول ونقوم بتغيير التصريح كما يلي

type
  TForm2 = class(TForm)
private
procedure SysCommand(var Msg: TMessage); message wm_SysCommand;{ Private declarations }
end;
var  Form2: TForm2;
implementation{$R *.dfm}
procedure TForm2.SysCommand(var Msg: TMessage);
begin
inherited;
if Msg.wParam = sc_Close then
begin
Showmessage ('سيتم انهاء البرنامج !');
Application.Terminate;
end;end;end.

ليكن السؤال هل يمكن اضافة تعليمة خاصة بي

الجواب نعم وهذا المثال يسمح بزادة تعليمة تقوم بمنادات الفورم الثانية

private
procedure SysCommand(var Msg: TMessage); message wm_SysCommand;{ Private declarations }
end;
var  Form1: TForm1;
implementation uses Unit2;{$R *.dfm}
procedure TForm1.SysCommand(var Msg: TMessage);
begin
inherited;
if Msg.wParam = 10 then
form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
SysMenu: hMenu;
Begin
SysMenu := GetSystemMenu(Form1.handle,false);
insertmenu(sysmenu,4,Mf_ByPosition,10,'form2_show');
end;

end.

في هذا المثال نتعلم كيف نضهر toolbarr عند النقر على تعليمة toolbarr_show ونخفيها بنفس التعليمة

type
TForm3 = class(TForm)
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
procedure FormCreate(Sender: TObject);
private
procedure SysCommand(var Msg: TMessage); message wm_SysCommand;
public
end;
var  Form3: TForm3;
implementation uses Unit2;{$R *.dfm}
procedure TForm3.SysCommand(var Msg: TMessage);
var
SysMenu: hMenu;
MonFlag:integer;
begin
inherited;
if Msg.wParam = 121 then
begin
SysMenu := GetSystemMenu(Handle, False);
MonFlag:= GetMenuState(SysMenu,121,mf_ByCommand);
if MonFlag = Mf_Checked then
begin
ToolBar1.Visible:=false;
CheckMenuItem(SysMenu, 121,MF_UnChecked);
end
else
begin
ToolBar1.Visible:=true;
CheckMenuItem(SysMenu,121,Mf_Checked);
end;
end;
end;

procedure TForm3.FormCreate(Sender: TObject);
var
SysMenu: hMenu;
begin
SysMenu := GetSystemMenu(Handle, False);
AppendMenu(SysMenu, mf_ByCommand+ Mf_Unchecked, 121, 'Tjrs Visible' );
end;
end.

وفي الاخيير هذا مثال عن انشاء تعليمة في القائمة وبالتفصيل :

type

  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;
  MonIcone : TBitmap;

const
SC_MonArticleMenu = WM_USER + 1;

implementation

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
var
SysMenu: hMenu;
MenuItemInfo: TMenuItemInfo;
begin
MonIcone := TBitmap.create;
MonIcone.LoadFromFile ('D:Program FilesCommon FilesBorland SharedImagesIconschem16.bmp');

SysMenu := GetSystemMenu(form4.Handle, False);

MenuItemInfo.cbSize := 44;
MenuItemInfo.fMask := Miim_Checkmarks or Miim_ID or Miim_State or Miim_Type;
MenuItemInfo.fType := Mft_String;
MenuItemInfo.fState := Mfs_Checked;
MenuItemInfo.wID := SC_MonArticleMenu;
MenuItemInfo.hSubMenu := 0;
MenuItemInfo.hbmpChecked := MonIcone.Handle;
MenuItemInfo.hbmpUnchecked := 0;
MenuItemInfo.dwTypeData := PChar('La soif de connaître !');
InsertMenuItem(SysMenu, Dword(-1), True, MenuItemInfo);
end;

procedure TForm4.FormDestroy(Sender: TObject);
begin
MonIcone.Free;
end;

end.

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:35

#12

الأخ reda السلام عليكم ورحمة الله وبركاته

أشكرك على هذه الدروس الهامة في api التي يحتاجها كل مبرمج دلفي لقد أعدت أنت والاخ العزيز زكيري عبدالعال الحيوية مرة أخرى لهذا المنتدى الرائع .

ولدي سؤال وهو كيف استطيع ان افعل خاصية الاخفاء التلقائي لشريط ابدأ . أتمنى أن تضمها لدرسك القادم . وأشكرك مقدما وأتمنى أن تستمر في دروسك .

#13

السلام عليكم ورحمة الله وبركاته

شكرا للاستاذ زكيري على مساهمته الفاعلة

و سنكمل إن شاء الله

بناء على طلب أخي الحق

شرح الخوارزمية :

gettimezoneinformation(aa);

لوضع المعلومات الخاصة بالمنطقة الزمنية للحاسب في المتحول aa الذي هو عبارة عن سجل من نمط Time_zone_information.

aa.bias

تعبر عن الفارق الزمني بالدقائق بين المنطقة الزمنية للحاسب والمنطقة الزمنية الأساسية .

aa.standardname

تعبر عن اسم المنطقة الزمنية الخاصة بالحاسب .

aa.daylightname

تعبر عن التوقيت الحالي للحاسب حسب التوقيت الصيفي أو الشتوي بفارق ساعة زمنية بينهما .

ملاحظة : يكون الفارق الزمني ساعتان شتاءً وثلاث ساعات صيفاً وفقاً للمنطقة الزمنية المخصصة لسوريا والتي تسمى القاهرة .

المتحول Bias تكون قيمته 120- أي أن المنطقة الزمنية التي يخضع لها الحاسب تنقص بمقدار ساعتان أو 120 دقيقة عن التوقيت العالمي حيث أن التوقيت المحلي يحسب وفقاً للمعادلة التالية :

local time = GMT-bias.

حيث أنه كما تعلمون Gmt هو تعبير عن توقيت غرينتش

2_التابع

Exitwindowsex:

صيغته:

exitwindowsex(value,reseved)

يستخدم هذا التابع لإغلاق التطبيقات المفتوحة أو لإعادة إقلاع أو إطفاء الحاسب.

لهذا التابع متحولين:

Value يعبر عن متحول أساسي يأخذ مجموعة من القيم وهو الذي يعبر عن نوع الإغلاق:

1. ewx_force: يجبر Windows على إغلاق كافة التطبيقات دون أي احتمال لوجود خطأ أم لا وهي غير آمنة ولا ينصح استخدامها لذلك يستخدم قبلها الخيار Ewx_logoff.

2. Ewx_logoff: وهي مثل الخيار السابق إلا أنها أكثر أمانا ويمكن أن لا يتم إغلاق البرنامج عن طريقها في حال وجود خطأ ما.

3. Ewx_poweroff: يستخدم لإظهار رسالة (يمكنك الآن إطفاء الكمبيوتر بأمان) وإطفاء الحاسب ويستخدم مع الخيارين السابقين بالإضافة إلى الخيار Ewx_shutdown.

4. ewx_reboot: يستخدم لإعادة إقلاع الحاسب.

5. Ewx_shutdown: يستخدم لإطفاء الحاسب

مثال بسيط

procedure Tform1.button1click(sender:tobject);
begin

if not (exitwindowsex(ewx_reboot,0)) then
exitwindowsex(ewx_reboot,0)
end;

3_التابع

Bringwindowtotop :

صيغته:

bringwindow totop(HWND:hwnd):boolean

يستخدم هذا التابع لجلب نافذة محددة إلى مقدمة النوافذ الأخرى ويتميز هذا التابع بمتحول وحيد Hwnd يمثل النافذة المحددة , يعيد هذا التابع قيمة منطقية True في حال وجود النافذة المحددة وجلبها الى المقدمة وإلا يعيد القيمة False .

مثال:

procedure Tform1.button1click(sender:tobject);
if not(bringwindowtotop(form2.handle)) then
bringwindowtotop(form2.handle);

في حال تحقق البيان if يتم تنفيذ التابع وجلب النافذة Form2 إلى المقدمة.

الزر الثاني وظيفته إظهار النافذة Form2 في حال أخطأ المستخدم وأغلق هذه النافذة .

تجدون المثال مع المرفقات

4_التابع

Destroywindow:

صيغته:

destroywindow(HWND:hwnd):boolean;

يستخدم هذا التابع لهدم نافذة محددة مع كافة النوافذ الابن المرتبطة معها،كما انه يقوم بهدم رسائل الـ Window .له متحول وحيد Hwnd يعبر عن النافذة المطلوب تدميرها . يعيد هذا التابع قيمة حقيقيةTrue عند نجاح عملية التدمير والا يعيد القيمةFalse .

مثال :

procedure Tform1.button1click(sender:tobject);
destroywindow(form1.handle):boolean;

5_التابع

iszoomed:

صيغته :

iszoomed(HWND:hwnd):boolean;

يتحسس هذا التابع لحالة التطبيق الفعال او النموذج الفعال اهو اعظمي ام لا حيث يعيد القيمةTrue عندما يكون بحالته الاعظمية والا يعيد القيمة False.

مثال :

يوجد لدينا زر واحد نغير من خلاله لون النموذج اذا لم يكن بحجمه الاعظمي(طبعا أبسط مثال ممكن)

 
procedure TForm1.Button1Click(Sender: TObject);
begin
if not (iszoomed(application.handle))then
form1.Panel3.color:=clsilver;
end;

end.

Isiconic:

صيغته:

Isiconic (HWND: hwnd): Boolean;

يتحسس هذا التابع لحالة التطبيق الفعال أهو بحجمه الأصغري أم لا حيث أنه يعيد القيمة True عندما يكون بحالته الأصغرية وإلا يعيد القيمة False.

حيث أنه يمكن أن يعبر عن تطبيق عام حاو لمجموعة من النماذج وعند هذه الحالة يسمى التطبيق Application.

المثال:

يوجد لدينا زر واحد نغير من خلاله لون النموذج إذا لم يكن بحجمه الأصغري.

procedure TForm1.Button1Click(Sender: TObject);
begin
if not (isiconic(application.handle)) then
form1.Panel3.color:=clgray;

أخي admin

ماطلبت قد أدرجته مع الدروس لكن سيأتي وقته قريبا إن شاء الله

ستكون المجموعة القادمة أشد عمقا وربما ذات مستوى أعلى قليلا

فانتظرونا لن ننتأخر إن شاء الله

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:36

#14

بسم الله الرحمن الرحيم

رد متأخر ....الأخ رضــا

القصد ..هو ماهو تعربف الأعدادت الأقلمية للغة ...العربية او الأنكليزية

يعني كيف يمكنني معرفة الكمبيوتر على أي أعدادات هو الأن دمشق

اما ..فلسطين ...

مشكوراً:rolleyes:

#15

السلام عليكم

أخي admin

هذا يستعمل للإظهار

ShowWindow(FindWindow('Shell_TrayWnd',nil),SW_SHOW);

هذا يستعمل للإخفاء

ShowWindow(FindWindow('Shell_TrayWnd',nil),SW_HIDE);

أرجو أن يكون هذا طلبك

بالنسبة لك أخي الحق

إليك هذه الطريقة

var
  Buffer: PChar;
  Size: integer;
begin
  Size := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, nil, 0);
  GetMem(Buffer, Size);
  try
    GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, Buffer, Size);
    label1.Caption := string(Buffer);
  finally
    FreeMem(Buffer);
  end;
end;

طبعا تعتمد على الرجستري

حيث ستظهر على الشكل

Ars

Ar عرب

S سوريا طبعا

عذرا فأنا مشغول بالاختبارات ادعوا لي بالنجاح سوف

أقوم بالشرح وإضافتها إلى الدروس

لن أتاخر بإذن الله

أخوكم

رضا

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:38

#16

هل هذا طلبك أخي محمد

#17

أشكر اخي رضا وآسف جدا علىالتأخير في الرد .

للأسف ليس طلبي ، طلبي هو شريط ابدأ له خيار في الخصائص إخفاء ذاتي كل ما أريده هو تفعيل هذا الخيار .

مع تمنياتي لك بالتوفيق والنجاح .

#18

بسم الله الرحمن الرحيم

شكرا لك أخي رضا...سأجربه ..وأخبرك ......(f)

#19

قبل أن أبدأ بالمجموعة الجديدة أود أن أشير إلى ملاحظة هامة كنت غافلا عنها في بداية الدروس

تتطلب التوابع والاجرائيات في win32api

سلاسل محرفية تنتهي بصفر.لذلك لاتحولوا تمرير متحولات من نوع ShortString (يمكن بعد نتطرق لانواع كثيرة من المتحولات لم يتطرق لها أحد بعد في هذا المنتدى)

إلى تابع Api لان المترجم لن يترجمها.يفضل استخدام السلاسل المحرفية المنتهية

بصفر عند التعامل مع wi32APi

مما يجعلها أكثر أكثر نشاطا.

والان بسم الله الرحمن الرحيم

نبتدأ

Getcursorpos:

صيغته:

Getcursorpos (Tpoint): tpoint;

يستخدم هذا التابع لتحديد موقع مؤشر الماوس ويرد قيمة من النوع Tpoint حيث أنه يعيد الإحداثيات (x,y) الحالية لمؤشر الماوس بالبكسل.

Getdc:
صيغته:
Get dc (hwnd): hdc;

يستخدم هذا التابع لاعادة اسم منطقة العمل أو لتحديد منطقة العمل الفعالة فمثلا عند الرغبة بأن تكون منطقة التكبير هي فقط Form1 فإننا نكتب ما يلي:

get dc (form1.handle);

يتميز هذا التابع بمتحول وحيد يعبر عن النافذة التي نتعامل معها ،ويعيد هذا التابع قيمة Hdc التي تعبر عن المناطق الرسومية في Windows المنشاة عن طريق الأمر Create في حال نجاح التابع وإلا لا يعيد أي قيمة أي يعيد القيمة التي تساوي Null وعادة يستخدم هذا التابع اسم العنصر الذي نتعامل معه فان كان هذا العنصر هو سطح المكتب نستخدم التابع Getdesktopwindow الذي يعيد منطقة العمل سطح المكتب وهي المنطقة الظاهرة على الشاشة من أي برنامج كما يلي:

getdc(getdesktopwindow);

Copyrect:

صيغته:

copyrect(dest(trect),canvas(tcanvas),source(trect));

Inflaterect:

صيغته:

Inflaterect(lprect,dx(int),dy(int)):boolean;

الأول Lprect وهو عبارة عن متحول من نوع Trect والذي يعبر عن المساحة المستطيلة التي يعبر عنها بنقطتين أي (أربع إحداثيات).

الثاني dx وهو عبارة عن متحول من نوع Integer الصحيح والذي يعبر عن مقدار الزيادة أو النقصان في الإحداثيات الأفقية للمنطقة المستطيلة ولكن بما أنه من النوع الصحيح لذلك يجب علينا استخدام التابع Round معه لأخذ القيمة الصحيحة فقط.

الثالث dy وهو عبارة عن متحول من نوع Integer الصحيح والذي يعبر عن مقدار الزيادة أو النقصان في الإحداثيات العمودية للمنطقة المستطيلة ولكن بما أنه من النوع الصحيح لذلك أيضا يجب علينا استخدام التابع Round معه لأخذ القيمة الصحيحة فقط.

يعيد هذا التابع قيمة منطقية تمثل True في حال تم تنفيذ التابع بنجاح و False في حال فشل التابع في تنفيذ مهمته.

ملاحظة: يقدر التناقص أو التزايد بالواحدة unit ، حيث أن الواحدة تساوي 10 بكسل

سنضع مثال على التوابع الاربعة السابقة انتبهوا إليه جيدا

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Panel2: TPanel;
    Timer1: TTimer;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  iwidth,iheight:integer;
  srect,drect:trect;
  c:tcanvas;
  cur:tpoint;
implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var
itmpx,itmpy:integer;
begin
getcursorpos(cur);
iwidth:=image1.width;
iheight:=image1.height;
drect:=rect(0,0,iwidth,iheight);
itmpx:=iwidth;
itmpy:=iheight;
srect:=rect(cur.x,cur.y,cur.x,cur.y);
inflaterect(srect,round(itmpx),round(itmpy));
c:=tcanvas.create;
try
c.handle:=getdc(getdesktopwindow);
image1.canvas.CopyRect(drect,c,srect);
finally
c.free;
end;
end;

end.

شرح الخوارزمية:

على حدث الـ Timer1Timer قمنا بكتابة ما يلي:

getcursorpos(cur);

لإسناد إحداثيات موقع المؤشر في النقطة المعرفة مسبقا Cur.

iwidth:=image1.width;

لإسناد قيمة الإحداثي Width الخاص بالعنصر Image إلى المتحول Iwidth المعرف مسبقا على أنهInteger.

iheight:=image1.height;

لإسناد قيمة الإحداثي Height الخاص بالعنصر Image إلى المتحول Iheight المعرف مسبقا على أنهInteger.

drect:=rect(0,0,iwidth,iheight);

لإسناد المنطقة المستطيلة المحددة التي تم حجزها بالإحداثيات التالية (0,0,iwidth,iheight) إلى المستطيل Drect الذي تم تعريفه مسبقا.

itmpx:=iwidth;

لإسناد القيمة Iwidth إلى المتحول Itmpx الذي تم تعريفه مسبقا على أنه Integer أي صحيح.

itmpy:=iheight;

لإسناد القيمة Iheight إلى المتحول Itmpy الذي تم تعريفه مسبقا على أنه Integer أي صحيح.

srect:=rect(cur.x,cur.y,cur.x,cur.y);

لإسناد المنطقة المستطيلة التي تم حجزها وفقا لإحداثيات المؤشر إلى المستطيل Srect الذي تم تعريفه مسبقا على أنه Trect.

inflaterect(srect,round(itmpx),round(itmpy));

لزيادة إحداثيات المنطقة المستطيلة srect بمقدار المتحول Itmpx بشكل أفقي وبمقدار المتحول Itmpy بشكل عمودي.

c:=tcanvas.create;

لإنشاء منطقة رسومية من النوع Tcanvas وحجز موقع محدد لهلا في الذاكرة وإسنادها إلى المتحول c المعرف مسبقا على أنه من النمط Tcanvas.

try

c.handle:=getdc(getdesktopwindow);

لإعادة اسم منطقة العمل الفعالة وهي عبارة عن سطح المكتب والمعبر عنها من خلال التابع Getdesktopwindow.

image1.canvas.CopyRect(drect,c,srect);

لنسخ جزء من صورة سطح المكتب الممثلة بموقع مؤشر الماوس والمعبر عنها من خلال المتحول srect إلى المستطيل Drect الذي يعبر عن إحداثيات العنصر Image.

finally

c.free;

لتحرير موقع الذاكرة الذي تم حجزه للمنطقة الرسومية c التي هي من النوع Tcanvas.

هناك طرق أخرى لعمل أمور مماثلة طبعا يكون المثال الناتج أقوى من الذي حصل لكن راعينا هنا السهولة والهدف هو فهم التوابع ليس إلا

والحرص على أن يكون الكود عربي 100% لاأن يكون مستمد من أحد أخر

Lockwindowupdate :

صيغته:

lockwindowupdate(HWND:hwnd):boolean;

يستخدم هذا التابع لقفل النموذج من إعادة رسمه أو تطويره أي نتعامل معه كصورة ثابتة لا يمكن أن تتغير إلا بعد إلغاء القفل عنها والمقصود بقفل النموذج هو عدم تمكين ضغط الزر f5 من لوحة المفاتيح مع الملاحظة إلى انه لا يمكن قفل إلا نافذة أو نموذج واحد بأن واحد وهو النموذج الأساسي أي الـ Mainform لذلك عند الرغبة بإلغاء القفل يجب إلحاق القيمة صفر للنموذج الذي يعبر عنه التابع.

مثال:

form1.show;
إظهار النافذة المحددة Form1. 
lockwindowupdate(form2.handle);
قفل النافذةForm2 .

Iswindowvisible:

صيغته:

iswindowvisible(HWND:hwnd):boolean;

يستخدم هذا التابع لمعرفة إذا كانت النافذة التي نتعامل معه بحالتها المرئية حيث يتميز هذا التابع بمتحول وحيد Hwnd الذي يعبر عن النافذة التي نتعامل معها، يعيد هذا التابع قيمة منطقية تمثل True في حال نجاح التابع في تنفيذ مهمته وإلا يعيد القيمة False في حال فشل التابع في تنفيذ مهمته.

مثال

procedure TForm1.Button1Click(Sender: TObject);
begin
if not (iswindowvisible(form2.handle)) then
begin
form2.show;
label1.caption:='النافذة ناهية أصبحت مرئية';
end
else
label1.caption:='النافذة ناهية مرئية';
end;

شرح الخوارزمية:

If not (iswindowvisible (form2.handle)) then

في حال تحقق البيان If الذي هو النافذة Form2 غير مرئية يتم ما يلي:

begin

form2.show;

إظهار النافذة Form2 وجعلها مرئية من قبل المستخدم.

label1.caption:='النافذة ناهية أصبحت مرئية';

إظهار العبارة التالية: " النافذة ناهية أصبحت مرئية ".

End

وإلا أي إذا لم يتحقق الشرط وكانت النافذة مرئية يتم تنفيذ البيان التالي:

Else

label1.caption:='النافذة ناهية مرئية';

يقوم بإظهار العبارة التالية: " النافذة ناهية مرئية ".

offsetrect:

صيغته:

offsetrect(lprect,x(int),y(int)):boolean;

يستخدم هذا التابع لتحريك منطقة مربعة بمقدار محدد وفق المحورين (x,y) حيث يتم التحريك بالبكسل.

يتميز هذا التابع بثلاثة متحولات:

الأول: Lprect هو متحول يعبر عن منطقة مربعة.

الثاني: x هو عبارة عن متحول من النوع الصحيح Integer يعبر عن مقدار حركة المنطقة المربعة بالبكسل وفق المحور الأفقي.

الثالث: y هو عبارة عن متحول من النوع الصحيح Integer يعبر عن مقدار حركة المنطقة المربعة بالبكسل وفق المحور العمودي.

يعيد هذا التابع قيمة منطقية تمثل True في حال نجح التابع بعملية التحريك وإلا يعيد القيمة False في حال فشل التابع في تنفيذ مهمته.

شرح المثال:

يوجد لدينا في هذا المثال نافذة وحيدة حيث أنه يجب علينا تحريك مؤشر عنصر الـTrackbar من ثم النقر على النافذة حيث تظهر لنا الكلمة "in " في حال تم مرور مؤشر الماوس فوق المنطقة التي تم النقر عليها وحجزها حسب قيمة مؤشر الـ Trackbar وإلا تظهر الكلمة " out " إذا لم يمر مؤشر الماوس فوق تلك المنطقة. حيث أنه كلما زادت قيمة مؤشر العنصر Trackbar يزداد عرض المنطقة المحجوزة أفقيا وعموديا بنفس نسبة الزيادة.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Panel2: TPanel;
    Panel3: TPanel;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    Image1: TImage;
    procedure Image1Click(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  PTN:TPOINT;
  RCT:TRECT;
  DX,DY:integer;

implementation

{$R *.DFM}

procedure TForm1.Image1Click(Sender: TObject);
begin
rct.left:=form1.Left;
rct.top:=form1.top;
rct.Right:=form1.Left+100*trackbar1.Position;
rct.bottom:=form1.top+100*trackbar1.Position;
offsetrect(rct,dx,dy);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
getcursorpos(ptn);
if ptinrect(rct,ptn) then
label1.caption:='in'
else
label1.caption:='out';
dx:=x;
dy:=y;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
inflaterect(rct,10*trackbar1.position,10*trackbar1.position);
end;

end.

شرح الخوارزمية:

على حدث الـ Image1Click قمنا بكتابة ما يلي:

لإسناد الإحداثي Left للنافذة المحددة Form1 إلى الإحداثي Left للمستطيل Rct المعرف مسبقا على أنه Trect.

rct.top:=form1.top;

لإسناد الإحداثي Top للنافذة المحددة Form1 إلى الإحداثي Top للمستطيل Rct المعرف مسبقا على أنه Trect.

rct.Right:=form1.Left+100*trackbar1.Position;

لإسناد الإحداثي Left للنافذة المحددة Form1 مضافا إليه جداء قيمة مؤشر عنصر الـ Trackbar المحددة من قبل المستخدم بالعدد 100 إلى الإحداثي Bottom للمستطيلRct المعرف مسبقا على أنه Trect.

rct.bottom:=form1.top+100*trackbar1.Position;

لإسناد الإحداثي Top للنافذة المحددة Form1 مضافا إليه جداء قيمة مؤشر عنصر الـ Trackbar المحددة من قبل المستخدم بالعدد 100 إلى الإحداثيBottom للمستطيل Rct المعرف مسبقا على أنه Trect.

offsetrect(rct,dx,dy);

لتحريك المنطقة المربعة المحددة Rct وفق المحورين الأفقي x والعمودي y.

وعلى الحدث Image1MouseMove قمنا بكتابة ما يلي:

getcursorpos(ptn);

لإرجاع قيمة موقع مؤشر الماوس إلى المتحول Ptn المعرف مسبقا على أنهTpoint (نقطة).

في حال تحقق البيان if يتم تنفيذ البيان التالي:

[CODE]
If ptinrect (rct, ptn) then

label1.caption:='in'

إذا مر مؤشر الماوس المتمثل بالمتحول Ptn فوق المستطيل المتمثل بالمتحول Rct يظهر التعبير "in ".

وإلا إذا لم يتحقق البيان if يتم تنفيذ البيان التالي:

Else

label1.caption:='out';

لإظهار التعبير " out " في حال لم يمر مؤشر الماوس فوق المستطيل Rct.

dx:=x;

لإسناد قيمة البرامتر x الخاص بالحدث Image1MouseMove إلى المتحول dx المعرف مسبقا على أنه Integer صحيح.

dy:=y;

لإسناد قيمة البرامتر y الخاص بالحدث Image1MouseMove إلى المتحول dy المعرف مسبقا على أنه Integer صحيح.

وعلى الحدث TrackBar1Change كتبنا ما يلي:

inflaterect(rct,10*trackbar1.position,10*trackbar1.position);

لزيادة عرض وارتفاع مساحة المستطيل المتمثل بالمتحول Rct بمقدار تزايد أفقي يتمثل بـ 10*Trackbar1.position أي بجداء قيمة مؤشر العنصر Trackbar1.position بالعدد 10 وبنفس المقدار يتم التزايد عموديا.

Iswindow:

صيغته:

iswindow(hwnd):boolean;

وإلى لقاء قريب جدا بإذن الله

علنا نخرج بالنهاية بمرجع سهل لتعلم الapi

نرجو منكم المساهمة بالمناقشة الفاعلة والنقد البناء

فهذا المنتدى بالنهاية يستمر ويبقى بمشاركاتكم الفاعلة ونقدكم البناء

أخوكم رضا

offsetrect.rar

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:40

#20

التحكم في واجة الونداوز

بقلم زكيري عبد العالي

الفهرس

1-مقدمة

2-كيف نتحكم في شريط المهام

أ- تعريف

ب-اقسام شريط المهام

ج-استعمالات وامثلة

3-كيف نتحكم في سطح المكتب

أ- تعريف

ب-اقسام سطح المكتب

ج-استعمالات وامثلة

4- الخلاصة

1-مقدمة

في هذا الموضوع سنتعلم كيف نتحكم في جزء واجة الوندوز 98 وبالظبط في شريط المهام اعرف ان جزء من التعليمات ذكرناها سابقا الا اني اكرر هذا في شكل درس وبالتفصيل ليتسنى للجميع الفهم الجيد .

2-كيف نتحكم في شريط المهام:

أ- تعريف

شريط المهام هي ذلك الشريط الذي يضهر في الاسفل والذي يحتوي على زر ابدأ وبعض الايقونات والساعة...

وكما نعلم ان اي نافذة او مكون نجد له عنوان في الداكرة ولمعرفة الهندل معين هناك دلة في الدلفي FindWindow

وباعطاء الكلس 'Shell_TrayWnd' نكون قد وصلنا الى شريط المهام .

var

Tray: hWnd;

Begin

Tray := FindWindow('Shell_TrayWnd', NIL);

في هذه الكتابة قمنا باسناد الهندل لشريط المهام الى المتغيير tray.

ب-اقسام شريط المهام

نلاحظ ان هناك ثلاثة اقسام تعتبر اولاد الشريط نستطيع الوصول الهم عن طريق الدالةGetWindow ونضع GW_CHILD

وكي نفرق بين الاقسام الثلاثة

القفل ... الوسط ... التراي (BUTTON'' 'ReBarWindow32' 'TrayNotifyWnd').

ج-استعمالات وامثلة

var

Tray, Child : hWnd;

C : Array[0..127] of Char;

Begin

Tray := FindWindow('Shell_TrayWnd', NIL);

Child := GetWindow(Tray, GW_CHILD);

While Child 0 do Begin

If GetClassName(Child, C, SizeOf©) > 0 Then Begin

If UpperCase(StrPAS©) = 'BUTTON'Then Begin

// instructions

End;

End;

Child := GetWindow(Child, GW_HWNDNEXT);

End;

End;

المثال صالح للاقسام الثلاثة فقط بتغيير الشرط

If UpperCase(StrPAS©) = 'BUTTON'Then

If UpperCase(StrPAS©) = 'ReBarWindow32'Then

If UpperCase(StrPAS©) = 'TrayNotifyWnd'Then

استعمالات

للاخفاء واضهار الشريط الدلة ShowWindow

ShowWindow(FindWindow('Shell_TrayWnd', NIL) , SW_HIDE(

ShowWindow(FindWindow('Shell_TrayWnd', NIL) , SW_NORMAL(

ShowWindow(FindWindow('Shell_TrayWnd', NIL) , SW_show(

ShowWindow(FindWindow('Shell_TrayWnd', NIL) , WM_DESTROY (

التعليمة الخاصة بتعطيل او تمكين هي EnableWindow

-كيف نتحكم في سطح المكتب:

أ- تعريف

سطح المكتب هي الواجة التي تضهر اولا ولا اضن ان هناك من لا يعرفه لكن اتعلم عزيزي الطالب انه عبارة عن ListView ومعرفة الهندل لهذه المكونة نكتب FindWindow('Progman','Program Manager'); وهي اجبارية لتتحكم .

ب-اقسامه.:

الخلفية , الايقونات . خط عناوين الايقونات . خلفية الكتابة لاحض الدوال التالية :

FHandle وتمثل عنوان سطح المكتب والدي عرفنا كيف نتحصل عليه :

ListView_GetTextBkColor(FHandle); لاسرجاع لون خلفية الكتابة

ListView_GetTextColor(FHandle); لاسترجاع لون الكتابة

ListView_GetBKColor(FHandle); لاسترجاع لون الخلفية

لو تمعنت جيدا لوجدت ان التعليمة get تستعمل لاسترجاع شيئ ما و الهندل ضروري في كل تعليمة .

اما

ListView_setBkColor(FHandle,اللون );

ListView_setTextColor(FHandle,اللون );

ListView_setTextBkColor(FHandle,اللون );

set تستعمل لارسال شيئ

هنا امر مهم من الدوال المهمة في api و التحكم في التطبيقات الجاهزة الدالة SendMessage قد تحدث عنها اخي واستادي سيم كثيرا وفي دروس مهمة سابقا .

ج-استعمالات:

في المثال المرفق امثلة جيدة .

4- الخلاصة

نلخص من هدا الموضوع ان الونداوز لعبة في يد مبرمجي الدلفي ودالك من خلال دوال api والشيئ المهم هو معرفة عنوان المكون 'الهندل' لنستطيع التحكم فيه .. كما انه يمكن التحكم ايضا عن طريق ملفات الدلل dll' ' الموجودة في الونداوز وهو درس إن شاء الله سيكون قريب .

الملف المرفق

desktop.rar

#21

السلام عليكم....

ممتاز أخوي ..في جهودكم العالية ,,والغالية .....وأرجو المزيد من التقدم

أخوكم:cool:

#22

Iswindowenabled:

صيغته:

iswidoeenabled(hwnd):boolean;

يستخدم هذا التابع لاختبار تفعيل نموذج ما بشرط عند عدم تواجد النموذج الأب أي انه إذا لم يكن منشأ أو غير مرئي أو غير فعال فان النموذج الابن تكون له نفس صفات والده تماما أي إذا كان النموذج الأب غير فعال فان النموذج الابن غير فعال حتما.يعيد هذا التابع قيمة منطقية تمثل القيمة True إذا كان النموذج فعال وإلا يعيد القيمة False.يتميز هذا التابع بمتحول وحيد يمثل النافذة التي نتعامل معها.

مثال

if iswindowenabled(form2.handle) then

لفحص النافذة الثانية فيما إذا كانت فعالة أم لا فإذا كانت فعالة يتم تنفيذ البيان التالي:

form2.show

إظهار النافذة الثانية الفعالة وإلا يتم تنفيذ البيانات التالية:

else

if  (messagedlg('النموذج غير فعّال.هل تريد تفعيله',mtinformation,[mbok,mbcancel],0)=mrok)  then

Clienttoscreen:

صيغته:

clienttoscreen(point:tpoint):tpoint;

يستخدم هذا التابع لإرجاع إحداثيات نقطة وفقا للإحداثيات المرجعية والتي هي إحداثيات الشاشة الأساسية.

مثال:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);

var
  Form1: TForm1;
  cur:tpoint;

  begin
 getcursorpos(cur);
  label1.caption:=inttostr(clienttoscreen(cur).x)+','+inttostr(clienttoscreen
  (cur).y);

end;

الخورازمية:

على حدث الـ Image1MouseMove قمنا بكتابة ما يلي:

getcursorpos(cur);

لإرجاع قيمة مؤشر الماوس إلى المتحول Cur المعرف على انه Tpoint نقطة.

label1.caption:=inttostr(clienttoscreen(cur).x)+','+inttostr(clienttoscreen

(cur).y);

لإسناد الإحداثي x لمؤشر الماوس المتمثل بالمتحول Cur ثم محرف الفاصلة ثم الإحداثي y لمؤشر الماوس المتمثل بالمتحول Cur.

Isrectempty:

صيغته:

isrectempty(rect:(Trect)):boolean;

يستخدم هذا التابع لمعرفة أو لاختبار المتحول الممثل للمنطقة المربعة فيما إذا كانت المنطقة المربعة فارغة أم لا, والمقصود بكلمة فارغة أن لهذه المنطقة أبعادا صفرية أو أبعادا أفقية صفرية أو عمودية صفرية.

شرح المثال:

استخدمنا هذا التابع مع التابع Equalrect في مثال واحد سيتم شرحه لاحقا.

Equalrect:

صيغته:
equalrect(rect1:(Trect),rect2:(Trect)):boolean;

يستخدم هذا التابع لمقارنة مستطيلين فإذا كانا متساويين يعيد القيمة True وإلا يعيد القيمة False،يتميز هذا التابع بمتحولين كل منهما من نوع Trect.

مثال:

procedure TForm1.Button1Click(Sender: TObject);

var
  Form1: TForm1;
  rct1,rct2:trect;
begin
with Image1 do
rct1:=rect(0,0,100,100);
rct2:=rect(SpinEdit1.VALUE,SpinEdit2.VALUE,SpinEdit3.VALUE,SpinEdit4.VALUE);
  if not equalrect(rct1,rct2) then
    label1.caption:='the two rects are not equal'
  else
  label1.caption:='the two rects are equal';
end;

end.

شرح المثال:

يوجد لدينا نافذة وحيدة فيها زر وحيد و أربع عناصر Spinbutton لتحديد أبعاد المنطقة المستطيلة التي ينبغي حجزها من قبل المستخدم .أما الزر: وظيفته مقارنة المنطقة المستطيلة التي قمنا بحجزها مسبقا ضمن عنصر ال Image ذات الأبعاد التالية (0,0,100,100) مع المنطقة المستطيلة التي يقوم بتحديدها المستخدم من خلال عناصر Spinbutton.

فإذا كانت المنطقة المستطيلة المحجوزة من قبل المستثمر فارغة: يقوم بإظهار الرسالة التالية:( المربع له مساحة صفرية) .

أما إذا لم تكن فارغة... عندئذ يقوم بمقارنة المنطقتين المستطيلتين المحجوزة مسبقا والمحددة من قبل المستثمر :

إذا كانتا متساويتين يقوم بإظهار الرسالة التالية:( the two rects are equal) .

إذا كانتا غير متساويتين يقوم بإظهار الرسالة التالية:( the two rects are not equal)

شرح الخوارزمية

with Image1 do

    

لاحتواء العناصر الأبناء الموجودة في عنصر الـ Image1 

rct1:=rect(0,0,100,100);

لحجز منطقة مستطيلة بأبعاد محددة 

rct2:=rect(SpinEdit1.VALUE,SpinEdit2.VALUE,

SpinEdit3.VALUE,SpinEdit4.VALUE);

لحجز منطقة مستطيلة من خلال المستخدم بواسطة عناصر spinedit التي تحدد أبعاد المنطقة المستطيلة.

if not isrectempty(rct2) then

للتأكد من أن المنطقة المستطيلة المحجوزة من قبل المستثمر ليست فارغة.

 begin

  if not equalrect(rct1,rct2) then

لمقارنة المنطقتين المستطيلتين فيما إذا كانتا غير متساويتين.

    label1.caption:='the two rects are not equal'

لإظهار العبارة التالية: ( (the two rects are not equalأي أن المستطيلين غير متساويين.

  else

  label1.caption:='the two rects are equal';

لإظهار العبارة التالية: ( (the two rects are equalأي أن المستطيلين متساويين.

 end

 else

أما إذا كانت المنطقة المستطيلة المحجوزة من قبل المستثمر فارغة عندئذ ينفذ البيان التالي:

messagedlg('المربع له مساحة صفرية',mterror,[mbok],0)

لإظهار رسالة للمستثمر من خلال مربع حوار تخبره بأن المنطقة المحجوزة فارغة.

Clipcursor:

صيغته:

clipcursor(rect:prect):boolean;

يستخدم هذا التابع لحجز مؤشر الماوس ضمن مربع محدد بنقاط،يتميز هذا التابع بمتحول وحيد من نوع Prect.

التوابع القادمة ستكون توابع غير عادية وعلى مستوى أعلى

أرجو الاطلاع على التوابع السابقة جيدا وأية أسئلة حولها نحن جاهزون

أخوكم رضا

#23

شــكرا reda

مشرف منتدى الدلفي

على هذه المعلومات القيمة و اطالب بتثبيت هذا الموضوع

#24
Clipcursor:



صيغته:

clipcursor(rect:prect):boolean;

يستخدم هذا التابع لحجز مؤشر الماوس ضمن مربع محدد بنقاط،يتميز هذا التابع بمتحول وحيد من نوع Prect.

Prect=@Trect

مثال

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, ExtCtrls, Buttons;



type

  TForm1 = class(TForm)

    Panel2: TPanel;

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure SpeedButton1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

var

rct:trect;

begin

with form1 do

rct:=rect(left,top,left+width,top+height);

clipcursor(@rct);

end;



procedure TForm1.Button2Click(Sender: TObject);

begin

clipcursor(nil);

end;



procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

close;

clipcursor(nil);

end;



end.

شرح الخوارزمية

With form1 do

rct:=rect(left,top,left+width,top+height);

لإنشاء منطقة مستطيلة تأخذ مساحة النافذة Form1 التي نتعامل معها و إسنادها إلى المتحول Rct المعرف مسبقا على أنه Trect.

Clipcursor (@rct);

لحجز مؤشر الماوس داخل النافذة ( أي داخل المنطقة المستطيلة Rct ).

في الزر الثاني كتبنا ما يلي:

 clipcursor(nil);

لفك حجز مؤشر الماوس.

التابع

Getdoubleclicktime:



صيغته:

getdoubleclicktime(void):integer;

يستخدم هذا التابع لإرجاع زمن النقر المزدوج للماوس بالميلي ثانية، حيث أن Void تعني أن هذا التابع ليس له أي متحول.

التابع

Setdoubleclicktime_:



صيغته:

setdoubleclicktime(time):boolean;

يستخدم هذا التابع لإدخال زمن النقر المزدوج للماوس بالميلي ثانية، حيث أن هذا التابع يتميز بمتحول وحيد من نوع Integer (صحيح).ويعيد هذا التابع قيمة منطقية تمثل True عند نجاح عملية الإدخال و إلا يعيد القيمة False.أكبر قيمة يقبلها هذا التابع لتحديد زمن النقر المزدوج هي 5000 ميلي ثانية أي 5 ثواني،وعند وضع الزمن بالقيمة صفر فإن Windows يعتمد زمن النقر المزدوج الافتراضي وهو 500 ميلي ثانية.

مثال:

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, ExtCtrls;



type

  TForm1 = class(TForm)

    Panel2: TPanel;

    Panel3: TPanel;

    Button1: TButton;

    Label1: TLabel;

    Button2: TButton;

    Edit1: TEdit;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

begin

label1.caption:=inttostr(getdoubleclicktime);

end;



procedure TForm1.Button2Click(Sender: TObject);

var

x:string;

begin

x:=edit1.text;

if (x=' ')then

begin

edit1.text:='0';

setdoubleclicktime(strtoint(x));

end

else

setdoubleclicktime(strtoint(x));

end;



end.

الشرح:

label1.caption:=inttostr(getdoubleclicktime(;

كتبنا في الزر الثاني ما يلي:

x:=edit1.text;

لوضع القيمة المدخلة من قبل المستخدم من خلال العنصر Edit1 في المتحول x المعرف مسبقا على أنه String.

if (x=' ')then

إذا تحقق البيان if وكانت القيمة المدخلة من قبل المستخدم فراغا يتم تنفيذ البيانات التالية:

begin

edit1.text:=’0’;

لإسناد قيمة الصفر إلى العنصر Edit1 أي تفريغه قبل بدء الكتابة.

setdoubleclicktime(strtoint(x));

التابع

Getsyscolor_:

صيغته:

getsyscolor(integer):dword;

يستخدم هذا التابع لإرجاع قيمة اللون الذي يعبر عنه لون أحد عناصر الـWindows.يتميز هذا المتحول بالعديد من المتحولات ولكن أخذنا على سبيل المثال لا الحصر متحولين.

Setwindowrgn:

صيغته:

setwindowrgn(HWND,HRGN,BOOLEAN):integer;

يستخدم هذا التابع لإجبار Windows على اعتماد المنطقة المقترحة وفقا للتابع Setwindowrgn الذي سيتم شرحه لاحقاً، ويتميز هذا الثابت بثلاث متحولات: الأول Hwnd يحدد النافذة التي سوف نتعامل معها، الثاني: يعرف المنطقة المقترحة المطلوب الرسم وفقا لها ذات النمط Hrgn، الثالث: Boolean يجبر Windows على اعتبار المنطقة المطلوب الرسم وفقا لها كشكل للنافذة إذا كان لها القيمة True.

يعيد هذا التابع قيمة صحيحة من النوع Integer فير قيمة غير صفرية في حال نجاح إنشاء المنطقة المعتمدة من قبل التابع Createpolygonrgn ويعيد القيمة صفر عند فشل تأسيس المنطقة.

مثال:

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  ExtCtrls, jpeg;



type

  TForm1 = class(TForm)

    Panel2: TPanel;

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

const

ipoint:array[0..5]of tpoint=((x:0;y:400),(x:0;y:200),(x:200;y:200),(x:200;y:0),

(x:400;y:0),(x:400;y:400));



var

  Form1: TForm1;

  rgn:hrgn;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

rgn:=createpolygonrgn(ipoint,6,alternate);

setwindowrgn(handle,rgn,true);

end;



end.

تقاطع أي مستقيمين كما يلي:

const



ipoint:array[0..5]of tpoint=((x:0;y:400),(x:0;y:200),(x:200;y:200),(x:200;y:0),

(x:400;y:0),(x:400;y:400));

نلاحظ أنه تم تعيين مصفوفة من النقاط ثنائية البعد مؤلفة من ست نقاط بحيث تعرف كل نقطة بإحداثيين (x,y) ، بعد تعريف المنطقة rgn المطلوب الرسم وفقاً لها والمعرفة مسبقاً من النمط Hrgn الذي هو من الأنماط المبيتة في Windows والذي يحدد المنطقة المطلوب الرسم وفقاً لها .

يتم إنشاء هذه المنطقة من خلال التابع Createpolygonrgn الذي له الشكل التالي:

createpolygonrgn(tpoint,integer,alternate

);

يتميز هذا التابع بثلاث متحولات:

الأول: يعبر عن اسم متحول النقاط الذي هو من النوع Tpoint.

الثاني: يعبر عن عدد النقاط المطلوب رسمها.

الثالث: يعبر عن تعبئة النافذة وفقا للتسلسل المقترح للنقاط.

على الحدث Formcreate كتبنا ما يلي:

   

rgn:=createpolygonrgn(ipoint,6,alternate

);

إنشاء المنطقة المطلوب الرسم وفقها وإلحاقها بالمتحول Rgn.

setwindowrgn(handle,rgn,true

);

إجبار Windows على اعتماد المنطقة Rgn المطلوب الرسم وفقا لها.

التابع:

Getsysteminfo:

صيغته:

Getsysteminfo(tsysteminfo);

يستخدم هذا التابع لإعادة وإرجاع المعلومات حول النظام وخاصة عن المعالج حيث أن هذا التابع من النوع متعدد الأنماط void ويعتمد نمطه وفقا للمتحول الذي يعبر عنه فإن كان رقما فإنه يعيد رقم وإن كان حرفا فإنه يعيد حرف، وتوجد هذه المتحولات ضمن قائمة System_info وهذا التابع لا يعيد أي قيمة بنفسه.

Tsysteminfo يعبر عن نمط يعرف كافة أنواع المعلومات المطلوبة للنظام.

مثال:

procedure TForm1.Button1Click(Sender: TObject);

var

systeminfo:tsysteminfo;

zw:string;

begin

getsysteminfo(systeminfo);

case systeminfo.dwProcessorType of

386:zw:='intel 386';

486:zw:='intel 486';

586:zw:='intel pentium';

860:zw:='intel 860';

2000:zw:='mips r2000';

3000:zw:='mips r3000';

4000:zw:='mips r4000';

21064:zw:='alpha 21064';

end;

label1.caption:=zw;

end;



end.

شرح الخوارزمية:

بعد أن قمنا بتعريف المتحول Systeminfo الذي هو سجل من النوعTsysteminfo والمتحول Zw من النوع String المحرفي.

كتبنا في الزر مايلي:

Getsysteminfo (systeminfo);

لإرجاع معلومات عن النظام الحالي وإلحاقها بالمتحول Systeminfo.

Case systeminfo.dwProcessorType of

386:zw:='intel 386';

486:zw:='intel 486';

586:zw:='intel pentium';

860:zw:='intel 860';

2000:zw:='mips r2000';

3000:zw:='mips r3000';

4000:zw:='mips r4000';

21064:zw:='alpha 21064';

end;

اختبار اسم المعالج الذي هو عبارة عن أحد متحولات السجل Systeminfo وإلحاقه بالمتحول Zw.

Setsyscolor:

صيغته:

setsyscolor(integer,integer,longint):boolean;

يستخدم هذا التابع لإدخال ألوان لعنصر أو اكثر من عناصر الإظهار في Window ولكن إظهار العناصر هو عبارة عن أجزاء مختلفة من النافذة ،حيث يقوم Windows لإظهار تلك الأجزاء على شاشة عرض النظام .يتميز هذا المتحول بثلاث متحولات:

الأول:يعبر عن عدد العناصر التي يراد تغير ألوانها .

الثاني:يعبر عن مصفوفة بعدد العناصر.

الثالث:عبارة عن مصفوفة تأخذ قيم الألوان المراد تغير العناصر إليها.

يعيد هذا التابع قيمة منطقية تمثل True في حال نجاح التابع بتنفيذ مهمته وإلا يعيد القيمة False .

مثال:

var

  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

x:string;

begin

x:=inttostr(getsyscolor(color_infobk));

label1.caption:=x;

end;



procedure TForm1.Button2Click(Sender: TObject);

var

x:string;

begin

x:=inttostr(getsyscolor(color_window));

label1.caption:=x;

end;

end.
#25

جزاك الله خيرا

أدعو الله عز وجل ان يكتب ذلك في ميزان حسناتك وأن يزيدك من علمه .

هذا الموضوع مغلق.

مواضيع مشابهة