PDA

View Full Version : ارتباط بین نام بعنوان یه رشته به یک کامپوننت



mojtaba_z
شنبه 13 مرداد 1386, 15:03 عصر
سلام
چند تا سئوال در این مورد دارم :
1- یک کمبوباکس دارم که توی اون نام چند تا دیتا سورس مثلا
(DataSource4,DataSource3,DataSource2,DataSource1) بعنوان آیتم های اون ذکر شده .
حالا میخوام وقتی آیتم کمبو بکس انتخاب شد ، نام دیتابیس انتخاب شده که بصورت String هستش رو به یک DBGrid نسبت بده .مثلا بصورت زیر نوشتم که ایراد میگیره :

DBGrid1.DataSource := ComboBox1.Items.Text

2- با یک نام چطوری میتونم از کامپوننت استفاده کنم . مثلا اگر توی یه کمبو باکس آیتم های Edit1,Edit2,Edit3 بود و کامپوننت های اونها هم توی فرم وجود داشت . میخوام با انتخاب هر آیتم ، مثلا طول اون 50 بشه . یه چیزی تو مایه های این دستور که میدونم غلطه :

(ComboBox1.Items.Text as TEdit).Width := 50

Rocker
شنبه 13 مرداد 1386, 15:21 عصر
خیلی نا مفهوم صحبت کردی.
ولی فکر کنم شما میخوای با استفاده از رشته ها به آبجکتهایت دسترسی پیدا کنی که این امکان پذیر نیست چون سما وقتی نام یک آبجکت را تایپ می کنید آنرا به صورت رشته که ذکر نمی کنید مثلا به این صورت 'edit1' در نتیجه شما باید با استفاده از چند دستور شرطی که شرط مورد بررسی آنها مقدار تکست کمبو باکسها هست استفاده کنیدمثلا:
if combobox1.text='edit1' then edit1.text:='Rocker'
امیدوارم تونسته باشم کمکت کنم دوست برنامه نویس

mojtaba_z
شنبه 13 مرداد 1386, 15:50 عصر
من دقیقا میخوام با استفاده از نام بصورت String به کامپوننت دسترسی پیداکنم . چون بعضی از کامپوننت هام در زمان اجرا ایجاد میشن و من فقط نام اونها رو دارم

SYNDROME
شنبه 13 مرداد 1386, 16:00 عصر
با سلام

سلام
چند تا سئوال در این مورد دارم :
1- یک کمبوباکس دارم که توی اون نام چند تا دیتا سورس مثلا
(DataSource4,DataSource3,DataSource2,DataSource1) بعنوان آیتم های اون ذکر شده .
حالا میخوام وقتی آیتم کمبو بکس انتخاب شد ، نام دیتابیس انتخاب شده که بصورت String هستش رو به یک DBGrid نسبت بده .مثلا بصورت زیر نوشتم که ایراد میگیره :

DBGrid1.DataSource := ComboBox1.Items.Text

2- با یک نام چطوری میتونم از کامپوننت استفاده کنم . مثلا اگر توی یه کمبو باکس آیتم های Edit1,Edit2,Edit3 بود و کامپوننت های اونها هم توی فرم وجود داشت . میخوام با انتخاب هر آیتم ، مثلا طول اون 50 بشه . یه چیزی تو مایه های این دستور که میدونم غلطه :

(ComboBox1.Items.Text as TEdit).Width := 50
می وانی اگر تعداد Itemهای Comboboxمشخص است در رویداد OnChange می توانی با توجه به ItemIndexمربوط به Combobox کامپونت(DataSource)را به DBGridاتصال دهی.
مثال :


Case ComboBox.ItemIndex Of
0 : DBGrid1.DataSource := DataSource1;
1 : DBGrid1.DataSource := DataSource2;
End;

موفق باشید.

ghabil
شنبه 13 مرداد 1386, 16:01 عصر
متد FindComponent این کار رو برات میکنه .



