__سرزمين دلفي__ 

خانه
آرشيو

پست الكترونيك


سعید ابریشمی


نویسندگان
سعید ابریشمی
 

آرشیو من
اسفند ۸٢
تیر ۸٢
اسفند ۸۱
 

لینک دوستان
  اخبار وبلاگ ها
ليست وبلاگ ها
قالب وبلاگ
دوست یابی


آمار وبلاگ :

  RSS 2.0  

temp-designer

 

 

چهارشنبه ۱۳ اسفند ،۱۳۸٢

ويندوز هندلی

 

هندل؟!

بورلند دلفي - كه آخرين نگارش موجود آن در بازار دلفي 7 است - علاوه بر دستوراتي كه براي كنترل محيط برنامه دارد، براي كنترل اكثر اشياي ويندوز (Windows) نيز امكانات زيادي را در اختيار برنامه نويس قرار مي دهد. از اين ميان امكان دستكاري (Handling) اجزاي برنامه هاي مختلف را مورد مطالعه قرار مي دهيم.

بطوريكه مي دانيد، هريك از اجزايي كه در پنجره هاي مختلف ويندوز مشاهده ميشود و يا حتي آنهايي كه قابل مشاهد نيست، با اعداد صحيح بزرگتر از صفر (Cardinal) و متمايز از هم شماره گذاري مي شوند. به اين اعداد اصطلاحاً هندل (Handle) گفته مي شود. اشيايي مانند Textbox,lable,button,... هركدام هندلي منحصربفرد دارند. اجزا (components) بكار رفته پروژة دلفي شما نيز اگر از فرزندان TWinControl باشد، داراي هندل هستند. در برنامه هاي مختلف مي توان با استفاده از هندل يك شئ (object) به داده هاي مربوط به شئ دسترسي يافته و حتي در اغلب موارد مي توان مشخصات مربوط به اشياء را تغيير داد. در مثالي كه خواهد آمد، با استفاده از هندل Desktop ، يك تايمر، گرافيك يا متن دلخواه خود را بر روي آن خواهيم نوشت.

اولين سؤالي كه پيش مي آيد اين است كه هندل محتويات Desktop را چگونه بايد يافت؟! جواب اين سؤال تابع Get Device Context زير است:

Handle:=GetDC(Hwnd_Desktop);

سپس با اختصاص اين هندل به يك Canvas مي توانيم مانند ساير ترسيمهايي كه در دلفي مي توان انجام داد، بر روي Desktop نيز بنويسيم.

CustomCanvas.Handle:=Handle;

پس از اينكه با نحوة يافتن هندل آشنا شديم، به بررسي خواص (properties) و روالهايي (Methods) مي پردازيم كه در كلاس TCanvas براي اينكار مهيا است.

Canvas وسيله ايست كه توسط آن مي توان در ظاهر اجزاي ويژوال تغييراتي ايجاد نمود. در زير برخي خواص و روالهاي مربوط به Canvas آورده شده است:

Properties:

Brush مشخصات مربوط به مساحتها

Pen مشخصات قلم ترسيم

Handle هندل

Pixels رنگ يك پيكسل خاص از تصوير

Font خصوصيات قلم متن

Methods:

Arc ترسيم كمان

CopyRect كپي قسمتي از تصويربه تصويري ديگر

Creat ايجاد

Draw رسم يك گرافيك

Ellipse رسم بيضي و دايره

FillRect رنگ كردن يك مستطيل

FloodFill رنگ كردن داخل يك شكل بسته

LineTo رسم خط از نقطة جاري

MoveTo تغيير نقطة جاري

Pie رسم قسمتي از بيضي

Polygon رسم چندضلعي

Rectangle رسم مستطيل

RoundRect رسم مستطيل با گوشه هاي دايروي

TextOut نوشتن متن

حال كه بخشهاي مهم برنامه را شناختيم، به سراغ خود برنامه مي رويم.

برنامه اي براي نوشتن متن روي Desktop

يك برنامه جديد را در دلفي ايجاد كنيد. با دوبل كليك كردن فرم، رويداد (event) مربوط به زمان بار شدن فرم را ظاهر كنيد:

Procedure TForm1.FormCreate(Sender:TObject);

Begin

End;

كدها را به طرف بالا اسكرول كرده و در قسمت Var و قبل از implementation متغير را معرفي كنيد:

var

Form1: TForm1;

DesktopCanvas:TCanvas;

implementation

