2

それぞれ異なる名前と住所を入力した手紙の差し込み印刷を作成したいと考えています。Microsoft の例を基点http://support.microsoft.com/kb/229310として使用し、好きなようにカスタマイズしました。しかし、dbgrid の選択された行または全体のデータを取得しようとすると、私の問題が発生します。やり方がわかりません。私が最初に考えたのは、行数を 1 にしてから、tedit ボックスをいくつか置いて、メールマージされたデータと等しくすることでしたが、それでも一度に 1 つずつしか実行しません。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の選択された行を管理する方法についての少しの手がかりを与えてくれます。私の問題は、選択した連絡先(レコード)の電子メールアドレス(またはレコードID番号)を抽出して、おそらくに電子メールを送信するなど、selectedRowsの特定のフィールドを読み取ることができることです。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;
于 2012-10-22T09:20:06.677 に答える