ورود

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



MH2538
دوشنبه 05 مرداد 1383, 20:45 عصر
سلام
من معذرت می خوام اگه بلد نیستم خوب توضیح بدم . اما سعی می کنم بهتر و با حوصله بیشتری توضیح بدم.
نمونه واقعی زیر رو در نظر بگیرین :
فرض کنید شما در فرم خود یک DBGrid قرار دادین و می خواین هر وقت کاربر روی اون کلیک کرد یه فرم جدید بار بشه یا یه پیغام بده . اما مشکل اینه که DBGrid هیچ event ای برای OnClick بر نمی گردونه (همچین Event ای نداره ).
خوب حالا چطوری این مشکل رو حل می کنید . یعنی چطوری می تونین بفهمین که کاربر روی DBGrid کلیک کرده.

دسترسی به این نوع Event ها روش و نام مخصوص به خودش را دارد که در زمان مناسب همراه با پاسخ آن در موردش توضیح خواهم داد.
موفق باشید.

مهدی کرامتی
دوشنبه 05 مرداد 1383, 21:38 عصر
دوست عزیز، بهتر نیست صورت مسئله ها را کمی واضحتر بنویسید؟

SReza1
دوشنبه 05 مرداد 1383, 22:29 عصر
شما میتونید این Event رو برای dbgrid بسازید!! یعنی یه DbGrid داشته باشید که Onclick داشته باشه! :shock:

MH2538
دوشنبه 05 مرداد 1383, 22:39 عصر
دوست عزیز SReza
دقیقا منظورم همینه 8)
این کار شدنی است و راه حل اون هم فقط برای DBGrid کاربرد نداره بلکه با اون می تونید از خیلی از event های مخفی برای کارهای خودتون بهره بگیرین :evil2:
موفق باشید

MToloo
سه شنبه 06 مرداد 1383, 05:09 صبح
سلام. من خلیی وقت پیش جواب این سوال شما رو تو سایت delphi.about.com دیدم. که مثالش هم اتفاقا برای dbgrid بود. فکر کنم برای پروپرتی rowHeights اون بود. اسمش و گذاشته بود hackingGrid ! من از اون موقع به بعد خیلی از این روش استفاده میکنم:
این روش برای دسترسی به متدهای Private یا Protected به درد میخوره.
همونطوری که میدونین هر متد یا پروپرتی Private تو یونیت خود اون شی حتی توسط سایر اشیا قابل دسترسی است. پس حالا اگه ما کاری کنیم که انگار تو یونیت خود DBGrid هستیم میتونیم از اونها استفاده کنیم. یعنی مثلا اینطوری:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, DB, ADODB;

type
THackinGrid= class(TDBGrid)
end;

TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('The height of first row in dbgrid is '+ IntToStr(THackinGrid(DBGrid1).RowHeights[0]));
end;

end.

_alish_
سه شنبه 06 مرداد 1383, 08:33 صبح
با سلام
begin
داداش بطور کلی اگر بخواهی به متد های و گزینه های خصوصی یک کلاس دسترسی پیدا کنی باید یک کلا س از آن در یونیت خود بسازی اصلا بطور کلی اگر چندین کلاس در یک یونیت باشند همه به متد های خصوصی هم دسترسی دارند
MToloo هم در type
THackinGrid= class(TDBGrid)
end;
آورده این یک فرمول کلی می باشد
موفق باشی
end.

MH2538
سه شنبه 06 مرداد 1383, 18:12 عصر
سلام
می بینم ک به خوشی و خرمی این موضوع هم حل شد . جواب ها کامل بود . هر دو !
پس باز هم تا سئوال بعد
موفق باشین

MToloo
چهارشنبه 07 مرداد 1383, 06:50 صبح
سلام. جالبه! من اون برنامه ای که گذاشتم و شماها میگین درسته رو با رویداد OnClick آزمایش کردم ولی جواب نداد! :shock: نمدونم چرا ولی صداش و درنیاوردم :P برای همین با پروپرتی RowHeights نوشتمتش. حالا اگه میشه لطفا یکی بگه چرا با OnClick جواب نمیده. من اشتباهی کردم یا رویداد OnClick تو DBGrid یه مشکلی داشته که خودشون نذاشتن؟ :wink:

MH2538
چهارشنبه 07 مرداد 1383, 19:03 عصر
سلام