سطرهاي زير را براي ايجاد Canvas و اختصاص هندل بين سطرهاي شروع و پايان پروسيجر FormCreate وارد كنيد:

DesktopCanvas:=TCanvas.Create;

اين سطر متغير را از نوع TCanvas ايجاد مي كند.

DesktopCanvas.Handle:=GetDC(Hwnd_Desktop);

در اين سطر نيز هندل مختص Desktop را به ترسيم خود نسبت مي دهيم.

حال يك Button به فرم خود اضافه كنيد. آنرا دوبل كليك كرده و كدهاي زير را وارد كنيد:

DesktopCanvas.Brush.Style:=bsClear;

زمينة (Background) سطح متني كه در سطر بعد مي نويسيم را رنگي نمي كند. اين سطر را اگر حذف كنيد، زمينة متن پاك خواهد شد.

DesktopCanvas.TextOut(10,10,'This is your text on the Desktop!');

اين سطر موجب مي شود تا به هنگام فشار دادن كليد در برنامه، عبارت This is your text on the Desktop! در گوشة بالا سمت چپ بر روي Desktop شما نوشته شود، البته با قلم و رنگ پيش فرض.

تمام شد! برنامه را مي توانيد Compile و يا اجرا (Run) كنيد. مي توانيد كارهاي ديگري را نيز انجام دهيد، كارهايي مانند آنچه در نرم افزارهاي Desktop Toys يا نرم افزار نگار انجام شده است.

مثلا براي نمايش ساعت جاري مي توانيد يك Timer از صفحة System به برنامة خود اضافه كنيد. تايمر را دوبل كليك كرده و كدهاي زير را براي رويداد ontimer آن اضافه كنيد:

DesktopCanvas.TextOut(10,40,TimeToStr(Time));

برنامه را بار ديگر اجرا كنيد. حالا شما يك ساعت در گوشه سمت چپ داريد. مي توانيد بيشتر وقت شناس باشيد!

اگر نگران خط خطي شدن Desktop خود شده ايد، اگر برنامه اي در آن گوشه اجرا شود همة متنها پاك خواهد شد.

در پايان يكبار ديگر تمام متن فايل ذكر مي شود تا اگر در درج كدها اشتباهي شده باشد، براحتي اصلاح شود. در پايان لازم به ذكر است كه اين دستورات تقريبا در تمامي نگارشهاي دلفي موجود است و در نگارشهاي 3 و 6 و7 (client/server-proffesional-personal) توسط نگارنده آزمايش شده است.

unit dsktop_handling;

interface

uses

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

StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Timer1: TTimer;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

DesktopCanvas:Tcanvas;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

DesktopCanvas:=TCanvas.Create;

DesktopCanvas.Handle:=GetDC(HWND_DESKTOP);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

DesktopCanvas.Brush.Style:=bsClear;

DesktopCanvas.TextOut(10,10,'This is a text');

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

DesktopCanvas.TextOut(10,40,TimeToStr(Time));

end;

end.

 

Ref:

www.delphi3000.com

Delphi online help - Win32 API

سعید ابریشمی

پيام هاي ديگران ()




دوشنبه ۱٦ تیر ،۱۳۸٢

راست به چپ - موجوديت فايل

 سلام!
جوابهاي يكمي واضح تر:

1- در مورد BiDi يا همون Bi-Directional بايد بگم كه همون راست به چپ نوشتن رو راه مي اندازد. همون مورد كه پرسيده بودن كه: آيا مي توان كاري كرد كه وقتي كاربر روي برنامة ما مياد, كي بردش فارسي بشه؟!

ج: دستور زير را بايد بكار برد. (البته واسه ويندوزهاي فارسي يا عربي)

Application.BiDiKeyboard:='00000401';


2- در مورد جسجتوي فايلها و تابع FileExists :

ج: در مورد جستجوي فايل, دستور FindFirstFile هست. اما بازم مجبورم موكول كنم به بعداً.اما در مورد FileExists:
شكل تابع:
FileExists('MyFile.ext');
(البته مي تونين مسير فايل رو هم بنويسين, وگره توي درايو و دايرتوري جاري مي گرده) اگه فايل وجود داشته باشه مقدار True برميگردونه. اگه فايل نباشه False را بر مي گردونه.


فعلاً تا update ه بعدي bye bye!
راستي! مي دونين ميشه تو دلفي كاري كرد كه Error ها رو هم فارسي نشون بده! مثلاً Division by zero! كه يه Error به زبان انگليسيه مثلاً بشه: "اشكال تقسيم بر صفر!" تو دلفي 6 اينكار رو كردم. تو هفت امتحان نكردم.

