یوسف زالی
دوشنبه 08 مهر 1392, 12:49 عصر
سلام.
خیلی پیش میاد که لازم داریم بصورت مولتی سلکت داده هایی رو از گرید انتخاب کرده و یک بلایی سرشون بیاریم.
کد های مرتبط بهش خیلی ساده هست ولی نیاز داره که هی همه جا کپی پیست بشن.
امروز برای کاری این کد رو نوشتم، براتون می گذارم که شما هم استفاده کنید:
procedure LoopActionOnDBGrid(DBGrid: TDBGrid; Action: TNotifyEvent; Sender: TObject = nil; ExtraLoopCondition: boolean = true);
var
i: integer;
Loop: boolean;
DS: TDataSet;
OldEnableState: boolean;
begin
if not Assigned(Action) then
Exit;
if not Assigned(DBGrid) then
Exit;
if not Assigned(DBGrid.DataSource) then
Exit;
if not Assigned(DBGrid.DataSource.DataSet) then
Exit;
DS := DBGrid.DataSource.DataSet;
if DS.RecordCount = 0 then
Exit;
if not Assigned(Sender) then
Sender := DBGrid;
OldEnableState := not DS.ControlsDisabled;
DS.DisableControls;
Loop := (DBGrid.SelectedRows.Count > 0) and ExtraLoopCondition;
for i := 0 to integer(Loop) * (DBGrid.SelectedRows.Count -1) do
begin
if Loop then
DS.Bookmark := DBGrid.SelectedRows[i];
Action(Sender);
end;
if OldEnableState then
DS.EnableControls;
end;
روش کار به این صورته:
یک متد تعریف می کنید که کاری که می خواهید بصورت حلقه (یا حتی تکی) انجام بشه، مثل حذف یا ... در اون متد می نویسید.
بعد در دکمه پروسیجر بالا رو کال می کنید.
مثال:
procedure TForm1.Proc(Sender: TObject);
begin
ShowMessage(ADOTable1SSN.AsString);
// or delete data from current row
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoopActionOnDBGrid(DBGrid1, Proc);
end;
:چشمک:
پارامترهای اضافی هم گویای خودش هست.
حالات مولتی سکلت، و غیر مولتی سکلت، انتخاب نشده و انتخاب شده رو هم می فهمه.
خیلی پیش میاد که لازم داریم بصورت مولتی سلکت داده هایی رو از گرید انتخاب کرده و یک بلایی سرشون بیاریم.
کد های مرتبط بهش خیلی ساده هست ولی نیاز داره که هی همه جا کپی پیست بشن.
امروز برای کاری این کد رو نوشتم، براتون می گذارم که شما هم استفاده کنید:
procedure LoopActionOnDBGrid(DBGrid: TDBGrid; Action: TNotifyEvent; Sender: TObject = nil; ExtraLoopCondition: boolean = true);
var
i: integer;
Loop: boolean;
DS: TDataSet;
OldEnableState: boolean;
begin
if not Assigned(Action) then
Exit;
if not Assigned(DBGrid) then
Exit;
if not Assigned(DBGrid.DataSource) then
Exit;
if not Assigned(DBGrid.DataSource.DataSet) then
Exit;
DS := DBGrid.DataSource.DataSet;
if DS.RecordCount = 0 then
Exit;
if not Assigned(Sender) then
Sender := DBGrid;
OldEnableState := not DS.ControlsDisabled;
DS.DisableControls;
Loop := (DBGrid.SelectedRows.Count > 0) and ExtraLoopCondition;
for i := 0 to integer(Loop) * (DBGrid.SelectedRows.Count -1) do
begin
if Loop then
DS.Bookmark := DBGrid.SelectedRows[i];
Action(Sender);
end;
if OldEnableState then
DS.EnableControls;
end;
روش کار به این صورته:
یک متد تعریف می کنید که کاری که می خواهید بصورت حلقه (یا حتی تکی) انجام بشه، مثل حذف یا ... در اون متد می نویسید.
بعد در دکمه پروسیجر بالا رو کال می کنید.
مثال:
procedure TForm1.Proc(Sender: TObject);
begin
ShowMessage(ADOTable1SSN.AsString);
// or delete data from current row
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoopActionOnDBGrid(DBGrid1, Proc);
end;
:چشمک:
پارامترهای اضافی هم گویای خودش هست.
حالات مولتی سکلت، و غیر مولتی سکلت، انتخاب نشده و انتخاب شده رو هم می فهمه.