PDA

View Full Version : خطا در توليد يك كلاس مشتق شده از DBGrid



Zahed2008
شنبه 14 شهریور 1388, 17:17 عصر
سلام، من يه كلاس از DBGrid مشتق كردم، بصورت زير:


type
TDBGridChecked = class( TDBGrid )
ADOTable1 : TADOTable;
DataSource1: TDataSource;
DBCheckBox1: TDBCheckBox;
ImageList1 : TImageList;
procedure DBGridCellClick(Column: TColumn);
procedure DBGridColExit(Sender: TObject);
procedure DBGridKeyPress(Sender: TObject; var Key: Char);
procedure DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
constructor CreateTable(Aowner:TComponent);
end;
...
constructor TDBGridChecked.CreateTable(Aowner:TComponent);
begin
//---------Creat Table:
inherited Create( Aowner );
Parent := Form1.TabSheet5;
Align := alClient;
Visible:= True;
OnCellClick := DBGridCellClick;
OnColExit := DBGridColExit;
OnKeyPress := DBGridKeyPress;
OnDrawColumnCell := DBGridDrawColumnCell;
//----------DBCheckBox1:
DBCheckBox1 := TDBCheckBox.Create( Form1.DBCheckBox1 );
DBCheckBox1.Parent := Form1.TabSheet5;
DBCheckBox1.Visible := True;
//----------DataSource1:
DataSource1 := TDataSource.Create( Form1.DataSource1 );
//----------ImageList1:
ImageList1 := TImageList.Create( Form1.ImageList1 );
//----------ADOTable1:
ADOTable1 := TADOTable.Create( Form1.ADOTable1 );
end;ولي موقع توليد CreateTable خطاي Access violation مي ده. به نظر شما اشكال كار كجاست؟
:گریه:

Zahed2008
یک شنبه 15 شهریور 1388, 11:36 صبح
سلام دوستان، كسي نمي تونه كمكي به من بكنه؟ خيلي ضروريه :گریه:

Saeed_m_Farid
یک شنبه 15 شهریور 1388, 12:10 عصر
...
ولي موقع توليد CreateTable خطاي Access violation مي ده. به نظر شما اشكال كار كجاست؟
سلام
دوست عزیز، آخه ناقص کد رو گذاشتی اینجا!
معلوم نیست تو TNotifyEvent (پروسیجرهای رخدادهای کلاستون) ها چی کار میکنید؟ درصورتیکه این پروسیجرها رو بیخیال بشیم (چون مجبوریم! شما کدی براشون ندادی) کلاس شما بدون ایراد میشه ازش instance تعریف کرد و مشکلی پیش نمیاد، البته به شرطی که همه اون کامپوننت های رو فرمت که به عنوان Owner پاس دادی به اعضاء کلاست موجود باشند!
ضمناً چرا اینکار رو انجام میدین؟ اگه همون Aowner که تو سازنده می گیری رو به اعضاء کلاس پاس بدین کافیه، نیاز نیست به ازاء هر چیزی که تو کلاستون دارید یه مشابهش رو فرم باشه؛ اصلاً کلاً یعنی چی این کلاس، قراره چی کار کنه؟ اسم سازنده CreateTable هست ولی خبری از ساخت جدول توش نیست ...

اینم تستی که من کردم و بدون مشکل اومد رو فرم :

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls, ImgList;
type
TDBGridChecked = class( TDBGrid )
ADOTable1 : TADOTable;
DataSource1: TDataSource;
DBCheckBox1: TDBCheckBox;
ImageList1 : TImageList;
procedure DBGridCellClick(Column: TColumn);
procedure DBGridColExit(Sender: TObject);
procedure DBGridKeyPress(Sender: TObject; var Key: Char);
procedure DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
constructor CreateTable(Aowner:TComponent);
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{************************************************* **}
constructor TDBGridChecked.CreateTable(Aowner:TComponent);
begin
//---------Creat Table:
inherited Create( Aowner );
Parent := Form1;
Align := alBottom;
Visible:= True;
OnCellClick := DBGridCellClick;
OnColExit := DBGridColExit;
OnKeyPress := DBGridKeyPress;
OnDrawColumnCell := DBGridDrawColumnCell;
//----------DBCheckBox1:
DBCheckBox1 := TDBCheckBox.Create( Aowner );
DBCheckBox1.Parent := Form1;
DBCheckBox1.Visible := True;
//----------DataSource1:
DataSource1 := TDataSource.Create( Aowner );
//----------ImageList1:
ImageList1 := TImageList.Create( Aowner );
//----------ADOTable1:
ADOTable1 := TADOTable.Create( Aowner );
end;
procedure TDBGridChecked.DBGridCellClick(Column: TColumn);
begin
// Do Something ...
end;
procedure TDBGridChecked.DBGridColExit(Sender: TObject);
begin
// Do Something ...
end;
procedure TDBGridChecked.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
// Do Something ...
end;
procedure TDBGridChecked.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
// Do Something ...
end;
{************************************************* **}
procedure TForm1.FormCreate(Sender: TObject);
begin
TDBGridChecked.CreateTable(Form1);
end;
end.

Zahed2008
یک شنبه 15 شهریور 1388, 13:47 عصر
سلام، اين يه كلاس از DBGrid هستش كه مي تونه، Field هاي boolean رو به صورت Checkbox نمايش مي ده. همچنين مي تونه با داشتن يه ستون كد ID-im و يه ImagList ستوني از آيكنها(تصاوير) رو نمايش بده.
از راهنمايي تون ممنونم. اشكال كار اينجا بود كه من اين يونيت رو تو Uses بالاي صفحه قبل از كلاس فرمم اضافه مي كردم.
از دوستايي كه خبره اند، تقاضا دارم كه اگه مي تونند از اين كلاس يه كامپوننت درست كنند تا همه خيلي راحت بتونند ازش استفاده كنند. باز هم از راهنماييتون ممنونم كه مشكلم رو حل كرديد.
اينم ضميمه كلاس مربوطه با روال هاش:

vcldeveloper
یک شنبه 15 شهریور 1388, 19:42 عصر
این کلاس مشکل داره...
Parent رو چرا در داخل constructor اونطوری set کردید؟! یعنی یک کامپوننت همیشه parent اش Form1 هست؟! اصلا نیازی نیست شما به parent مقدار بدید.

چرا براش یک constructor با نام متفاوت ایجاد کردید؟ باید constructor خودش را override می کردید. اینطوری IDE نمیتونه constructor شما را فراخوانی کنه.

چرا براش AdoTable و DataSource تعریف کردید؟!! این که خودش DataSource داره. اصلا کامپوننت های data-aware دلفی اینطوری طراحی شدند که وابسته به یک دیتاست خاص نباشند.