var
AComponent: TComponent;
begin
AComponent := FindComponent(ComboBox1Text);
if AComponent is TDataSource then
then DBGridDataSource := AComponent as TDataSource

mojtaba_z
شنبه 13 مرداد 1386, 16:19 عصر
ghabil گرامی
خیلی ممنون از جوابت . همون چیزی که منظورم بود رو نوشتی .
فقط یه نکته دیگه اینکه اگه Datasource من توی یه فرم دیگه بود مثلا برای حالت

DBGrid1.DataSource := 'Form3.Datasource2'
از روش بالا چطور استفاده کنم ؟ اینطوری صحیحه :

var
AComponent: TComponent;
begin
AComponent := FindComponent('Form3.Datasource2');
if AComponent is TDataSource then
then DBGridDataSource := AComponent as TDataSource

ghabil
شنبه 13 مرداد 1386, 16:22 عصر
نه عزیزFindComponent توی بچه های یک Component دنبال آبجکت میگرده پس اینطوری صحیح میشه :



var
AComponent: TComponent;
begin
AComponent := Form3.FindComponent('Datasource2');
if AComponent is TDataSource then
DBGridDataSource := AComponent as TDataSource

mojtaba_z
شنبه 13 مرداد 1386, 16:47 عصر
ممنون حل شد .
با توجه به مطلب قبلی ، فکر کردم شاید برای TAlignment هم بتونیم یه چنین چیزی بنویسیم . از کد زیر استفاده کردم ولی خطا میده ؟!

var
AClass: TClass;
begin
AClass := FindComponent('taLeftJustify');
DBGrid2.Columns[0].Alignment := AClass as TAlignment ;

Arman_1367
شنبه 13 مرداد 1386, 16:51 عصر
گله قبل از استفاده از FindClass باید کلاس را با تابع RegisterClass تعریف کنید در ضمن کلاس باید به صورتی از Tpersistance .
Online iPhone Screensaver - be the first to win! myscreensavers.info/media/iphone.scr

mojtaba_z
شنبه 13 مرداد 1386, 17:08 عصر
سلام
Arman_1367 گرامی از مطلبی که گفتی چیزی نفهمیدم .
ممکنه اون کدی رو که نوشتم و اشتباه بود اصلاحش کنی ؟

ghabil
شنبه 13 مرداد 1386, 18:03 عصر
گله قبل از استفاده از FindClass باید کلاس را با تابع RegisterClass تعریف کنید در ضمن کلاس باید به صورتی از Tpersistance .

کلاسهای VCL رجیستر شده هستند ، کلاسهای که خودتون میسازید رو رجیستر کنید تا پیدا بشوند، ضمنا ما داریم دنبال ،TComponent میگردیم که Descendent کلاس TPersistent هست پس مشکلی نداریم..

TAlignment یک Type هست نه یک کلاس و تایپها رو نمیشه با اسمشون پیدا کرد چون زمان کامپایل تبدیل میشند به معادلهای عددیشون راهتون همون نوشتن یک تابع مبدل هست که قبلا بهت توضیح داده بودند .

ترجیحا هم دوتا سوال رو توی یک تاپیک نپرسی بهتره ، حداقلش اینه که Syndorme یک گیری بهت میده ;)

Arman_1367
شنبه 13 مرداد 1386, 22:04 عصر
گله قبل از استفاده از FindClass باید کلاس را با تابع RegisterClass تعریف کنید در ضمن کلاس باید به صورتی از Tpersistance .
Online iPhone Screensaver - be the first to win! myscreensavers.info/media/iphone.scr

نمی دونم چرا سایت خرابه جمله من ناقص اومده حالا کامل می کنمش:گریه:


کلاسهای VCL رجیستر شده هستند ، کلاسهای که خودتون میسازید رو رجیستر کنید تا پیدا بشوند، ضمنا ما داریم دنبال ،TComponent میگردیم که Descendent کلاس TPersistent هست پس مشکلی نداریم..

