PDA

View Full Version : Edit پویا و رخداد on change



narsiss
جمعه 27 شهریور 1388, 11:50 صبح
وقتی یک Edit پویا ایجاد می کنم، چه طور می تونم به رخداد onchange اون دسترسی پیدا کنم؟
وقتی نام edit رو تایپ می کنم، onchange جزو Property های اون هست و نه Event هاش

homayoon_fara
جمعه 27 شهریور 1388, 12:01 عصر
به راحتی این کار قابل اجراست

شما یک procedure میسازی و کدهاتو توش مینویسی. و فقط کافیه که بعد از اینکه edit رو ساختی به edit بگی که در موقع onchange از کدوم procedure استفاده کنه:



type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure YourProcedure(Sender: TObject);// ***** your Procedure *****
private
{ Private declarations }
public
{ Public declarations }
end;

procedure TForm1.Button1Click(Sender: TObject);
var e:TEdit;
begin

e:=TEdit.Create(Self);
e.Parent:=Form1;
e.Top:=30;
e.Left:=30;
e.Name:='MyEdit';
e.OnChange:=YourProcedure;

end;

procedure TForm1.YourProcedure(Sender: TObject);
begin
beep;
end;

narsiss
جمعه 27 شهریور 1388, 13:12 عصر
ممنون از راهنماییتون....ولی اگه بخوام مقدار Text اون edit پویا رو هنگام Onchange خودش به یک edit ثابت تخصیص بدم باید چه جوری به اون مقدار در procedure دسترسی پیدا کنم؟

homayoon_fara
جمعه 27 شهریور 1388, 13:52 عصر
برای این کار هم 2 تا راه و جود داره:
1. به جای اینکه متغیرت رو به صورت محلی (local) تعریف کنی ، اون رو به صورت سراسری (global) تعریف کنی به این شکل:


type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure YourProcedure(Sender: TObject);// ***** your Procedure *****
private
{ Private declarations }
Public
var e:TEdit; //******* Ta'rife moteghayer e global ******
{ Public declarations }
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
e:=TEdit.Create(Self);
e.Parent:=Form1;
e.Top:=30;
e.Left:=30;
e.Name:='MyEdit';
e.OnChange:=YourProcedure;
end;

procedure TForm1.YourProcedure(Sender: TObject);
var s:String;
begin
e.Text:='Some Text';
s:=e.Text;
end;


2. یا اینکه به جای مرحله قبل در داخل پروسیجر onchange از کد زیر استفاده کنین:


procedure TForm1.YourProcedure(Sender: TObject);
var s:String;
begin
TEdit(Sender).Text:='Some Text';
s:= TEdit(Sender).Text;
end;

که از لحاظ CPU Load مرحله دوم پروسس بیشتری رو به cpu وارد می کنه. چون هر بار که پروسیجر اجرا میشه ، هر بار که اجرا به TEdit(Sender) برسه یک بار باید این Edit توسط برنامه Find بشه.

narsiss
دوشنبه 30 شهریور 1388, 12:32 عصر
با استفاده از یک حلقه تعدادی Edit پویا ایجاد می کنم

procedure TForm1.Button1Click(Sender: TObject);
VAR
edit:TEdit;
d,i:integer;
begin
d:=0;
for i:=0 to n do
begin
edit:=TEdit.Create(TabSheet3);
edit.Parent:=TabSheet3;
edit.Top:=31+d;
edit.Left:=16;
edit.Width:=105;
edit.OnChange:=inv;
d:=d+30;
end;
end;

در پروسیجری که در Onchange اونEdit فراخوانی می کنم
Tedit.text رو در text یک edit ثابت می ریزم

procedure TForm1.inv(sender:tobject);
begin
Edit14.Text:=TEdit(sender).Text;
end;
اگه بخوام هر بار که مقدار edit های پویا تغییر می کنه اون مقدار با مقدار edit قبلی جمع بشه و در edit14 ریخته بشه(برای صورتحساب استفاده می کنم)باید چه کار کنم؟

homayoon_fara
سه شنبه 31 شهریور 1388, 12:44 عصر
سلام

تمامی مواردی که در بالا ذکر شده را در یک برنامه نوشتم که در ضمیمه می تونی دانلودش کنی

امیدوارم مفید واقع بشه

vcldeveloper
چهارشنبه 01 مهر 1388, 15:35 عصر
که از لحاظ CPU Load مرحله دوم پروسس بیشتری رو به cpu وارد می کنه. چون هر بار که پروسیجر اجرا میشه ، هر بار که اجرا به TEdit(Sender) برسه یک بار باید این Edit توسط برنامه Find بشه.
همچین چیزی نیست. به اون کار میگن Type-Cast کردن. در اون حالت شما به کامپایلر میگید با این متغیر به عنوان یک TEdit رفتار کن. هیچ جستجوی روی کامپوننت ها برای پیدا کردن Edit صورت نمیگیره. اگر کاربر می نوشت Sender as TEdit اون وقت کامپایلر ابتدا چک می کرد که آیا Sender واقعا از کلاس TEdit مشتق شده یا نه. باز در اون صورت هم جستجویی برای پیدا کردن شی Edit مربوطه صورت نمی گرفت. تصور شما از Type-Cast اشتباه هست.