PDA

View Full Version : دستيابي به کنترلهاي يک فرم


Dokht Esmati
12 October 2005, 03:51 AM
این سوالیه که یکی از دوستان به این سورت پرسیدن :
«بعضي مواقع لازم است که به کليه کنترلهاي که بر روي يک فرم قرار دارد دسترسي يابيم چه روشي را براي آن پيشنهاد مي کنيد؟»
اولین چیزی که به زهنِ آدم میرسه اینه که :
«اگه اسمِ يک کنترل رو داشته باشيد (که حتمن داريد) ميتونيد هر کاري روش انجام بديد. اگر هم اسم نداشتيد ، با داشتنِ Handle از يک پنجره ، مي تونيد هر کاري روي اون انجام بديد.»

اما باز این سوال مترح میشه :
«بعضي مواقع ما نمي دونيم چند تا کنترل روي فرم داريم .مثلا فرض کنید کاربر اين قابليت رو داره که به فرم کنترل اضاف کنه»

راهِ هلی که به زهنِ من میرسه اینه:
یه آرایه از نوعِ Handle بوجود میاریم. و همون لهزه ای که یک کنترل رو بوجود میاریم ، Handle ِ اون کنترل رو توی اون آرایه زخیره می کنیم.

برای مسال یک فایل رو پیوست کردم (برای استفاده باید پسوندِ اون رو به ZIP تغییر بدید.) (مسال برای دلفی آورده شده ولی الگوریتمِ کار یکی هستش.)

این هم متنِ برنامه :
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
SpinEdit1: TSpinEdit;
Edit1: TEdit;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,j:integer;
// A Dynamic Array of Handle. For Saving New Buttons Handle.
btnHandleList:array of Thandle;
implementation
{$R *.dfm}
{$R WindowsXP.res}
procedure TForm1.Button1Click(Sender: TObject);
var
btn:TButton;
begin
//Creating A Windows With Form1 As Parent
btn:=TButton.Create(form1);
btn.Parent:=form1;
//Setting The Button Appearance
With btn do
begin
height:=25;
width:=60;
top:=85+i; //Using "i" For Good Locating.
left:=20;
Caption:='Number '+inttostr(j); // Using "j" for Good Naming.
end;
//Increasing "I" , for Good Locating.
inc(i,btn.height);
//Increasing "J" , for Good Locating and Saving Handles List.
inc(j);
// Saving Handles List :
SetLength(btnHandleList,j+1); // Setting The Length of The Array
btnHandleList[j]:=btn.Handle;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
j:=0;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
//Chaging The Control , Using The Handle.
// For Example The Caption :
SetWindowText(btnHandleList[spinedit1.Value],pchar(edit1.Text));
end;
end.


خاهش میکنم که حقِ کپی رو رآیت کنید (تنها با زکرِ نامِ سایت و لینکِ این سفهه)

GhAeM
12 October 2005, 10:51 AM
ميشه يه نمور بيشتر توضيح بديد!
اين چيكار ميكنه!

Dokht Esmati
13 October 2005, 01:15 AM
اگه برنامه رو اجرا کنید متوجه میشید.
فرز کنید برنامه ای نوشتید که کاربر توی اون میتونه کلیدها یا چیزای دیگه ای رو به فرم ازافه کنه.
با این کار شما هیچ نام یا Handleی از اون کنترلِ ازافه شده ندارید. تا بتونید مسلن برچسبِ اون رو اوز کنید.
این برنامه ، لیستِ Handle ها رو زخیره میکنه و شما با استفاده از اون لیست ، میتونید به کنترل های جدید دسترسی داشته باشید.