ورود

View Full Version : سوال: چطور می تونم یه TEdit تو کامپوننتم بذارم؟



mbshareat
پنج شنبه 03 تیر 1389, 11:06 صبح
من می خوام چیزی مثل TSpinEdit داشته باشم:بامزه: اما ظاهر کامپوننتم رو خودم طراحی کنم
می خوام یه TEdit تو کامپوننتم بذارم که تو KeyPress اون این کد رو داشته باشم:

If Pos(Key,#27#13#8#9) =0 then
If (Key<#48) or (Key>#57) then
Key:=#0کد بدون بررسی کارکتر وارد شده در TEdit رو اینطور نوشتم:

unit XNum;

interface

uses
Windows, Messages, SysUtils, Classes
, Controls, StdCtrls,Graphics;

type
TXNum = class(TGraphicControl)
private
{ Private declarations }
NumEdit:TEdit;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); Override;
destructor Destroy;Override;
published
{ Published declarations }
end;

procedure Register;

implementation
Var
LastNum:String;
constructor TXNum.Create(AOwner: TComponent);
begin
inherited;
NumEdit:=TEdit.Create(AOwner);
NumEdit.Parent:=Self.Parent;
NumEdit.Left:=3;
NumEdit.Top:=3;
NumEdit.Width:=100;
NumEdit.Height:=100;
NumEdit.Font.Name:='Tahoma';
NumEdit.Font.Size:=8;
NumEdit.Font.Color:=ClGreen;
NumEdit.Visible:=true;
end;
destructor TXNum.Destroy;
begin
inherited;
end;
procedure Register;
begin
RegisterComponents('Bagher', [TXNum]);
end;

end.
البته مخفی نماند که اشکال می گیرد:
http://barnamenevis.org/forum/F:%5CDocuments%20and%20Settings%5CShariyat%5CDeskt op%5Ca.bmp
من نمی دونم کجا باید کد بررسی کلیدها رو قرار بدم
اگه یه نمونه کد برام بذارین که کامپوننتی باشه که کادر متن داشته باشه و کد اولم رو هم داشته باشه ممنون می شم!

vcldeveloper
پنج شنبه 03 تیر 1389, 18:11 عصر
البته مخفی نماند که اشکال می گیرد
خب، اشکالی که گرفت چی بود؟

چرا از TGraphicControl به عنوان کلاس والد استفاده کردید؟


من نمی دونم کجا باید کد بررسی کلیدها رو قرار بدم
دو راه دارید، اول اینکه به جای استفاده از TEdit، خودتون یک کلاس از TCustomEdit مشتق کنید، و متد KeyPress آن را Override کنید، و کد خودتان را در آنجا قرار بدید، و از آن کلاس در داخل کامپوننت خودتان استفاده کنید.
دوم اینکه از همین TEdit استفاده کنید، و در کلاس خودتان یک Event-handler برای رویداد OnKeyPress آن بنویسید، و این Event-handler را در زمان ساخت کامپوننت، به کنترل Edit آن اختصاص بدید.

bootshow
پنج شنبه 03 تیر 1389, 18:27 عصر
شما به کل راهو اشتباه رفتید باید کامپوننتو از TEdit به ارث میبردی و رویداهای اونو هندل کنی و سپس اونو به رویداد پدر بفرستید.

tdkhakpur
پنج شنبه 03 تیر 1389, 18:49 عصر
شما به کل راهو اشتباه رفتید

ایشان راهشان درسته فقط قصد دارند تعدادی از پیغامهای صفحه کلید را فیلتر کنند و بهترین راه تغییر مسیر window proc به متد خودشان هست .
ولی به نظرم دلیل اینکه از TGraphicControl مشتق گرفته اند به این خاطر باشد که خواسته اند کادر مربوط edit را داشته باشند.
ولی ایجاد edit داخل postion کنترل جاری کار اشتباه هست و اگر قصد دارند که editor شخصی برای خودشان طراحی کنند باید از TCustomEdit مشتق گرفته و onKeyPres را مجددا برنامه نویسی کنند همانطور که آقای کشاورز توضیح دادند.

vcldeveloper
پنج شنبه 03 تیر 1389, 21:50 عصر
ولی به نظرم دلیل اینکه از TGraphicControl مشتق گرفته اند به این خاطر باشد که خواسته اند کادر مربوط edit را داشته باشند.
TGraphicControl والد کنترل های بدون پنجره هست، مثل Label یا TImage. برای کنترل هایی مثل Edit باید از TWinControl یا مشتقات آن استفاده کرد.

mbshareat
جمعه 04 تیر 1389, 11:22 صبح
از همه دوستان ممنونم.:خجالت:
راستش من زیاد وارد نبودم نمی دونستم TwinControl قابلیتهای مورد نظر من از TGraphicControl رو داره.:لبخندساده:
در ضمن به نظر من برای مبتدیها بهترین راه یادگیری کامپوننت نویسی رفتن سراغ کامپوننتهای Jans است که می تونه آموزش خوبی به آدم بده چون کامپوننتهای ساده تر و قابل فهمی ارائه می ده:)JanBasic-TjanButtonEdit:لبخند:
http://jansfreeware.com/jfdelphi.htm
شبیه سازی کامپوننت توسط خودم رو هم می ذارم.

