PDA

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



rayangostar_co
سه شنبه 14 آذر 1391, 15:30 عصر
با سلام خدمت دوستان و اساتید محترم
تازه جند روزه که دلفی رو شروع کردم ولی قبلا با C#‎‎‎ کد می نوشتم. بنابر این آشنایی چندانی به کلاس های دلفی و همچنین مبحث شی گرایی تو اونو ندارم.

دارم یه کلاس پیاده سازی می کنم واسه مدیریت درخواست هام واسه sql

اما به یه مشکل برخورد کردم که مربوط به زمانیه که می خوام از TadoStoreProcedure تو کلاس خودم یه نمونه ایجاد کنم.
بخشی از کدو میزارم.
دوستان لطفا راهنماییم کنن



function TSqlManager.select(procedureName: string; table_name: string)
: TDataSource;
var
objParameter: TParameters;
objSp: TADOStoredProc;
objDS: TDataSource;

begin

with objSp do
begin
create(nil);
Connection := objConnection;
procedureName := procedureName;
Parameters.Refresh;
Parameters.ParamByName('@table_name').Value := table_name;
ExecProc;
objDS.DataSet := objSp;

end;
Result := objDS;
end;

خط 12 که مربوط به فراخوانی سازنده کلاس TadoStoredProcedure هست و ایراد میگیره. بجای nil کلمه کلیدی Self رو هم گذاشتم اما بازم error میده

دوستان کمک کنن لطفا. با تشکر

Felony
سه شنبه 14 آذر 1391, 15:47 عصر
شما دارید سازنده خود شی رو صدا میزنید ، این کار اشتباه هست ، هدف شما ساخت یک Instance از یک کلاس هست ، پس باید سازنده اون کلاس رو صدا بزنید تا یک نمونه از شئ مورد نظر رو براتون بسازه :


function TSqlManager.select(procedureName: string; table_name: string)
: TDataSource;
var
objParameter: TParameters;
objSp: TADOStoredProc;
objDS: TDataSource;
begin
objSp:= TADOStoredProc.Create(nil);
with objSp do
begin
Connection := objConnection;
procedureName := procedureName;
Parameters.Refresh;
Parameters.ParamByName('@table_name').Value := table_name;
ExecProc;
objDS.DataSet := objSp;
end;
Result := objDS;
end;

در مورد کدتون هم منطقش کلا اشتباه هست ، بهتره یک کلاس پایه داشته باشی که ADOConnection و ADOStoredProcedure و ... رو توش بسازی و این کلاس TSqlManagerت رو از اون به ارث ببری و از اشیاء اون استفاده بکنی ، کار راحت تر هم این هست که یک DataModule ایجاد کنی و ADOConnection و ADOStoredProcedure رو توش قرار بدی و کلاس TSqlManagerت رو از کلاس DataModule که ایجاد کردی به ارث ببری تا بتونی به اشیاء اون به راحتی دسترسی داشته باشی و بابت صدا زدن هر متدی از کلاست هی از کلاس ها نمونه سازی نکنی ، البته این مورد رو میشه تو همین کلاس هم پیاده کرد ( در سازنده و مخرب کلاس ) ولی اگر هدف شئ گراییست سناریویی که براتون گفتم مناسب تر هست .

rayangostar_co
سه شنبه 14 آذر 1391, 16:00 عصر
با تشکر از پاسختون .
منظورتون از کلاس پایه و ساخت او آجکت ها بیشتر واسه ساختار و نظم بخشیدن به کاره ؟
خواستم بدون مشکل این کار کجاست و کجا ها می تونه اذیت کنه؟ منظور کدیه که خودم نوشتم و مستقیما تو همین sqlManager تعریف کردم.
درضمن لطفا بگید پارامتر ورودی TadoStored Procedure چیه که وقتی ازش یه نمونه می سازم ازم می خود - میگه Tcomponent می خواد. میشه بگید باید چیکار کنم واسه پارامتر ورودیش.

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