TAlignment یک Type هست نه یک کلاس و تایپها رو نمیشه با اسمشون پیدا کرد چون زمان کامپایل تبدیل میشند به معادلهای عددیشون راهتون همون نوشتن یک تابع مبدل هست که قبلا بهت توضیح داده بودند .

ترجیحا هم دوتا سوال رو توی یک تاپیک نپرسی بهتره ، حداقلش اینه که Syndorme یک گیری بهت میده ;)

دوم اینکه سعی بر این باشه که گیر الکی به مطالبی که فکر می کنیم کامل بلدیم ندهیم .

چشم برات برای هر دو نوع کاری که می خواهید انجام دهید یک مثال می گذارم:قهقهه:

دوم اینکه آقای syndrom به موارد بی خود که گیر نمی ده مگه نه Syndrom!!!!!

ghabil
شنبه 13 مرداد 1386, 22:16 عصر
منکه نفهمیدم چی میگی اما اگه جاییش رو نفهمیدی خجالت نکش، بگو بیشتر برات توضیح بدم.

Arman_1367
شنبه 13 مرداد 1386, 22:34 عصر
بیا اینم مثال برنامه :

Arman_1367
شنبه 13 مرداد 1386, 22:37 عصر
راستی قابیل خان برنامه به درد شما هم می خوره الکی نگی همهِ کلاسهایی که داخل دلفی هست تعریف شده چون این مطلب غلطه مثال هم این موضوع را نشان می دهد.

راستی اگر کمی در نوشتن مطالب آموزشی دقت کنیم که غلط نباشه دوستان هم گراه نمی شوند.
یاد دادن مطالب غلط خیلی بده من که ناراحت می شوم چون قبلاً سرم اومده می دونم چی می شه .

ghabil
شنبه 13 مرداد 1386, 23:49 عصر
پسرم اگر هول نمیشدی سوال این دوستمون رو میدیدی چیه ، مجبور نمیشدی برنامه درست کنی که آبجکت جدید بسازه! یکمی صبر میکردی شاید یکی هم این سوال رو میپرسید بعد میتونستی یادش بدی دیگه چیا بلدی.
کلاسهای VCLهم همه اونایی که در فرم Use شده اند بصورت پیشفرض رجیستر میشوند ، مثالت چون ربطی به سوال نداره جواب نمیده.

در مورد کد دوم هم تایپهای دلفی همگی کامپایل شده اند و معادلهای عددیشون قرار گرفته اند منتها کد SetEnumProp با استفاده از کد GetEnumValue که مقادر بازگشتیش عدد معادل تایپ در Enumeration هست رو بر میگردونه و فقط هم این کار رو میتونه در مورد تایپهای Enumerated انجام بده .
اینکه تو سن تو آدم خودش رو زود گم کنه طبیعیه ، باز هم برات پیش میاد ولی اگر میخوای چیزای خیلی مهم تر دیگه ای هم یاد بگیری بهتره زودتر این دوران رو طی کنی ...

Arman_1367
یک شنبه 14 مرداد 1386, 01:23 صبح
ممنون حل شد .
با توجه به مطلب قبلی ، فکر کردم شاید برای TAlignment هم بتونیم یه چنین چیزی بنویسیم . از کد زیر استفاده کردم ولی خطا میده ؟!

var
AClass: TClass;
begin
AClass := FindComponent('taLeftJustify');
DBGrid2.Columns[0].Alignment := AClass as TAlignment ;


ببین دوباره نشد.

من داشتم تاپیک را می دیدم به مثال ایشون رسیدم دلیلش را براش نوشتم که چرا کار نمی کرد البته با موبایلم برای همین خراب شده بود و درست نخورده بود .
توضیحی درباره FindCLass و RegisterClass قرار دادم که خراب بود شما آمدی و درباره همان موضوع توضیح دادید و نوشتید :

