Ввод данных из dbgrid в слияние почты Word

Я хочу создать почтовую рамку для письма, вводя разные имена и адреса для каждого. Я использовал пример Microsoft в качестве отправной точки http://support.microsoft.com/kb/229310 и я настроил его так, как мне нравится. Но моя проблема возникает при попытке получить данные либо для выбранных строк dbgrid, либо всего целиком. Я понятия не имею, как это сделать. Моей первой мыслью было сделать 1 для количества строк, затем положить несколько полей для редактирования и поставить их равными данным слияния, но это все равно делает это только по одному за раз. dbgrid связан с внешним видом ms. Вот как они заполняют данные..

// 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 и заполнить файл этой информацией?


person captiv    schedule 29.04.2012    source источник
comment
DBGrid1.DataSource.DataSet.FieldByName('name').AsString ?   -  person Sertac Akyuz    schedule 29.04.2012
comment
Спасибо за ответ, теперь я получаю сообщение об ошибке недостаточно фактических параметров. Кроме того, размер может быть изменен, поэтому нужно ли делать это для нескольких строк? Буду ли я выполнять цикл от 1 до любого количества записей, заполнять строку данными и каждый раз добавлять единицу к числу?   -  person captiv    schedule 29.04.2012
comment
Посмотрите на ответ, который я разместил.   -  person Sertac Akyuz    schedule 29.04.2012


Ответы (2)


Хм, это дает мне некоторое представление о том, как использовать закладки для управления выбранными строками в DBGrid. Моя проблема заключается в возможности чтения определенных полей 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;
person Darren    schedule 22.10.2012

person    schedule
comment
Вау огромное спасибо! 2 Небольшие ошибки теперь, однако, ожидается «КОНЕЦ», но найдено «НАКОНЕЦ», это на последнем, наконец, и ИСКЛЮЧЕНИЕ или НАКОНЕЦ ожидается, и это на предпоследнем конце. - person captiv; 29.04.2012
comment
Мне очень жаль беспокоить вас снова, но у меня сейчас другая ошибка. недопустимая вариантная операция, и это в строке Doc.Tables.Item(1).Cell(Row,1).Range.InsertAfter(Text1); И это в процедуре заполнения строки, предоставленной ms. Я знаю, что это не часть кода, который вы мне дали, но я не уверен, что это вызывает. - person captiv; 29.04.2012
comment
@captiv - мне пришлось использовать ';' вместо ',' при вызове CreateDataSource, чтобы пример заработал. Это «разделитель списка» от «региональных настроек». Вы должны использовать «sysutils.ListSeparator», чтобы он работал в любой системе (wrdDoc.MailMerge.CreateDataSource('..\DataDoc.doc',,,'FirstName+ListSeparator+LastName'+..). - person Sertac Akyuz; 29.04.2012
comment
+1, просто примечание: я использовал TBookmarkStr целую вечность, но теперь я прочитал, что это устарело. но, с другой стороны, TBookmark не нужно освобождать память, так что разберись... :/ - person kobik; 22.10.2012
comment
@kobik - Спасибо за это. Я не знал, что происходит с TBookmark. Тогда я использовал D2007, и это был Pointer, который нужно было освободить. - person Sertac Akyuz; 22.10.2012