2012-04-29 68 views
2

我想創建郵件marge爲每個輸入不同名稱和地址的字母。我已經使用微軟示例作爲基點http://support.microsoft.com/kb/229310,並且我已經將它定製爲我喜歡的方式。但是我的問題出現在試圖獲取dbgrid的選定行的數據或整個事情時。我不知道該怎麼做。我的第一個想法是做1行的數量,然後把一些tedit框放下來,並把它們與mailmerged數據相​​等,但是這樣做一次只能做一個。 dbgrid鏈接到ms outlook。 這是他們如何填充數據..從dbgrid輸入數據到word郵件合併

// 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中獲取數據,並填寫與信息的文件?

+1

DBGrid1.DataSource.DataSet.FieldByName('name').AsString? – 2012-04-29 14:05:42

+0

感謝您的回覆,我現在收到錯誤「沒有足夠的實際參數」。此外,尺寸可能會發生變化,那麼是否可以爲多行做到這一點?我是否會從1循環到儘可能多的記錄,用數據填充行並每次添加一個數字? – captiv 2012-04-29 14:14:17

+1

看看我發佈的答案。 – 2012-04-29 14:16:27

回答

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; 
+0

哇謝謝一堆!儘管現在有2個小錯誤,'END'有望,但'FINALLY'找到了,最後一個是最後一個,除了最後或最終預期,這是倒數第二。 – captiv 2012-04-29 14:29:18

+1

@captiv - 不客氣! Sorr爲失蹤'結束':)。 – 2012-04-29 14:34:40

+0

我真的很抱歉再次打擾你,但我現在有另一個錯誤。 「無效的變體操作」,這是在'Doc.Tables.Item(1).Cell(Row,1).Range.InsertAfter(Text1)'這一行;'這是在由ms提供的填充行過程中。我知道這不是你給我的代碼的一部分,但我不確定導致它的原因。 – captiv 2012-04-29 15:02:51

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的變量,因爲它們可以直接訪問,我只是習慣於這樣做,因爲我認爲它是更簡潔的代碼。 即

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;