PDA

View Full Version : سوال: بهینه سازی کد



farshid_82
شنبه 12 فروردین 1391, 00:30 صبح
سلام
دوستان من یک سال پیش برنامه ای نوشتم برای رزرو بلیط اتوبوس و برای ایجاد صندلی اتوبوس از advstringgrid استفاده شد و تو برنامه procedure ای قراردادم که وظیفش نمایش جای مسافرین در صندلی خودشون هست که اگر مرد باشن تصویر مرد و زن هم تصویر زن در کنار شماره صندلی خودشون نمایش میده حالا با افزایش حجم اطلاعات و برنامه نویسی افتضاح من بخاطر همین prucedure سرعت شدید پائین اومده حالا با توجه به عادت کاربران نمی تونم محیط دستکاری کنم لطفا راهنمائی کنید با این کدها چه می شه کرد که سرعت رو بالا ببرم.
برنامه از 2 جدول استفاده می کنه که جدول اصلی برای ثبت تاریخ - تعداد مسافر - کرایه و جمع کل هست و جدول دوم که برای هر مسافر یک رکورد ثبت می کنه و اطلاعاتی مثل cell و row که جای مسافرین هست رو ذخیره می کنه.




procedure TFSBlit.FullMO();
Var n,i : Integer;
begin
//-----------------------
for i:=0 to advstringgrid1.RowCount -1 do
begin
AdvStringGrid1.AddImageIdx(0,i,0,haBeforeText,vaTo p);
AdvStringGrid1.AddImageIdx(1,i,0,haBeforeText,vaTo p);
AdvStringGrid1.AddImageIdx(3,i,0,haBeforeText,vaTo p);
AdvStringGrid1.AddImageIdx(4,i,0,haBeforeText,vaTo p);
//-----------------------
AdvStringGrid1.CellProperties[0,i].BrushColor := $00F9F2ED;
AdvStringGrid1.CellProperties[1,i].BrushColor := $00F9F2ED;
AdvStringGrid1.CellProperties[3,i].BrushColor := $00F9F2ED;
AdvStringGrid1.CellProperties[4,i].BrushColor := $00F9F2ED;
end;
//---------------------------------
FDMBank.QFull.Close;
FDMBank.QFull.ParamByName('inlpb').AsString := TaProgramID.AsString;
FDMBank.QFull.ParamByName('indate').AsString := SolarMonthCalendar1.OutDate;
FDMBank.QFull.ExecSQL;
FDMBank.QFull.Open;
FDMBank.QFull.First;
if FDMBank.QFull.RecordCount <> 0 then begin
while not FDMBank.QFull.Eof do begin
AdvStringGrid1.RowCount := trunc(StrToInt(sDBTextFX4.Caption) Div 4);
n := 0;
advstringgrid1.excelclipboardformat:=true;

for i:=0 to advstringgrid1.RowCount -1 do
begin
n := n + 1;
advstringgrid1.cells[0,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 0;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(0,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[1,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 1;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(1,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[3,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 3;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(3,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[4,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 4;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(4,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
end;
FDMBank.QFull.Next;
end;
end Else Begin
AdvStringGrid1.RowCount := trunc(StrToInt(sDBTextFX4.Caption) Div 4);
n := 0;
advstringgrid1.excelclipboardformat:=true;

for i:=0 to advstringgrid1.RowCount -1 do
begin
n := n + 1;
advstringgrid1.cells[0,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 0;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(0,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[1,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 1;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(1,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[3,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 3;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(3,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[4,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 4;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(4,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
end;
end;

//-----------------------
FDMBank.QColor.Close;
FDMBank.QColor.ParamByName('inlink').AsInteger := FDMBank.TaBlitNOO.AsInteger;
FDMBank.QColor.ExecSQL;
FDMBank.QColor.Open;
if FDMBank.QColor.RecordCount <> 0 then begin
while not FDMBank.QColor.Eof do
begin
AdvStringGrid1.CellProperties[FDMBank.QColorCol1.AsInteger,FDMBank.QColorARow.As Integer].BrushColor := clHighlight;
FDMBank.QColor.Next;
end;
end;
XDBGrid2.SetFocus;
end;

m-khorsandi
یک شنبه 13 فروردین 1391, 20:32 عصر
سورسی كه قرار دادين خيلی زياده به اضافه‌ی اينكه AdvStringGrid كامپوننتی نيست كه هر كسی با اون كار كرده باشه.
پيشنهاد ميكنم قسمت‌هایی كه مشكل ساز هستند رو مشخص كنيد.
مشخص كنيد برای ارتباط با بانك اطلاعاتی از چه ابزاری استفاده كردين( ADO, BDE....؟)

تقريبا برای باز كردن هر كوئری يكبار ExecSQL رو اجرا كردين و يكبار هم Open. چرا؟

farshid_82
دوشنبه 14 فروردین 1391, 12:33 عصر
مرسی از جوابتون
یک علتش برنامه نویسی افتضاحم بوده که هم open کردم و هم ExecSQL.اولین بار با bde بود ولی جدیدا برای افزایش سرعت بردم رو ado.با تست من علت سرعت بائین برنامه بخاطر تعداد دفعات بالا برای لود حلقه زیر هست.
کد های زیر در هر بار صدازدن prucedur 4 بار اجرا میشه هر دفعه برای یک صندلی کاملترش در کد بالا هست.حالا اگه فکر میکنید راه بهتر دیگه ای بجای استفاده از stringgrid هست لطفا پیشنهاد بدید چون می دونم که اصلاح کد زیر خبلی اعصاب و وقت می خواد.تشکر


if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(1,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;
//-------------------------------
n := n + 1;
advstringgrid1.cells[3,i] := IntToStr(n);
//----------------
FDMBank.QLoad.Close;
FDMBank.QLoad.ParamByName('inlink').AsInteger := FDMBank.QFullNOO.AsInteger;
FDMBank.QLoad.ParamByName('inarow').AsInteger := i;
FDMBank.QLoad.ParamByName('incol1').AsInteger := 3;
FDMBank.QLoad.ExecSQL;
FDMBank.QLoad.Open;
if FDMBank.QLoad.RecordCount <> 0 then
begin
while not FDMBank.QLoad.Eof do
begin
AdvStringGrid1.AddImageIdx(3,i,FDMBank.QLoadSRow.A sInteger,haBeforeText,vaTop);

FDMBank.QLoad.Next;
end;
end;

m-khorsandi
دوشنبه 14 فروردین 1391, 14:43 عصر
باید در مورد فیلدهای inlinkو inarowو incol1 توضیح بدی.

farshid_82
دوشنبه 14 فروردین 1391, 18:38 عصر
فروش بلیط از دو جدول استفاده می کنه که فیلد های مورد نظر شما در جدول detail هستند که وظیفه نگهداری جای صندلی های مسافرین رو داره.فیلد inlink جهت اتصال به جدول اصلی هست که نام مسافر و کرایه و تعداد و ... هست-فیلد inarow جهت جستجو ردیف صندلی هست و فیلد incol جهت جستجو صندلی در بین چهار ستون هست.اطلاعات هر ستون در فیلد خودش ذخیره میشه مثلا اطلاعات ستون اول در فیلد col1 و دوم در col2 و ...-علت اینکه گفتم این قطعه کد 4 بار در این procedure اجراء میشه همینه.
تشکر