در ضمن متوجه نشدم فایلی که دوستمون برام گذاشته چه چیزی رو به من نشون می ده .
در هر صورت از همه برادرانی که لطف کردند جواب دادند ممنوم.:تشویق:
-----------
راویتی از امام صادق (ع):
کسانی که به خاطر گناهانشان میمیرند بیش از کسانی هستند که بر اثر رسیدن اجلشان میمیرند و آنانکه به سبب احسان کردن عمر (طولانی) می کنند بیش از کسانی هستند که بواسطه عمر طبیعی زندگی می کنند.
(مستدرک الوسائل ج11 ص 327 (نقل از برنامه 810 حدیث

tdkhakpur
جمعه 04 تیر 1389, 13:09 عصر
فونت imageو Edit را باید یکی در نظر بگیرید و همیشه از آن فونت استفاده کنید تا داخل صفحه به درستی نماش داده شدود.
و اینکه برای اینگونه کارها از تغییرات تصاویر استفاده کنید نه برنامه نویسی تصاویر - شما در بالا برای روشن و خاموش کردن جهت حرکت ازpolygon استفاده کردید که هم سرعت را پایین می آورد و هم برنامه نویسی را کند میکند در صورتی که میتوانستید به جای کدهای فوق سه image داشته باشید یکی در حالت عادی و دومی در حالت کلیک بالا و سومی در حالت کلیک پایین و با توجه به عملیات ماوس بین تصاویر سویچ کنید.

bootshow
جمعه 04 تیر 1389, 18:28 عصر
type
TXNum = class(Tedit)
private
FOnKeyPress: TKeyPressEvent;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); Override;
destructor Destroy;Override;
published
procedure keyprees(Sender: TObject; var Key: Char);
procedure DefaultHandler(var Message); override;
function DoKeyPress(var Message: TWMKey): Boolean;
end;

procedure Register;

implementation


constructor TXNum.Create(AOwner: TComponent);
begin
inherited;
Left:=3;
Top:=3;
Width:=100;
Height:=100;
Font.Name:='Tahoma';
Font.Size:=8;
Font.Color:=ClGreen;
Visible:=true;
OnKeyPress:=keyprees;
end;

destructor TXNum.Destroy;
begin
inherited;
end;

procedure TXNum.DefaultHandler(var Message);
begin
with TMessage(Message) do
case Msg of
wm_char: DoKeyPress(TWMKey(Message));
end;
inherited;
end;

procedure TXNum.keyprees(Sender: TObject; var Key: Char);
begin
If Pos(Key,#27#13#8#9) =0 then
If (Key<#48) or (Key>#57) then
Key:=#0;
end;

procedure Register;
begin
RegisterComponents('Bagher', [TXNum]);
end;


function TXNum.DoKeyPress(var Message: TWMKey): Boolean;
var
Ch: Char;
begin
with Message do
begin
Ch := Char(CharCode);
keyprees(self,Ch);
CharCode := Word(Ch);
if Char(CharCode) = #0 then Exit;
end;
Result := False;
end;
تو این کد نحوه درست ایجاد کلاس برای استفاده از رویداد onkeypress نوشته شده.با این کلاس هم رویداد onkeypress کامپوننت اجرا میشه هم رویدادی که کاربر بصورت سفارشی برای کامپوننت میخواهد برنامه بنویسد

vcldeveloper
جمعه 04 تیر 1389, 23:14 عصر
تو این کد نحوه درست ایجاد کلاس برای استفاده از رویداد onkeypress نوشته شده.با این کلاس هم رویداد onkeypress کامپوننت اجرا میشه هم رویدادی که کاربر بصورت سفارشی برای کامپوننت میخواهد برنامه بنویسد
لزومی نداشت که خودتون یک Message handler برای این کار بنویسید، بلکه همانطور که در پست قبلی هم اشاره کردم، کنترل ها خودشان یک متد KeyPress دارند که به طور خودکار، با دریافت WM_CHAR فراخوانی میشه، و رویداد OnKeyPress را فراخوانی میکنه. برای همچین کاری، کافی بود که متد KeyPress کنترل مربوطه Override بشه، همین:

TMyEdit = class(TCustomEdit)
protected
procedure KeyPress(var Key: Char); override;
end;

...

procedure TMyEdit.KeyPress(var Key: Char);
begin
if not (Key in [#27,#13,#8,#9]) then
begin
if (Key<#48) or (Key>#57) then
Key :=#0;
end;

inherited;
end;

mbshareat
یک شنبه 06 تیر 1389, 07:25 صبح
از tdkhakpur ممنونم اما من اصلا چیزی تو TImage ننوشتم در ضمن Polygon یه دستور بسیار سریعه که فکر کنم اگه صدها پیکان کوچولو هم بهش بدیم بی مشکل سرعت ترسیم می کنه:لبخند: و چون تصویر پیچیده ای نبود از ترسیم دستوری استفاده کردم!:چشمک:
(البته مخفی نمونه من بلد نیستم در فایل res بیت مپ 24 بیت و gif وغیره بریزم و تو کامپوننت استفاده کنم:لبخندساده:)