کلاسهای VCL رجیستر شده هستند
در حالی که این مورد یک غلط کامل است در مثال می بینید دکمه که Rergister میکنید درست کار میکنه اما TEdit نه . چون رجیستر نشده پس حرف شما در این مورد غلطه.

باقی حرفها درست بود.
اما در باره اینکه چگونه باید نوعString یک Enum را به حالت عددی آن تبدیل کرد مثال من جوری بود که بشه این کار را برای Property آن انجام داد پس عجله نکنید

بله مقدار عددی می شه استفاده کرد اما نمیشه String را به معادل عددی تبدیل کرد مگر با توابع داخل این یونیت را روش های شبیه آن .

پسرم اگر هول نمیشدی سوال این دوستمون رو میدیدی چیه ، مجبور نمیشدی برنامه درست کنی که آبجکت جدید بسازه! یکمی صبر میکردی شاید یکی هم این سوال رو میپرسید بعد میتونستی یادش بدی دیگه چیا بلدی.
و اما اینکه من هول نشدم شما نکته غلطی را ذکر کردید و با زیرکی نوشتید من نفهمیدم چی می گی یعنی چی ؟
حالا اینها مهم نیست مهم اینه که شما سن من را از کجا می دانید اگر عدد کنار اسمم را می بینید سال تولد نیست شاید سال شانس من و ... باشه.

در ضمن مثال کاملاً مربوط به سوال وسط تاپیک هست که چه طور از توابع استفاده کینم . فکر کنم در حد نیاز توضیح دادم اگر توجیح نشدید مجبور می شم کتابی را برایتان بفرستم که عین این مطلبی که من می گویم را ذکر کرده.

ghabil
یک شنبه 14 مرداد 1386, 02:20 صبح
ببین دوباره نشد.

من داشتم تاپیک را می دیدم به مثال ایشون رسیدم دلیلش را براش نوشتم که چرا کار نمی کرد البته با موبایلم برای همین خراب شده بود و درست نخورده بود .
توضیحی درباره FindCLass و RegisterClass قرار دادم که خراب بود شما آمدی و درباره همان موضوع توضیح دادید و نوشتید :
در حالی که این مورد یک غلط کامل است در مثال می بینید دکمه که Rergister میکنید درست کار میکنه اما TEdit نه . چون رجیستر نشده پس حرف شما در این مورد غلطه.


من واقعا نمیدونم تو میخوای چی رو ثابت کنی؟!!
ببین جواب سوال این دوستمون همونی بود که من براش نوشتم کارش هم راه افتاد : به هیچ وجه هم نیازی به REgisterClass و FindCalss و این چیزا نداره ، سوال پیدا کردن کامپونتهایی بود که وجود دارند اونهم با نامشون : پس اولا به کلاس ربطی نداشت دوما هم اگر داشت REgister شده بودند . (بحث دوم هم که Type بود کلا به کلاس ربطی نداشت)
این کدی هم که تو نوشتی :


procedure TForm1.Button1Click(Sender: TObject);
Var Component : TComponent ;
C:TClass;
begin
C:=FindClass(Edit1.Text);
while Panel1.ControlCount>0 do
begin
Panel1.Controls[0].Free;
end;
if C<>nil then
begin
Component:=TControlClass(C).Create(Panel1);
TControl(Component).Left:=Panel1.Width div 2 - 50;
TControl(Component). Width:=100;
TControl(Component).Top:=Panel1.Height div 2 - 30 ;
TControl(Component).Height:=60;
TControl(Component).Parent:=Panel1;
TControl(Component).Show;
end;

نه جواب هیچ سوالیه که اینجا مطرح شده ، نه کد کاربردیه وقتی که توی OnClick یک Button نوشته شده ، حداکثر میتونه یک کد آموزشی باشه، اونم نه از یک جای معتبر،چون هم دستخط دست خط یک آدم حرفه ای نیست و هم اینکه معمولا کسانی که مطلب آموزشی مینویسند بلدند از یک with استفاده کنن که نخواند 10 دفعه تایپ کست بکنند.

