PDA

View Full Version : استفاده بهینه از Index در دلفی



persia_hrn
سه شنبه 22 مرداد 1392, 02:20 صبح
سلام دوستان

من این کد رو برای تعریف ایندکس ابزار توی فرم پیدا کردم ولی خیلی داغونه !

به فرض اینکه یک Button ، یک Panel و یک Memo داشته باشیم و بخوایم براشون ایندکس تعریف کنیم :


procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.ComponentIndex:=0;
Panel1.ComponentIndex:=1;
Memo1.ComponentIndex:=2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
(Self.Components[0] as Tbutton).Caption:='Reza';
(Self.Components[1] as TPanel).Color:=clRed;
(Self.Components[2] as TMemo).SetFocus;
end;

چندتا سوال دارم در این زمینه اگه کسی کمک کنه ممنونش میشم :قلب:

1- راه بهتر و آسونتری وجود داره واسه ایندکس کردن آبجکت ها ؟! * سوالو داشتی ؟ :قهقهه: *
2- راهی نیست که نخوایم یکی یکی آبجکت هارو با ComponentIndex مقداردهی کنیم ؟ توی زمان دیزاین فرم نمیشه اتوماتیک بهشون ایندکس داد ؟
3- اگه راه دیگه ای نداره چطور میشه توی قسمتی که می خوایم یه کاری با ایندکس انجام بدیم مجبور نشیم نوع ایندکس رو تعریف کنیم ؟ یعنی توی کد زیر لازم نباشه as Tbutton رو مشخص کرد .

(Self.Components[0] as Tbutton).Caption:='Reza';

البته دوستان من توی سایت و Help خود دلفی هم گشتم و چیزی پیدا نکردم و همچنین که من یه مبتدیم اگه سوالم مسخرس شما ببخشید :خجالت:

البته قصد من از ایندکس کردن آبجکت ها اینه که در هر زمان که نیاز باشه بتونم به یه ایندکس نامعلوم فوکوس کنم ، اگه راه دیگه ای به ذهن کسی میرسه خوشحال میشم بدونم :چشمک:

در ضمن من از دلفی 5 استفاده میکنم و نمیدونم دلفی توی نسخه های بعدیش چجوری با این بحث برخورد کرده ها !

یوسف زالی
سه شنبه 22 مرداد 1392, 10:01 صبح
سلام.
دلفی 5 ؟!!
ایندکس کردن آبجکت ها یک کار داخلی دلفیه، به نظر نمی رسه به درد برنامه نویس ها هم بخوره.
نمی دونم دلیل این کار چی می تونه باشه. خود دلفی به ترتیب ساخته شدن روی Owner اونها رو ایندکس می کنه.

در مورد As باید بدونید که کامپوننت به ذات دارای خصیصه های مورد نظر شما مثل Caption نیست. بنابراین برای تبدیل دو راه دارید، استفاده از Implicit Cast یا Force Cast
راه دیگه اینه که از یونیت TypInfo استفاده کنید و از متد های SetPropValue و این چیزها بهره ببرید.

persia_hrn
سه شنبه 22 مرداد 1392, 23:50 عصر
سلام آقای یوسفی ، اگه فامیلتون رو اشتباه نگفته باشم :خجالت:
ممنون از جوابتون ولی علت اینکه من میخوام از ایندکس استفاده کنم اینه که من چندتا Edit و button و List و آبجکت های دیگه توی فرمم دارم و میخوام کاربر نتونه فکوس رو از روی یک شی ء با کلیک ماوس به شی ء دیگه ببره و این کار فقط با کنترل های کیبرد اونم با توجه به وجود شرط خاص انجام بشه ، همچنین نمیخوام خاصیت Enabeld آبجکت هارو False کنم .

تنها چیزی که به ذهنم رسید این بود که وقتی روی یک آبجکت فکوس هستم شماره ایندکسش رو دربیارم و اگر فکوس به هر شی ء دیگه منتقل شد سریع فکوس رو به شماره ایندکس برگردونم .

نمی دونم منظورم رو رسوندم یا نه ؟ البته خودم این کار رو با اختصاص نام اشیاء به Caption یه Label در زمان OnEnter هر آبجکت و کنترل های بعدی انجام دادم ولی اگه میشد دسترسی به ایندکس هر آبجکت داشته باشم و همچنین از شر اون As خلاص می شدم خیلی راحت تر بود و کد کمتری لازم بود بنویسم .

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

ممنون میشم بیشتر راهنمایی کنید .

مرسی .

یوسف زالی
چهارشنبه 23 مرداد 1392, 10:04 صبح
من اسمم یوسف هست.
من هم دلفی رو به روش شما یاد گرفتم.
برای این کار راههای ساده تری هم وجود داره.



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
CheckBox1: TCheckBox;
RadioButton1: TRadioButton;
private
FLastFocusedControl: TWinControl;
public
function SetFocusedControl(Control: TWinControl): Boolean; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
Result := inherited SetFocusedControl(Control);

if Assigned(FLastFocusedControl) then
if Control = Edit1 then
begin
Result := false;
FLastFocusedControl.SetFocus;
end;

FLastFocusedControl := Control;
end;

end.

persia_hrn
چهارشنبه 23 مرداد 1392, 13:54 عصر
یوسف جان از کمکتون ممنون :لبخندساده:

ولی نمیفهمم چرا دفعه ی اول که روی Edit1 کلیک میکنم فکوس نمیشه ولی دفعات بعد فکوس منتقل میشه ! :متفکر:

یوسف زالی
چهارشنبه 23 مرداد 1392, 14:54 عصر
اصلاح کنید:


function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
Result := inherited SetFocusedControl(Control);

if Control = Edit1 then
begin
if Assigned(FLastFocusedControl) then
FLastFocusedControl.SetFocus;
Result := false;
end
else
FLastFocusedControl := Control;
end;