PDA

View Full Version : شروع کلاس کامپوننت نویسی و OOP



_alish_
چهارشنبه 10 تیر 1383, 15:14 عصر
رخصت از بزرگان
راستش پس از برنامه نویسی معمولی به این نتیجه رسیدم که در کد نویسی باید واقعا با تکنولوژی جلو رفت به سراغ OOPو کامپوننت نویسی رفتم تا تجربیات بالا رود ولی...
خوب با همه هیبت کامپوننت نویسی دنبال هم پا هستم اگر کسی هست یا علی بگه و تا آخر با این گروه باشه :flower:


همکارا با یا علی، قوانین این بخش را شروع کنن تا شاخ این را هم با هم بشکنیم

مهدی کرامتی
چهارشنبه 10 تیر 1383, 15:29 عصر
آقا جان کی گفته OOP شاخ داره؟

OOP یکی از جالبترین متدهای برنامه نویسیه.

سه تا مفهوم کلی داره: توارث (Inheritance) ، کپسوله‌سازی (Encapsulation) ، و چندشکلی بودن (Polymorphysm).

حالا این موارد رو در بحث دنبال کنید.

_alish_
چهارشنبه 10 تیر 1383, 15:56 عصر
سلام DelphiAssistant
راستش چیزی نیست ولی کامپوننت نویسی ترکیبی با انواع عناصر با Messageهای زیاد ویندوز و دلفی برای من مشکله
خوب اگه یاد بگیرم برای من هم آسان من هم آسان می شود(معما چو حل شود آسان گردد)

مهدی کرامتی
چهارشنبه 10 تیر 1383, 16:08 عصر
اتفاقا خیلی ساده است.

Component Developers Guide را در راهنمای دلفی ببینید.

برای شروع یک مثال خوب است. پیشنهاد کنید: چه کامپوننتی بنویسیم؟

NOROOZY
پنج شنبه 11 تیر 1383, 08:36 صبح
ببخشید همینطوری اومدم تو
آقا مهدی اگه جسارت نباشه پیشنهاد میکنم لطفا کامپوننتی طراحی بشه که در اجزاء فرم به جای کلید tab از Enter استفاده کنیم

moradi_am
پنج شنبه 11 تیر 1383, 09:30 صبح
من دو پیشنهاد دارم (یکی سخت یکی اسان):
1- کامپوننتی شبیه edit که در مو قع ورود اطلاعات در یک بانک اطلاعاتی با فشار یک کلید مثل insert یا ... به حالت جستجو رفته و یک dbgrid نمایش داده شده و با وارد کردن هر کلمه عمل جستجو در بانک مربوطه انجام شده و با فشار enter یا DblClick گرید بسته شده و مقدار یک فیلد دیگر مثل کد در EDit.text قرار گیرد .(مثلا برای نمایش اطلاعات پرسنل معمولا باید بر اساس کد پرسنلی عمل جستجو انجام شود و لی وقتی کاربر کد را نمیداند با فشار یک کلید dbgrid باز شده و با تایپ اول نام خانوادگی جستجو انجام شود -با هر حرفی که تایپ میشود اشاره گر رکورد جابجا شود - و هر وقت کلید Down فشار داده شد فوکوس به گرید منتقل شده و وقتی به نام فرد مورد نظر رسید با فشار Enter یا dblclick گرید کد پرسنلی در EDit قرار گیرد . در ورود اطلاعات مر بوط به پرسنل نیز کاربرد دارد ) برای این چند property لازم است .
Datasource,serched field,returned field,display fields
2- کامپوننت ساده مثل یک MaskEdit که تاریخ را بصورت رشته ای گرفته و در موقع خروج از آن فرمت تاریخ را چک کند .از نظر روز و ماه و سال و....

_alish_
پنج شنبه 11 تیر 1383, 18:42 عصر
رخصت
آقایان من در تاپیک فقط می خواهم در مورد تاپیم مامپوننتها ی تر کیبی بحث کنیم و از شنبه نیز شروع می کنم اگر مبا حث دیگر را علاقمندید ‍تاپیک حدیدی ایجاد کنید تا در مورد آن بحث شود.

_alish_
شنبه 13 تیر 1383, 10:48 صبح
از ساده شروع می کنیم و در مورد اجزا و خصوصیات و پیامهای ویندوز بحث میکنیم تا به طراحی کامپوننت برسیم.
صورت مساله اول:
کامپوننتی طراحی کنیم که درون Edit یک BitBtn قرار داده تا بتوانیم از آن استفاده کنیم
ابتدا از خصوصیات BitBtn بحث میکنیم و بعد edit در آخر شروع به طراحی می کنیم

TBitBtn = class(TButton)
private
FCanvas: TCanvas;
FGlyph: Pointer;
FStyle: TButtonStyle;
FKind: TBitBtnKind;
FLayout: TButtonLayout;
FSpacing: Integer;
FMargin: Integer;
IsFocused: Boolean;
FModifiedGlyph: Boolean;
FMouseInControl: Boolean;
procedure DrawItem(const DrawItemStruct: TDrawItemStruct);
procedure SetGlyph(Value: TBitmap);
function GetGlyph: TBitmap;
function GetNumGlyphs: TNumGlyphs;
procedure SetNumGlyphs(Value: TNumGlyphs);
procedure GlyphChanged(Sender: TObject);
function IsCustom: Boolean;
function IsCustomCaption: Boolean;
procedure SetStyle(Value: TButtonStyle);
procedure SetKind(Value: TBitBtnKind);
function GetKind: TBitBtnKind;
procedure SetLayout(Value: TButtonLayout);
procedure SetSpacing(Value: Integer);
procedure SetMargin(Value: Integer);
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);
message WM_LBUTTONDBLCLK;

