2

我想为在每个字母上输入不同名称和地址的字母创建一个邮件标记。我使用 Microsoft 示例作为基点http://support.microsoft.com/kb/229310并根据我的喜好对其进行了自定义。但是当试图获取 dbgrid 的选定行或整个事物的数据时,我的问题就出现了。我不知道该怎么做。我的第一个想法是对行数做 1,然后放下一些 tedit 框并将它们与邮件合并数据相等,但一次仍然只做一个。dbgrid 链接到 ms Outlook。这就是他们填充数据的方式..

// Open the file to insert data
wrdDataDoc := wrdApp.Documents.Open('E:\Temp.doc');
 for iCount := 1 to (DBGrid1.DataSource.DataSet.RecordCount) do
wrdDataDoc.Tables.Item(1).Rows.Add;
FillRow(wrdDataDoc, 2, 'Steve', 'DeBroux',
    '4567 Main Street', 'Buffalo, NY  98052');
// Fill in the data
FillRow(wrdDataDoc, 3, 'Jan', 'Miksovsky',
    '1234 5th Street', 'Charlotte, NC  98765');
FillRow(wrdDataDoc, 4, 'Brian', 'Valentine',
    '12348 78th Street  Apt. 214', 'Lubbock, TX  25874');

那么我将如何从 dbgrid 中获取数据并用该信息填充文件呢?

4

2 回答 2

5
var
  i: Integer;
  bm: TBookmark;
begin
  DBGrid1.DataSource.DataSet.DisableControls;
  try
    bm := DBGrid1.DataSource.DataSet.GetBookmark;
    try
      i := 0;
      DBGrid1.DataSource.DataSet.First;
      while not DBGrid1.DataSource.DataSet.Eof do begin
        Inc(i);
        FillRow(wrdDataDoc, i,
          DBGrid1.DataSource.DataSet.FieldByName('Name').AsString,
          DBGrid1.DataSource.DataSet.FieldByName('Address1').AsString,
          ..
          );
        DBGrid1.DataSource.DataSet.Next;
      end;
      if Assigned(bm) then
        DBGrid1.DataSource.DataSet.GotoBookmark(bm);
    finally
      DBGrid1.DataSource.DataSet.FreeBookmark(bm);
    end;
  finally
    DBGrid1.DataSource.DataSet.EnableControls;
  end;
end;
于 2012-04-29T14:15:56.917 回答
1

嗯,这给了我一些关于如何使用书签来管理 DBGrid 中的选定行的线索。我的问题是能够读取 selectedRows 的某些字段,例如提取所选联系人(记录)的电子邮件地址(或记录 ID 号),以发送电子邮件至。有关使用 TBookmarkList 和 TBookmark 的任何进一步信息都会有所帮助:) 太简单了......似乎循环遍历 TBookmarkLIst 的唯一方法是使用它的 Count 属性,并使用它的 Item[index] 作为 TBookmark。然后将其用于 dataset.gotBookMark,然后访问所需的 fieldByName('Fieldname')。

我本来希望...

For bmBookmark in bmlBookmarkList do

但这有效...

  var bmlGridSelectedRows: TBookmarkList;
      bmRecord: TBookmark;
      I: Integer;
begin
   JvdbUltimGridContacts.DataSource.DataSet.DisableControls;
   bmlGridSelectedRows := JvdbUltimGridContacts.SelectedRows;

   for I := 0 to bmlGridSelectedRows.Count - 1 do
     begin
       bmRecord := bmlGridSelectedRows.Items[I];
       ABSTableContacts.GotoBookmark(bmRecord);
       MessageDlg(ABSTableContacts.FieldByName('DisplayName').AsString,mtInformation,[mbOK],0); //this is just to show that you are accessing the correct record you expect, replace with your own code of course
     end;
  JvdbUltimGridContacts.DataSource.DataSet.EnableControls;

关于 Dataset.DisableControls / EnableControls 属性的好提示,:)

当然,您不需要为 TbookmarkList 和 TBookmark 声明变量,因为它们可以直接访问,我只是习惯这样做,因为我认为它是更简洁的代码。IE

 DBGrid.DataSource.DataSet.DisableControls;

   for I := 0 to DBGrid.SelectedRows.Count - 1 do
     begin
       ABSTableContacts.GotoBookmark(DBGrid.SelectedRows.Items[I]);
       MessageDlg(ABSTableContacts.FieldByName('DisplayName').AsString,mtInformation,[mbOK],0);
     end;
  DBGrid.DataSource.DataSet.EnableControls;
于 2012-10-22T09:20:06.677 回答