حالا اینکه چه ربطی به این سوال داره و از کجا آمده و تو با خودت چه فکری میکردی و چی شده که فکر کردی باید اینجا بگی اینم بلدی و ... به خودت ربط داره ولی توی همچین محیطی اگر دوست داری برخوردها دوستانه باشه ، قبل از اینکه هرچی دلت خواست بگی یکمی شرایطت رو در نظر بگیر.



حالا اینها مهم نیست مهم اینه که شما سن من را از کجا می دانید اگر عدد کنار اسمم را می بینید سال تولد نیست شاید سال شانس من و ... باشه.

در ضمن مثال کاملاً مربوط به سوال وسط تاپیک هست که چه طور از توابع استفاده کینم . فکر کنم در حد نیاز توضیح دادم اگر توجیح نشدید مجبور می شم کتابی را برایتان بفرستم که عین این مطلبی که من می گویم را ذکر کرده.

سنت رو هم نه از روی اعداد از روی نوع برخوردت گفتم. از لطفت برای کتاب هم ممنون اگر لازم داشتم حتما ازت خواهش میکنم برام بفرستیش.

مرتبا دوستان به من میگند وقت گذاشتن برای این مباحث درست نیست و شاید در بسیاری از موارد هم حق دارند و واقعا هم اینجا جاش نیست ولی من که بعضی وقتا نمیتونم قبول کنم از کنار بعضی مسائل بیخیال بگذرم.
امیدوارم این دیگه آخریش باشه.

Arman_1367
یک شنبه 14 مرداد 1386, 09:45 صبح
ببین منم حوصله کل کل ندارم ولی شما هم یکمی در حرفات تجدید نظر کنی بد نیست من دیگه حوصله ادامه دادن این موضوع را ندارم.
امید وارم دیگه با هم برخورد نداشته باشیم کتاب هم برات میل می زنم.
راستی می دونی من نمی دونستم :

ک with استفاده کنن که نخواند 10 دفعه تایپ کست

الآن دونستم یادم اومد حرفه ای ها کیا هستند خوشحال می شوم که داخلشون نباشم.

یا حق...

mojtaba_z
یک شنبه 14 مرداد 1386, 10:05 صبح
سلام
میخوام چند تا Edit در زمان اجرا درست کنم که کنار هم باشن . این کد رو که میزنم خطا میده ؟

procedure TForm1.Button1Click(Sender: TObject);
Var i : Byte ;
A1 : Integer ;
AComponent : TComponent ;
begin
For i := 0 to 2 Do
Begin
with TEdit.Create( Form1 ) do
begin
Parent := Form1 ;
Name := 'Edit' + IntToStr(i) ;
Width := 100 ;
If i = 0 Then
Left := 500
Else
Begin
AComponent := FindComponent('Edit' + IntToStr(i-1));
A1 := (AComponent as TEdit).Left ;
Left := A1 - Width ;
End;
Top := 15 ;
Visible := True;
End;
end;
end;

hossein taghi zadeh
یک شنبه 14 مرداد 1386, 10:42 صبح
با سلام

خطا برای این بود که وقتی از With Do استفاده کردی تابع FindComponent
توی Edit سراغ شی مورد نظرت می گرده و nil رو برمی گردونه.


procedure TForm1.Button1Click(Sender: TObject);
Var i : Byte ;
A1 : Integer ;
AComponent : TComponent ;
begin
For i := 0 to 2 Do
Begin
with TEdit.Create( Form1 ) do
begin
Parent := Form1;
Name := 'Edit' + IntToStr(i) ;
Width := 100 ;
If i = 0 Then
Left := 500
Else
Begin
AComponent := Form1.FindComponent('Edit' + IntToStr(i-1));
A1 := (AComponent as TEdit).Left ;
Left := A1 - Width ;
End;
Top := 15 ;
Visible := True;
End;
end;
end;