_alish_
شنبه 13 تیر 1383, 11:18 صبح
TCanvas Class

این کلاس برای کشیدن اینترفیس و ظاهر بعضی از عناصر مانند image
استاندارد ویندوز یعنی System روی عناصری مانند Edit , Button,ListBox کنترل دارد
اجزای اصلی Canvas
Brush:تعیین رنگ و Patern داخلی(Filling) اشکال و BackGround
معذرت می خوام بقیه را بعدا ادامه میدم کاری پیش آمد از دوستان می خواهم هر کسی تجربیات خودش را بنویسد

_alish_
یک شنبه 14 تیر 1383, 15:37 عصر
سلام(بحث خصوصیات BitBtn)
آنقدر ادامه می دم تا بالاخره یک هم پا در زمینه کامپوننت نویسی پیدا کنم.


TCanvas= برای رسم تصویر در BitBtn استفاده می شود

FStyle= نوعی است که در Style
TButtonStyle = (bsAutoDetect, bsWin31, bsNew);

FKind:نوعی از Kind
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose,
bkAbort, bkRetry, bkIgnore, bkAll);

FLayout : نوع
TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom);

FSpacing:فاصله از تصویر
FMargin:فاصله حاشیه
IsFocused:آیا Focus شود
FModifiedGlyph:آیا Glyph تغییر کرده
FMouseInControl:اشاره گر موس درون کنترل می باشد

_alish_
یک شنبه 14 تیر 1383, 16:13 عصر
بازم سلام (بحث BitMap)


constructor TBitBtn.Create(AOwner: TComponent);
begin
FGlyph := TButtonGlyph.Create; لیستی از تصاویر با اندکسهای مختلف .من که سر در نیاوردیم به چه صورت مقدار میده
TButtonGlyph(FGlyph).OnChange := GlyphChanged;انتساب رویداد
inherited Create(AOwner);
FCanvas := TCanvas.Create;
FStyle := bsAutoDetect;
FKind := bkCustom;
FLayout := blGlyphLeft;
FSpacing := 4;
FMargin := -1;
ControlStyle := ControlStyle + [csReflector];برای تعیین و اضافه کردن مشخصات خاصی به کامپوننت مثلا همین که باعث می شود یک تصویر در محل خاصی از آن خاصی از کنترل
DoubleBuffered := True;اگر در حالت False باشد خو Window Control باعث کشیده شدن تصویر در کنترل می شود که گاهی باعث چشمک زدن تصویر می شود اگر ،True باشد باعث می شود در قسمت از Bitmap حافظه نگاشت شود و یا کشیده شود و بعد Window Control آنرا بر روی کنترل می کشد بطور کلی باعث کاهش چشمک زدن در عمل Repaint Window می شود
end;

A.VAHID
پنج شنبه 18 تیر 1383, 02:12 صبح
ببخشید بدون مقدمه وارد بحثتان شدم
اما در مورد سوال دوستم که خواسته بود به جای کلید Tab برای پرش اجزاء فرم از Enter استفاده شود کد زیر را نوشتم
برای این کار این 5 خط کد را در Event جزء OnkeyPressed قرار دهید و با اجرای برنامه اگر در آن جزء کلید Enter بزنید به جزء بعدی که شماره Tab آن بزرگتر است خواهد رفت
با احترام
ع.و


If Key = Char(VK_RETURN) Then
begin
Key := #0;
PostMessage(Handle,Wm_NextDlgctl,0,0);
end;

ho.yasreby
دوشنبه 31 تیر 1387, 10:59 صبح
ببخشید همینطوری اومدم تو
آقا مهدی اگه جسارت نباشه پیشنهاد میکنم لطفا کامپوننتی طراحی بشه که در اجزاء فرم به جای کلید tab از Enter استفاده کنیم

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

if key=#13 then
begin
key:=#0
PostMessage(Screen.ActiveForm.Handle,WM_NEXTDLGCTL ,0,0)
end


این طرز نوشته بنده با ایشان فرقی دارد و حسنش این است که اگر شما خاصیت keypreviow فرم خود را true کنید و به جای if key=#13 then این if key=#27 then را بنویسید فرم شما با کلید اسکپ بسته می شود شما میتوانید کلیه کلیدهای کیبرد را با کد Asci کنترل کنید برنامه زیر شما را برای بدست آوردن کد اسکی کمک می کند ( البتته این برنامه توسط یکی از اعضای همین سایت نوشته شده است از ایشان تشکر می کنم) و در صورتی که صفر اولی از سمت چپ را یک کنید تب به عقب بر می گردد.

Hadi_Fayyaz
سه شنبه 26 آبان 1388, 03:13 صبح
سلام(بحث خصوصیات BitBtn)
آنقدر ادامه می دم تا بالاخره یک هم پا در زمینه کامپوننت نویسی پیدا کنم.


TCanvas= برای رسم تصویر در BitBtn استفاده می شود

FStyle= نوعی است که در Style
TButtonStyle = (bsAutoDetect, bsWin31, bsNew);

FKind:نوعی از Kind
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose,
bkAbort, bkRetry, bkIgnore, bkAll);

FLayout : نوع
TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom);

FSpacing:فاصله از تصویر
FMargin:فاصله حاشیه
IsFocused:آیا Focus شود
FModifiedGlyph:آیا Glyph تغییر کرده
FMouseInControl:اشاره گر موس درون کنترل می باشد


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