Если я понимаю, что вы хотите, код ниже должен помочь.
Строки в выбранном DBGrid записываются в закладки, сохраненные в свойстве SelectedRows. Таким образом, чтобы получить список процедур TForm1.GetBookmarkIDs, какие вам нужно сделать, это:
Сохранить текущую позицию в сетке (CDS1.GetBookmark)
Iterate единицы хранения SelectedRows' чтобы получить каждую закладку по очереди, получить закладку, получить набор данных, чтобы перейти к этой закладке, и получить EMP_ID для строки набора данных (в моих тестовых данных имя столбца - просто «ID»).
делать все, что вы хотите со значением emp_id
Возврат к записи мы закладкой в начале
Призывы DisableControls и EnableControls должны ускорить процесс, как они мешают другие данные -aware управления в GUI (а также сетки, конечно) от обновления, пока выбранные строки посещаются.
Код:
procedure TForm1.GetBookmarkIDs;
var
BM,
SelectedBM : TBookmark;
EMP_ID : Integer;
i : Integer;
begin
BM := CDS1.GetBookmark;
try
CDS1.DisableControls;
CDS1.First;
for i := 0 to DBGrid1.SelectedRows.Count - 1 do begin
SelectedBM := PChar(DBGrid1.SelectedRows[i]);
CDS1.GotoBookmark(SelectedBM);
EMP_ID := CDS1.FieldByName('ID').AsInteger;
Memo1.Lines.Add(IntToStr(EMP_ID));
end;
finally
CDS1.GotoBookmark(BM);
CDS1.FreeBookmark(BM);
CDS1.EnableControls;
end;
end;
Вы не сказали, как именно вам нужно форматировать список EMP_IDs для отправки хранимой процедуры. С помощью вышеуказанного кода вы будете делать что-то вроде вызова Stored Proc каждый раз вокруг цикла «for i: = 0 ...».
Если вы хотите их, скажем, в виде списка, разделенного запятыми, можно переписать процедуру как функцию, возвращающую строку, вдоль этих линий
function TForm1.GetBookmarkIDs : String;
[...]
begin
Result := '';
[...]
//EMP_ID := CDS1.FieldByName('ID').AsInteger;
if Result <> '' then
Result := Result + ', ';
Result := Result + CDS1.FieldByName('ID').AsString;
[...]
Описание хорошо, но код как-то грубо. Я бы предложил метод для общего использования, например 'procedure GetSeletedFieldValueFromGrid (Grid: TDBGrid; const Имя поля: string; out SelectedValues: TVariantDynArray);'. Вы можете получить все необходимое из самой сетки. –
@SirRufo: Да, но OP звучит как новичок («Я код с Delphi 7, For Educational Reasons»), поэтому я подумал, что более важно сосредоточиться на основных деталях того, как получить EMP_ID из строк, а не сетка (что, если выбранные строки являются только верхними и нижними рядами сетки 30000 строк?). В любом случае, я не помню, что D7 поддерживает TVariantDynArray. Это может быть грубо, но я думаю, что лучше отвлечь ОП с помощью тонкостей. Op мог написать более элегантную версию, узнав немного больше. – MartynA
Я бы сказал, что вы можете научить новичка также отношениям между сеткой, DataSource, DataSet с таким распространенным методом. И 'TVariantDynArray' - это всего лишь одна строка объявления типа. –