سعید ابریشمی

پيام هاي ديگران ()




شنبه ۱٤ تیر ،۱۳۸٢

جوابها! اما ناقص

 سلام!
بعد از مدتها بالاخره مطلبي اينجا مي نويسم!
سعي مي كنم تا اونجا كه از دستم برمياد جوابهاي سوالاتي كه تو اين مدت مطرح شدن بنويسم:

1- فارسي شدن صفحه كليد يعني سويچ كردن بين حالات Eng و Fa

- با ‌BiDi ميشه. سعي مي كنم تو متن بعدي بنويسم.

2- من تازه دارم دلفي كار ميكنم . لطفا به من چيزهاي ابتدايي را ياد بدهيد . من قبلا ويژال بيسيك كار مي كردم و بيشتر چيزها را بلدم و پاسكال هم نيز تا حدودي بلدم .

- اينكه قبلاً VB كار كرده بودين و Pascal هم بلد هستين, خيلي خوبه. يعني خيلي به ياد گرفتن دلفي كمك مي كنه. اما اگه بخواين كامل ياد بگيرين, بايد برين سراغ كتابها. كه تازگيها خيلي زيادن. راستش رو بخواين تو وبلاگ امكان اين كار وجود نداره. اونايي كه كتابش رو نوشتن, سابقة تدريس داشتن و خيلي بهتر از برنامه نويس ها مي تونن از ابتدا ياد بدن.

3- چه جوري مي تونم يك form رو با تموم اجزاء و component هاش درون يك blobfield ذخيره كنم بعد هم نتونيم load كنيم

- من تا حالا ايجور كاري نكردم. فقط يه بار تو شركت شبيه اينكار رو انجام داده بودن كه توي يه فايل مثل فايل dfm هاي دلفي توشون ذخيره مي كردن و ...

4-ميخواهم با دلفي پشتيباني تهيه كنم بر روي فلاپي ديسك و از بانك اطلاعاتي هر روز پشتيباني تهيه كنم مرا راهنمايي كنيد به چه طريق اين كار را انجام دهم در ضمن اگر باز هم سوال داشته باشم مرا كمك ميكنيد؟

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

- اگر بخواهيد پشتيبان كلي تهيه كنيد, مي تونين فايلهاي مرتبط با بانك اطلاعاتي را به فلاپي كپي كنيد و ... . اما چيزي كه معمول است و فكر مي كنم شما آنرا مي پرسيد شايد اين باشد كه Record هايي كه جديداً Edit يا Insert شده اند را پشتيبان گيري كنيد. در مورد اون يكم بحث مفصل تر ميخواد. شايد تو چند روز آينده جوابش رو بتونم بدم.

5- كم و زياد كردن صدا در دلفي ؟
-با دستورهاي GetVolume و Setvolume ميشه كنترل كرد. اگه از help ه دلفي نتونستين استفاده كنين, سعي مي كنم بنويسم.

.... بقيه ش بازم موند!
مي نويسم....
حتماً.......

سعید ابریشمی

پيام هاي ديگران ()




شنبه ۱٤ تیر ،۱۳۸٢

با عرض سلام مجدد!

 سلام!
يه دوستی (آقای صالحی) چند تا سوال نوشته بودند, انشاالله اگه سوادم رسيد, مي خوام جواباشون رو تو همين روزا اينجا بنويسم.

سعید ابریشمی

پيام هاي ديگران ()




چهارشنبه ۱٤ اسفند ،۱۳۸۱

راهزني در ويندوز!

 << FindWindow >>

تا حالا سعي كردم هر چي كه مي گم از Win32 API باشه تا مختص دلفي نباشه. اينبار هم اينكار رو ادامه مي دم. دستور FindWindow از جمله دستوراتي است كه بوسيله ي آن مي توان يك پنجره ي ويندوز را توسط عنوان (Caption) آن شناسايي كرد.
شكل كلي آن بصورت زير است:


FindWindow : HWND
LPCTSTR lpClassName ,{ pointer to class name}
LPCTSTR lpWindowName {pointer to window name}


بعنوان مثال دستور زير, هندل صفحه ي اكولايزر WinAmp را بر مي گرداند. (اگر برنامه ي فوق در حال اجرا باشد):


FindWindow('Winamp EQ','Winamp Equalizer');