والا جواب می ده !
نمونش رو هم همین امشب تا آخر شب Upload می کنم . والا ما خالی بند نیسیتیم بخدا
با اینکه حالم رو گرفتی ولی باز هم موفق باشی :wink:

MH2538
چهارشنبه 07 مرداد 1383, 22:03 عصر
سلام
این هم آدرس اون Sample که قول داده بودم براتون بنویسم ! http://www.sharemation.com/mh2538/MyPrograms/APM.zip
موفق باشین

Kambiz
پنج شنبه 08 مرداد 1383, 22:13 عصر
همونطوری که میدونین هر متد یا پروپرتی Private تو یونیت خود اون شی حتی توسط سایر اشیا قابل دسترسی است. پس حالا اگه ما کاری کنیم که انگار تو یونیت خود DBGrid هستیم میتونیم از اونها استفاده کنیم.
اعضای Private یک کلاس در یونیتهای دیگه و حتی کلاسهای به ارث برده شده از اون کلاس مخفی هستند.

MToloo
شنبه 10 مرداد 1383, 06:10 صبح
با سلام و عرض پوزش. خوب حالا چرا ناراحت میشی. این برنامه ای که شما نوشتی درست ولی برنامه من یه جورایی متفاوت بودها. اون و امتحان کن. جواب نمیده. حداقل برای onClick جواب نمیده.

unit Unit1;

interface

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

type
THackinGrid= class(TDBGrid)
end;

TForm1 = class(TForm)
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure OnDBGrid1Click (Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
THackinGrid(DBGrid1).OnClick:=
OnDBGrid1Click;
end;

procedure TForm1.OnDBGrid1Click(Sender: TObject);
begin
ShowMessage('You clicked on dbgrid!');
end;

end.

Inprise
شنبه 10 مرداد 1383, 08:55 صبح
این روش برای دسترسی به متدهای Private یا Protected به درد میخوره

چیزی بنام متد مخفی معنی و مفهوم نداره . یک متد ، Private است چون باید Private باشه ، یعنی نباید در دسترس فراخوانهای غیر دوست ( Friend ) قرار بگیره . این معنای Data hiding است .


می تونید از خیلی از event های مخفی برای کارهای خودتون بهره بگیرین

چیزی بنام event مخفی هم معنی و مفهوم نداره . event ها رخدادگردانهائی هستند که عموما" پس از دریافت یک پیام ( مانند Win32 Message ، VCL Message یا ... ) باعث فراخوانی روالهای خاصی میشن . وقتی یک کلاس event به خصوصی نداره ، یعنی برای پاسخگوئی به پیام خاص مربوط به اون event برنامه ریزی نشده . نتیجتا" برای اضافه کردن یک event به یک کلاس باید اول از همه رخدادگردانی که به صف ارسال-دریافت پیام متصل بشه رو به تعریف کلاس اضافه کرد ، بعد اون رخدادگردان رو بصورت یک event در اختیار برنامه نویس قرار داد .

بهتر نیست اول "یاد بگیریم" بعد اگر فرصت شد به دیگران Trick یاد بدیم ؟

موفق باشید

MH2538
شنبه 10 مرداد 1383, 21:42 عصر
بهتر نیست اول "یاد بگیریم" بعد اگر فرصت شد به دیگران Trick یاد بدیم ؟

<span dir=ltr>What a pity ? What a shame ?
Thank you my advisor .
But i think You are a man who rich to higher grade but with ....
please change your name from INPRISE to SURPRISE</span>

MToloo
یک شنبه 11 مرداد 1383, 04:52 صبح
بهتر نیست اول "یاد بگیریم" بعد اگر فرصت شد به دیگران Trick یاد بدیم ؟
:مخالف:

SReza1
یک شنبه 11 مرداد 1383, 11:22 صبح
من که نهمیدم کدوم مشکل حل شد!! اینکه یه buttom بذارید و به component وصلش کنید که جواب منطقی نیست!!! :shock:
:? :?

rmb_ali
دوشنبه 21 شهریور 1384, 08:31 صبح
ولی این برنامه فقط بار اول که کلیک میکنی جواب میده و برای بارهای بعدی جواب نمیده

p_zare
جمعه 11 آذر 1384, 16:20 عصر
سلام - آیا با این روش میشه رو dbgrid - Drag Drop کرد؟