PDA

View Full Version : چند تا سوال در مورد استرينگ گريد



ariobarzan
پنج شنبه 02 دی 1389, 08:26 صبح
سلام
من يه ديبي گريد دارم كه وصل به يك كوئري هست (مثال ليست كارگران يك شيفت كاري يك كارخانه)
حالا كاربر من ميخواد از بين اين ليست چند نفر رو انتخاب كنه (مثلا با دابل كليك روي اسم هر نفر)
در مقابل اين ديبي گريد ميخوام يه استرينگ گريد بزارم كه هر ركورد از ديبي گريد با دابل كليك به اون اضافه بشه
و بعد از انتخاب نفرات مورد نظر يه عملياتي مثل ثبت يه تشويق براشون اجرا بشه

اولا اگه كاربر بخواد از بين ليست اضافه شده به استرينگ گريد يكي رو حذف كنه چطور بطور اتوماتيك اطلاعات سطر هاي پايين تر بيان بالا ؟
دوما ما از كجا بفهميم كه تعداد سطر هاي حاوي ديتا تو يه استرينگ گريد چند تاست ؟
سوما در ديبي گريد چون وصل به كوئري هست ما كوئري رو راحت پيمايش و اطلاعاتشو پردازش ميكنيم . تو استرينگ گريد چطوري بايد پيمايش بشه مثلا در كل سطر هاي استريگ گريد جستجو كنه اگه يه شرط در مورد يه فيلد درست باشه حالا اطلاعات مربوط به او شخص در جدول اصلي تو بانك اطلاعاتي تغييرات داشته باشه
سوال چهارم اينكه ليست سطر هاي استرينگ گريد رو چطوري بفرستم به گزارش فست ريپورت
پنجم : پاك شدن كل اطلاعات يك استرينگ گريد با چه دستوريه:
ششم : چطوري روي يك سطر كليك كنيم شماره سطر رو برگردونه
هفتم : سورت شدن بر اساس يك ستون انتخابي چطوريه؟
هشتم : بعضي وقتها كه به استرينگ گريد يه سطر ديتا اضافه ميكنيم ديده نميشه و با اضافه كردن سطر بعدي هر دو سطر جديد ديده ميشه دستور Refresh هم استفاده كردم فايده اي نداشت راه حل چيه؟


ممنون از توجه شما

Felony
پنج شنبه 02 دی 1389, 09:39 صبح
اولا اگه كاربر بخواد از بين ليست اضافه شده به استرينگ گريد يكي رو حذف كنه چطور بطور اتوماتيك اطلاعات سطر هاي پايين تر بيان بالا ؟
نوع زیر رو تعریف کنید :

type
TMyStringGrid = class(TStringGrid);

به صورت زیر ازش استفاده کنید :

TMyStringGrid(StrGrid).DeleteRow(Index);

یا از این تابع استفاده کنید :

procedure DeleteRow(yourStringGrid: TStringGrid; ARow: Integer);
var i: Integer;
begin
with yourStringGrid do
begin
for i := ARow to RowCount-2 do
Rows[i].Assign(Rows[i+1]);
RowCount := RowCount - 1
end;
end;


دوما ما از كجا بفهميم كه تعداد سطر هاي حاوي ديتا تو يه استرينگ گريد چند تاست ؟
یه تابع براتون نوشتم :

function FilledRowCount(const StrGrid: TStringGrid): Integer;
var
Row, Col: Integer;
EmptyCount: Byte;
begin
EmptyCount:= 0;
Result:= StrGrid.RowCount;
for Row:= 0 to StrGrid.RowCount - 1 do
for Col:= 0 to StrGrid.ColCount - 1 do
if StrGrid.Cells[Col, Row]= '' then
begin
Inc(EmptyCount);
if EmptyCount= StrGrid.ColCount then
begin
Dec(Result);
EmptyCount:= 0;
end;
end;
end;
استفاده :

ShowMessage(IntToStr(FilledRowCount(StringGrid1))) ;


سوما در ديبي گريد چون وصل به كوئري هست ما كوئري رو راحت پيمايش و اطلاعاتشو پردازش ميكنيم . تو استرينگ گريد چطوري بايد پيمايش بشه مثلا در كل سطر هاي استريگ گريد جستجو كنه اگه يه شرط در مورد يه فيلد درست باشه حالا اطلاعات مربوط به او شخص در جدول اصلي تو بانك اطلاعاتي تغييرات داشته باشه
با 2 حلقه تو در تو ، یکی سطر رو پیمایش کنه و دیگری ستون ، مثل همون تابعی که در بالا نوشتم .

vcldeveloper
پنج شنبه 02 دی 1389, 18:52 عصر
من يه ديبي گريد دارم كه وصل به يك كوئري هست (مثال ليست كارگران يك شيفت كاري يك كارخانه)
حالا كاربر من ميخواد از بين اين ليست چند نفر رو انتخاب كنه (مثلا با دابل كليك روي اسم هر نفر)
در مقابل اين ديبي گريد ميخوام يه استرينگ گريد بزارم كه هر ركورد از ديبي گريد با دابل كليك به اون اضافه بشه
و بعد از انتخاب نفرات مورد نظر يه عملياتي مثل ثبت يه تشويق براشون اجرا بشه
اگر از کنترل های ADO یا ClientDataset استفاده می کنید، به جای این همه تلاش برای کار با StringGrid، یک Clone از دیتاست متصل به DBGrid تون بگیرید، و اون رو به یک DBGrid دیگه وصل کنید. هر رکوردی که در DBGrid اول توسط کاربر انتخاب شد، مقدار خصوصیت Filter مربوط به Clone رو تغییر بدید؛ یعنی Clone شما باید لیست رکوردهای انتخاب شده رو توسط Filter خودش برگشت بده. تغییراتی که روی داده ها در دیتاست اصلی انجام میدید، در Clone قابل مشاهده هستند، و بالعکس. اینطوری با دو DBGrid کار می کنید که هر دو به یک منبع داده وصل هستند، ولی داده را به دو شکل متفاوت نمایش میدند.