هندل(Handle): يك عدد طبيعي (Cardinal) است كه ويندوز به هر برنامه, اجزاهاي برنامه و ... اختصاص مي دهد. در واقع مي توان گفت شماره سريال هر شيئي است كه در ويندوز در حال اجرا است.
با استفاده از اين قابليت مي توان دستورهايي اجرا كرد كه با گرفتن هندل, مي توانند موقعيت يك شيئ, عنوان و .... را بدست آورند يا تغيير دهند.
مثل نمايش password مربوط به dialup Networking كه حالا ديگه همه بلدن!
**************
مي بخشين كه يكم دير به دير update مي كنم. اما خوب دوست دارم يه چيزي بنويسم كه به درد بخوره. (شايد هم نخوره!)

تا درودي ديگر, بدرود.

سعید ابریشمی

پيام هاي ديگران ()




جمعه ٩ اسفند ،۱۳۸۱

چگونه از روشن بودن Capslock مطلع شويم؟

 چگونه از روشن بودن Capslock مطلع شويم؟

در برنامه هاي مختلف پردازش كلمه, هرگاه يكي از كليدهاي Capslock يا Insert زده مي شود, معمولاً وضعيت اين كليدها نشان داده ميشود. يعني (Capslock(on/off و Insert/Overwrite مشخص ميشوند. براي اين منظور تابع GetKeyState وجود دارد. (مربوط به خود دلفي نيست. مال WinAPI است. يعني منحصر به دلفي نيست. در C و VB هم مي توان استفاده كرد.) اين تابع با گرفتن كدِ اسكي (ASCII) كليد مربوطه در صفحه كليد, روشن خاموشي آن را نشان خواهد داد. براي كليدهاي معمولي نيز بالا يا پائين بودن را برمي گرداند.
براي Capslock:
مقدار برگشتي اين تابع روشن يا خاموش بودن چراغ CapsLock روي صفحه كليد است:
روشن و خاموشي با بيت كم ارزشترين تعيين مي شود. فشردن كليد و رها كردن با پر ارزش ترين بيت :
00000001 در مبناي دو: حروف بزرگ روشن است و كليد رها شده است.(مبناي ده: 1)
10000001 در مبناي دو: حروف بزرگ روشن است و كليد هنوز رها نشده است.(مبناي ده: 127)
00000000 در مبناي دو: حروف بزرگ روشن نيست و كليد رها شده است.(مبناي ده: 0)
10000000 در مبناي دو: حروف بزرگ روشن نيست و كليد هنوز رها شده است.(مبناي ده: 128)

اگر بخواهيم فقط روشن و خاموشي را چك كنيم, بايد با «1» عمل منطقي AND را انجام دهيم.
بعنوان مثال كارهاي زير را انجام دهيد:(بعد از ايجاد برنامه)
چهار Label روي فرم قرار دهيد. مقدار Name براي هر Label را به چهار نام زير تغيير دهيد:
CapsLockLabel و NumLockLabel و ScrollLockLabel و InsLabel
حال بر روي قسمت خالي فرم كليك كرده و مقدار Keypreview را True كنيد. (با اين كار اجازه مي دهيم كه اگر بر روي هر كدام از اجزاي فرم, كليدي فشار داده شده باشد, رويدادِ OnKeyPress را اجرا كند.)

حال بر روي Object Inspector صفحه ي Events را انتخاب كنيد. بر روي اين صفحه جلوي OnKeyPress دابل كليك كنيد.
در صفحه اي باز شده عبارات زير را تايپ كنيد:(يا از همين جا كپي كنيد!)

CapsLockLabel.Enabled:=GetKeyState(VK_CAPITAL) and 1 = 1;
NumLockLabel.Enabled:=GetKeyState(VK_NUMLOCK) and 1 = 1;
ScrollLockLabel.Enabled :=GetKeyState(VK_SCROLL) and 1 = 1;
InsLabel.Enabled:=GetKeyState(VK_INSERT) and 1 = 1;


حالا غذاي شما آماده ست! مي تونين اونو توي فر بذارين (compile كنين) بعد از اين پختين ش, حالا مي تونين اونو بخورين! (اجرا كنين)
اميدوارم كه از غذاي امروز كمال استفاده رو ببرين و پدر كاربر بيپاره رو در نيارين. يك بار ديگه مواد لازم رو خدمتتون مي گم, يادداشت كنين:
- Windows API يك قواره! Linux نمي شه, اصرار نكنين! شايد Lindows بشه.
- Delphi 7 يك وجب! (هفت رو واسه كلاس گذاشتن نوشتم. حتي دلفي 3 هم مي شه)
- Ram,hard,... به مقدار لازم.
خوب! كدبانوهاي عزيز! تا برنامه ي بعد, شما رو به خدا مي سپرم.

سعید ابریشمی

پيام هاي ديگران ()




سه‌شنبه ٦ اسفند ،۱۳۸۱

پنجرهايي به شكل دلخواه

 اگه از دست پنجره (window) هاي مستطيلي خسته شدين(مثل من!) مي تونين روال زير رو پيش بگيرين:

پس از ايجاد برنامه, يك جزء تصوير (TImage) روي فرم قرار دهيد.
فرم را جفت كليك كنيد تا روتين مربوط به FormCreat باز بشه. پروسيجر زير را «قبل» از FormCreat بنويسيد:

procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest);
begin
inherited;
if Message.Result = htClient then Message.Result := htCaption;
end;


روتين مربوط به FormCreat را بصورت زير تغيير دهيد:



procedure TForm1.FormCreate(Sender: TObject);
var TransparentColor : TColor;
X,Y, dX, dY : integer;
Points : array[0..10000] of TPoint;
Vertex : array[0..5000] of Integer;
CountVertex : integer;
BeginPoligon : Boolean;
P : TPoint;
Region : HRGN;
Incr : Integer;
begin
L:=50;
TForm(Sender).BorderStyle := bsNone;
dY := Height - ClientHeight;
CountVertex := -1;
Incr := 1;
with Image1,Canvas do begin
dX := Left;
inc(dY,Top);
TransparentColor := Pixels[0,0];
Y := 0;
while Y < Height do begin
X := 0;
BeginPoligon := False;
while X < Width do begin
if (not BeginPoligon) and (Pixels[X,Y] <> TransparentColor) then begin
BeginPoligon := True;
P := Point(X + dX,Y + dY);
end;
if BeginPoligon and (Pixels[X,Y] = TransparentColor) then begin
BeginPoligon := False;
inc(CountVertex);
Vertex[CountVertex] := 4;
Points[CountVertex * 4] := P;
Points[CountVertex * 4 + 1] := Point(X + dX, Y + dY);
Points[CountVertex * 4 + 2] := Point(X + dX, Y + Incr + dY);
Points[CountVertex * 4 + 3] := Point(P.X, P.Y + Incr);
end;
inc(X,Incr);
end;
inc(Y,Incr);
end;
end;
Region := CreatePolyPolygonRgn(Points, Vertex, CountVertex, WINDING);
SetWindowRgn(TForm(Sender).Handle, Region, True);
end;



والسلام! كار تمومه. حالا يه تصوير (من باشم سياه و سفيد مي ذارم) در Image1 بار كنيد. توجه داشته باشيد كه پيكسل بالا سمت چپ هر رنگي داشته باشد, بعنوان رنگ زمينه انتخاب شده و شفاف خواهد شد (Transprant) يعني اگه همه ي تصويرتون مثلاً آبي باشه اما پيكسل اون گوشه زرد باشد, رنگ زرد ها بعنوان زمينه محسوب خواهند شد.
تصوير باز شده بايد bitmap باشد تا قابل پردازش باشد.
مثلا مي تونين از paint مال ويندوز استفاده كنين. يعني برين يه بيضي (توپر- توخالي- غير منظم-منظم و...) اونجا بكشين و save كنين. بياين تو Image1 باز كنين. حالا اگه برنامه رو اجرا كنين يه پنجره ي بيضي شكل دارين!
تبريك مي گم! از دست اين پنجره هاي مزخرف خلاص شدين. اونم فقط بدست دستور زير:

SetWindowRgn(TForm(Sender).Handle, Region, True);



اگر پيشنهادي دارين, خوشحال مي شم اگه مطلع بشم.

سعید ابریشمی

پيام هاي ديگران ()




دوشنبه ٥ اسفند ،۱۳۸۱

سلام!

 سلام!
منظر باشید.



درسته حرفه اي نيستم اما هرچي از دستم بر بياد كوتاهي نمي كنم. اميدوارم شما هم كمك كنيد.
سعي مي كنم در مورد دلفي و نرم افزارهاي مرتبط با اون اطلاعاتي ارائه بدم.


اميدوارم به دردتون بخوره.
با تشكر

سعید ابریشمی

پيام هاي ديگران ()




 

 

[ خانه| آرشيو | پست الكترونيك ]