Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131

Ускорить перенос данных из StringGrid-а в таблицу документа Word

28.05.2020, 20:08. Показов 3926. Ответов 38

Студворк — интернет-сервис помощи студентам
помогите пожалуйста, в вопросе потоков новенький , не совсем понимаю принцип работы и действия, есть код добавления из стринггрида в ворд (таблицу), но очень долго особенно если записей в стринггриде более 1000 строк
как реализовать побыстрее выполнение кода, читал про потоки это возможно , помогите пожалуйста, может кто сталкивался?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if(!fStart)
 {
  try
  {
   vVarApp=CreateOleObject("Word.Application");
   fStart=true;
   if (MessageDlg("У ВАС АКТИВИРОВАН WORD?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
 
            {
 
vVarApp.OlePropertySet("Visible",false);
vVarDocs=vVarApp.OlePropertyGet("Documents").
OleFunction("Open",  WideString(ExtractFileDir(ParamStr(0))+"\\1.doc")) ;
vVarTable=vVarDocs.OlePropertyGet("Tables").OleFunction("Item",1);
for (int i=1; i<StringGrid1->RowCount-1; i++){
for (int j=0; j<StringGrid1->ColCount-1; j++)
                {
   vVarCell=vVarTable.OleFunction("Cell",i+2,j+1);
   vVarCell.OleFunction("Select");
   vVarCell.OlePropertyGet("Range").
         OlePropertySet("Text", WideString(StringGrid1->Cells[j][i]));
         if (j%4==0) {
v=vVarTable.OlePropertyGet("Rows").OleFunction("Item",i+2).OleFunction("Select");
  vVarApp.OlePropertyGet("Selection").OleProcedure("InsertRowsBelow",1);
  ProgressBar1->Position +=1;
}}}
ProgressBar1->Position =0;
vVarApp.OlePropertySet("Visible",true);
                        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2020, 20:08
Ответы с готовыми решениями:

Добавление срок в таблицу Word при заполнении документа Word из данных Excel
Всем привет! Я новичок в этом деле и нужна помощь. Есть таблица Excel с данными на основании которого заполняется документ Word по...

Импорт данных из документа Word в таблицу Excel
Здравствуйте! Есть документ Word с большим количеством однотипных страниц с данными, необходимо эти данные перенести в таблицу Excel. ...

Импорт таблиц из документа Word в StringGrid
Доброго времени суток. Если у кого есть исходник программы которая импортирует таблицу из Word документа в StringGrid программы на...

38
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
29.05.2020, 11:18
А нужны потоки? Помогут? Не уверен, а вот проблем добавят - это точно. Нужно попробовать сначала записать все нужные данные в строку (или в массив, созданный через VarArrayCreate, я не помню, в каком виде хранится содержимое ячеек в вордовской таблице), и только потом один раз передать данные ворду, вместо того, чтобы дергать его для передачи данных каждой ячейки? Должно быть быстрее. Гораздо быстрее.
1
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
29.05.2020, 14:03  [ТС]
volvo, здравствуйте, а вы могли бы помочь или направить в русло где об этом почитать

Добавлено через 26 минут
volvo, VarArrayCreate
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Этот пример демонстрирует использование вариантных массивов. В этом
Например, создается, модифицируется, заполняется и освобождается вариантный массив.
* / 
void  __fastcall TForm1 :: Button1Click ( TObject * Sender)
{
    Массив вариантов ;
    int bounds [2] = {0, 9};
 
    / *
    Создать вариантный массив из 10 элементов, начиная с 0
    и заканчивается на 9. Массив содержит элементы типа integer
    * / 
    array = VarArrayCreate (bounds, 1, varInteger );
 
    // Увеличить длину вариантного массива
     VarArrayRedim (array, 49);
 
    MessageDlg (String («Variant array has») + IntToStr ( VarArrayDimCount (array)) +
        «размеры», mtInformation, TMsgDlgButtons () << mbOK, 0);
 
    // Переходим массив от нижних к верхним границам 
    для ( int i = VarArrayLowBound (array, 1); i <= VarArrayHighBound (array, 1); i ++)
    {
        // Поместить элемент I в индекс I
         VarArrayPut (array, i, & i, 0);
    }
 
    // Теперь читаем элементы массива 
    для ( int i = VarArrayLowBound (array, 1); i <= VarArrayHighBound (array, 1); i ++)
    {
        // Поместить элемент I в индекс I 
        if ( VarArrayGet (array, & i, 0)! = I)
            MessageDlg («Ошибка! В текущей позиции найден неверный элемент!»,
                mtError, TMsgDlgButtons () << mbOK, 0);
    }
 
    // Очистить вариантный массив
     VarClear (array);
}
помогите пожалуйста применить к стринггриду

Добавлено через 20 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
vVarArray = VarArrayCreate(Bounds , 3 , varVariant);
  
  for(int i = 0 ; i < Grid->RowCount ; ++ i)
  {
  for(int j = 0 ; j < Grid->ColCount ; ++ j)
  {
   AnsiString string = Grid->Cells[j][i];
   vVarArray.PutElement(string.IsEmpty() ? "" : string.c_str() , i + 1 , j + 1);
  }
  }      
  Variant vRange = getRange(Left , Top , Left + Grid->ColCount - 1 , Top + Grid->RowCount - 1);
  vRange.OlePropertySet("value" , vVarArray);
нашел такой код помогите разобраться -это то что нужно?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
29.05.2020, 14:15
Лучший ответ Сообщение было отмечено serg6789 как решение

Решение

Из твоего кода непонятно, что вообще тебе нужно, разбирайся сам. Но вот этим кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    if (!fStart)
    {
        Variant vVarApp = CreateOleObject("Word.Application");
        fStart = true;
        if (MessageDlg(L"У ВАС АКТИВИРОВАН WORD?", mtConfirmation,
            TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
        {
            vVarApp.OlePropertySet("Visible", true);
            Variant vVarDocs = vVarApp.OlePropertyGet("Documents").
                OleFunction("Open", WideString(ExtractFileDir(ParamStr(0)) + "\\1.doc"));
            Variant vVarTable = vVarDocs.OlePropertyGet("Tables").
                OleFunction("Item", 1);
 
            int rowCnt = vVarTable.OlePropertyGet("Rows").
                OlePropertyGet("Count");
            Variant selection = vVarTable.OlePropertyGet("Rows").
                OleFunction("Item", 1).OleFunction("Select");
            vVarApp.OlePropertyGet("Selection").
                OleProcedure("InsertRowsBelow", StringGrid1->RowCount - rowCnt);
            vVarTable.OleFunction("Select");
 
            String st = "";
            for (int i = 1; i < StringGrid1->RowCount; i++)
            {
                for (int j = 0; j < StringGrid1->ColCount; j++)
                {
                    st = st + StringGrid1->Cells[j][i] + "\t";
                }
                st = st + "\r\n";
            }
            Clipboard()->AsText = st;
            vVarApp.OlePropertyGet("Selection").OlePropertyGet("Range")
                .OleProcedure("Paste");
        }
    }
я только что добавил в таблицу Word-документа полностью содержимое грида из 5 столбцов и 7 тысяч строк (меньше, чем за 10 секунд на очень старой машине, просто интересно, сколько бы твоим первоначальным способом этот грид перемещался в Word). Итого: копируешь нужные ячейки грида, разделяя ихз символами табуляции, строки - последовательностями \r\n, добавляешь нужное количество пустых строк в таблицу, и просто копируешь данные.
2
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
29.05.2020, 14:43  [ТС]
моим способом 600 строк вышло 15 минут(((

Добавлено через 22 минуты
спасибо, я оценил быстродействие это бесподобно и очень круто, благодарю вас, а есть ли возможность в доковскую таблицу которая в файле 1.doc находится, заполнить ее с 3 строки таблицы так как первые две тсроки таблицы это "шапка"? спасибо.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
29.05.2020, 15:07
Лучший ответ Сообщение было отмечено serg6789 как решение

Решение

Значит, заменяем код:
C++
1
    vVarTable.OleFunction("Select");
, который выделяет всю таблицу, на код:
C++
1
2
3
4
5
6
7
8
9
// начинаем выделение с 3-ей строки таблицы 
Variant rng = vVarTable.OlePropertyGet("Rows").
    OleFunction("Item", 3).OlePropertyGet("Range");
// заканчиваем выделение строкой с номером StringGrid1->RowCount + 1,
// чтобы поместилось все содержимое грида
rng.OlePropertySet("End", vVarTable.OlePropertyGet("Rows").
    OleFunction("Item", StringGrid1->RowCount + 1).OlePropertyGet("Range").OlePropertyGet("End"));
// и вот теперь выделяем все, что нужно
rng.OleFunction("Select");
А дальше - как и было, Copy/Paste, должно сработать.
1
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
26.09.2020, 10:57  [ТС]
volvo, И звините пожалуйста , а как быть с зачеркнутым текстом, как его передать в ворд?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
26.09.2020, 13:04
Как любой другой RTF-текст:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void __fastcall CopyRTFToClipboard(TRichEdit *re)
{
    std::auto_ptr<TStringStream> ss(new TStringStream);
    re->Lines->SaveToStream(ss.get());
    AnsiString s = AnsiString(ss->DataString);
 
    // регистрируем формат RichText
    Word cfRTF = (Word)RegisterClipboardFormat(TEXT("Rich Text Format"));
    Clipboard()->Open();
    int nTextLen = (s.Length() + 1) * sizeof(TCHAR);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,nTextLen);
    if(hGlobal != NULL)
    {
        void *lpText = GlobalLock(hGlobal);
        memcpy(lpText,s.c_str(),nTextLen);
        Clipboard()->Clear();
        GlobalUnlock(hGlobal);
        Clipboard()->SetAsHandle(cfRTF,(int)hGlobal);
    }
    Clipboard()->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Variant vVarApp = CreateOleObject("Word.Application");
    vVarApp.OlePropertySet("Visible", true);
    Variant vVarDocs = vVarApp.OlePropertyGet("Documents").
        OleFunction("Open", WideString(ExtractFileDir(ParamStr(0)) + "\\1.doc"));
 
    CopyRTFToClipboard(RichEdit1);
    vVarApp.OlePropertyGet("Selection").OlePropertyGet("Range").
        OleProcedure("Paste");
    // ...
}
Вот результат:
Миниатюры
Ускорить перенос данных из StringGrid-а в таблицу документа Word  
2
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
26.09.2020, 16:15  [ТС]
volvo, я правильно понял, что из стринг грида сразу не получится , нужно пробежаться по колонкам стрин грида, из колонки перенести текст в ричэдит, а затем из ричь эдита уже вворд в таблицу, я правильно понял???
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
26.09.2020, 16:25
В StringGrid-е не хранится зачеркнутый текст, там хранится обычный, который при отрисовке перечеркивается там, где нужно. Этот текст в том виде, в котором он там хранится, перенесется безо всяких зачеркиваний.

Как вариант: хранить в гриде в свойстве Objects не просто список с координатами зачеркнутого текста, а еще и текст из RichEdit-а, полученный через TStringStream. Вот тогда этот текст можно будет использовать для занесения в Word.
1
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
26.09.2020, 17:10  [ТС]
volvo,
вот этот код у меня возвращает из стринггрида, зачеркнутый текст в ричэдит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm6::StringGrid1DblClick(TObject *Sender)
{
if ( roww!=0) {
     Form11->RichEdit1->Clear();
     Form11->RichEdit1->Lines->Add(StringGrid1->Cells[coll][roww]);
     TStringList *L = static_cast<TStringList*>(StringGrid1->Objects[coll][roww]);
     if(L)
    {
     for(int i = 0; i < L->Count; i++)
        {
        Form11->RichEdit1->SelStart=StrToInt(L->Names[i]);
        Form11->RichEdit1->SelLength=StrToInt(L->ValueFromIndex[i]);
        Form11->RichEdit1->SelAttributes->Style=Form11->RichEdit1->SelAttributes->Style<<fsStrikeOut;
        }
 
        }
     Form11->ShowModal();
 }
я думал так, у меня всего четыре колонки, я пробегаю циклом по первой колонке, переношу в ричэдит построчно, затем переношу из ричэдита в ворд так, кактит или могут возникнуть сложности???

Добавлено через 19 минут
Цитата Сообщение от volvo Посмотреть сообщение
Как вариант: хранить в гриде в свойстве Objects не просто список с координатами зачеркнутого текста, а еще и текст из RichEdit-а, полученный через TStringStream. Вот тогда этот текст можно будет использовать для занесения в Word.
просто не знаю как сразу записать при добавлении и изменении строки, а темболее темный лес как их достать эти записи
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
27.09.2020, 18:46
Кликните здесь для просмотра всего текста

Header
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.Grids.hpp>
 
class TObjClass : public TObject
{
public:
    String s;
    TStringList *L;
    TObjClass(AnsiString st, TStringList *AList) : s(st)
    {
        L = new TStringList;
        L->AddStrings(AList);
    }
};
 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TStringGrid *StringGrid1;
    TRichEdit *RichEdit1;
    TButton *Button1;
    TEdit *Edit1;
    TButton *Button2;
    TButton *Button3;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall Button3Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
 
    TStringList *lst;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
CPP файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <vcl.h>
#include <tchar.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <RichEdit.h>
#include <ComObj.hpp>
#include <StrUtils.hpp>
#include <Clipbrd.hpp>
#include <memory>
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
int pos;
int lon;
bool podcherk = false;
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->Focused();
    if (RichEdit1->SelText.Length()>0)
    {
        pos=RichEdit1->Lines->Strings[0].Pos(RichEdit1->SelText);
        lon=RichEdit1->SelText.Length();
        RichEdit1->SelText = RichEdit1->SelText + "*" + Edit1->Text;
        RichEdit1->SelStart = pos - 1;
        RichEdit1->SelLength = lon;
        RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsStrikeOut;
    }
 
    lst->Add(String().sprintf(_T("%d=%d"), pos - 1, lon));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    lst = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
    TStringGrid *g = static_cast<TStringGrid*>(Sender);
    TObjClass *obj = static_cast<TObjClass*>(g->Objects[ACol][ARow]);
    // TStringList *L = static_cast<TStringList*>(g->Objects[ACol][ARow]);
 
    g->Canvas->FillRect(Rect);
    String s = g->Cells[ACol][ARow];
    g->Canvas->TextOut(Rect.Left + 2, Rect.Top + 2, s);
    if(obj)
    {
        TStringList *L = obj->L;
 
        g->Canvas->Pen->Color = clRed;
        g->Canvas->Pen->Width = 2;
        for(int i = 0; i < L->Count; i++)
        {
            String st = L->Strings[i];
            g->Canvas->MoveTo(Rect.Left + 2 + g->Canvas->TextWidth(LeftStr(s, StrToInt(L->Names[i]))),
                2 + Rect.Top + 2 + (g->Canvas->TextHeight(s) / 2));
            g->Canvas->LineTo(Rect.Left + 2 + g->Canvas->TextWidth(LeftStr(s, StrToInt(L->Names[i]) + StrToInt(L->ValueFromIndex[i]))),
                2 + Rect.Top + 2 + (g->Canvas->TextHeight(s) / 2));
        }
    }
}
 
String GetRTF(TRichEdit *re)
{
    std::auto_ptr<TStringStream> ss(new TStringStream);
    re->Lines->SaveToStream(ss.get());
    return ss->DataString;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    int row = StringGrid1->Row;
    int col = StringGrid1->Col;
 
    StringGrid1->Cells[col][row] = RichEdit1->Text;
    StringGrid1->Objects[col][row] = // static_cast<TObject*>(new TStringList);
        new TObjClass(GetRTF(RichEdit1), lst);
    // static_cast<TStringList*>(StringGrid1->Objects[0][1])->AddStrings(lst);
    // Здесь можно очищать lst, его копия уже хранится в Objects соответствующей ячейки грида...
    StringGrid1->Invalidate();
}
 
void __fastcall CopyRTFToClipboard(String st)
{
    AnsiString s = AnsiString(st);
 
    // регистрируем формат RichText
    Word cfRTF = (Word)RegisterClipboardFormat(TEXT("Rich Text Format"));
    Clipboard()->Open();
    int nTextLen = (s.Length() + 1) * sizeof(TCHAR);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,nTextLen);
    if(hGlobal != NULL)
    {
        void *lpText = GlobalLock(hGlobal);
        memcpy(lpText,s.c_str(),nTextLen);
        Clipboard()->Clear();
        GlobalUnlock(hGlobal);
        Clipboard()->SetAsHandle(cfRTF,(int)hGlobal);
    }
    Clipboard()->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Variant vVarApp = CreateOleObject("Word.Application");
    vVarApp.OlePropertySet("Visible", true);
    Variant vVarDocs = vVarApp.OlePropertyGet("Documents").
        OleFunction("Open", WideString(ExtractFileDir(ParamStr(0)) + "\\1.doc"));
    Variant vVarTable = vVarDocs.OlePropertyGet("Tables").OleFunction("Item", 1);
 
    int rowCnt = vVarTable.OlePropertyGet("Rows").OlePropertyGet("Count");
    Variant selection = vVarTable.OlePropertyGet("Rows").
        OleFunction("Item", 1).OleFunction("Select");
    vVarApp.OlePropertyGet("Selection").
        OleProcedure("InsertRowsBelow", StringGrid1->RowCount - rowCnt);
 
    Variant rng = vVarTable.OlePropertyGet("Rows").
        OleFunction("Item", 2).OlePropertyGet("Range");
    rng.OlePropertySet("End", vVarTable.OlePropertyGet("Rows").
        OleFunction("Item", StringGrid1->RowCount).OlePropertyGet("Range").
        OlePropertyGet("End"));
    rng.OleFunction("Select");
 
    String st = "";
    String as = "";
    String tab = "\\tab";
    String newline = "\\par\r\n";
    for(int i = 1; i < StringGrid1->RowCount; i++)
    {
        for(int j = 0; j < StringGrid1->ColCount; j++)
        {
            TObjClass *obj = static_cast<TObjClass*>(StringGrid1->Objects[j][i]);
            String as = obj->s;
            as = as.Delete(1, as.Pos("\r\n"));
            as = as.Delete(as.LastDelimiter("}") - 12, as.Length());
            st = st + as + tab;
        }
        st = st + newline;
    }
    st = String("{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fnil\\fcharset204 Tahoma;}{\\f1\\fnil\\fcharset0 Tahoma;}}") +
        st + "}";
 
 
    CopyRTFToClipboard(st);
    vVarApp.OlePropertyGet("Selection").OlePropertyGet("Range").
        OleProcedure("Paste");
    ShowMessage("test");
}
//---------------------------------------------------------------------------


Результат:


Как-то так...
1
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
30.09.2020, 14:43  [ТС]
volvo, спасибо большое, огромное, вы выручаете, может я все-таки могу Вас отблагодарить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
30.09.2020, 14:53
Если очень хочется отблагодарить - свяжитесь со мной по почте или через систему ЛС, иначе нам обоим прилетит за нарушение Правил Форума
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
31.10.2020, 16:55  [ТС]
volvo,
Здравствуйте, как быть, если в строке "документ sd666N000" присутствуют английские символы, то при регистрации строки в формате rtf ,возникают проблемы. Если же английские символы взять в кавычки, проблем нет. как зарегистрировать строку с англ. символами , не беря их в кавычки ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
31.10.2020, 17:50
Ничего не знаю, никаких проблем без кавычек тоже нет:
Миниатюры
Ускорить перенос данных из StringGrid-а в таблицу документа Word  
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
31.10.2020, 18:21  [ТС]
volvo,
а если с пробелом документ sd666 N000 или роли не играет ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
31.10.2020, 18:40
Без разницы. Все равно записывается без ошибок.
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
31.10.2020, 20:23  [ТС]
volvo,
Спасибо большое! Это я чет затормозил
0
 Аватар для serg6789
4 / 6 / 1
Регистрация: 14.01.2019
Сообщений: 131
04.11.2020, 14:46  [ТС]
volvo,
Здравствуйте, подскажите пожалуйста, почему при выводе на печать в зачеркнутой строке может вылазить \\tab
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2020, 14:46
Помогаю со студенческими работами здесь

Перенос таблицы из StringGrid в exel и word
Нашёл вот это &quot;Для того, чтобы запустить приложение Word или Excel из программы на &quot;Borland C++ Builder&quot; достаточно...

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой матрицы есть цифровые значения. Есть Edit....

Перенос полей DbGrid в таблицу StringGrid
Доброго времени суток! Подскажите, пожалуйста, как в Delphi перенести определенные столбцы из таблицы DBGrid в таблицу StringGrid. ...

перенос текста из одного документа в таблицу в другом
Здравствуйте! При составлении таблицы немножко не угадали с количеством ячеек и получилось, то что на скрине. Можно ли, это как то...

Перенос текста информации из StringGrid и Memo в Microsoft Word маркерами
Здравствуйте. При разработке курсового проекта у меня возникла проблема с транспортировкой информации из Delphi в Microsoft Word. У меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru