Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Таблицы в .rtf   Найти похожие ветки 

 
solo ©   (2004-04-27 20:09) [0]

Здравствуйте, подскажите, в формате .rtf предусмотрена возможность создавать таблицы? Если да, то как это сделать? Хотелось бы в RichEdit-е отображать таблицы, а потом сохранять все это дело в файл.


 
Курдль ©   (2004-04-27 20:25) [1]

Есть такая фишка. RTF оперирует простенькими тэгами типа \row \cell \line и т.п. Кроме того, имеет какой-то префикс типа описания шрифтов, чарсета и т.п.
Я делал такую фишку, но найти не могу - в инете гуляют описания стандарта RTF - ищи!


 
evvcom ©   (2004-04-28 01:05) [2]

Сделай что надо в Word и сохрани как rtf.


 
solo ©   (2004-04-28 10:05) [3]

2 evvcom :) мне такое не подходит, надо делать все программно. А кто-нибудь подскажите урл, где лежит описание формата .rtf и чтоб про таблицы было, а то у меня есть одно, так там о таблицах не говориться.


 
evvcom ©   (2004-04-28 10:07) [4]

Блин! Все разжевывать надо? Сохранишь из Word, потом откроешь и посмотришь, как это получилось. По аналогии напишешь программно.


 
solo ©   (2004-04-28 13:59) [5]

2 evvcom, прошу прошения, может плохо сформулировал. То что ты предлагал, я сделал в первую очередь, посмотрел, если разбираться голову сломать можно. А меня время сильно жмет, я диплом дописываю, хотелось бы уж сразу описание заиметь.


 
Курдль ©   (2004-04-28 14:09) [6]


> Блин! Все разжевывать надо?


Я попробовал в Яндексе поискать по фразе "Формат Rich Text (RTF)".
Вывалилось 3276 документов, первый же из которых оказался тем, что надо: "http://blackman.wp-club.net/docum/rtf.php"
Это что, сверхзадача, которую самому проделать нельзя? :(


 
ЮрийК ©   (2004-04-28 15:14) [7]

Сделай программно через Word, примеры ищи в MSDN.


 
Курдль ©   (2004-04-28 15:15) [8]


> Сделай программно через Word

И как это должно выгдядеть?


 
ЮрийК ©   (2004-04-28 15:21) [9]

В MSDN или воспользуйся поиском в интернете. Слова: Delphi, Word.Application, CreateOleObject.

wa := CreateOleObject("Word.Application");

и так далее, ищи примеры.


 
Курдль ©   (2004-04-28 15:23) [10]


> Сделай программно через Word


> wa := CreateOleObject("Word.Application");

Вы бы хоть добавляли к своим категоричным советам нечто навроде "а не попробовать ли..." или "возможно я ошибаюсь, но сделать можно и так..."! Особенно когда всерьез советуете человеку удалять гланды через ж... елудок! :(


 
ЮрийК ©   (2004-04-28 15:34) [11]

"evvcom ©   (28.04.04 01:05) [2]
Сделай что надо в Word и сохрани как rtf."

Всё что можно сделать в Word ручками, можно сделать и программно. Но нужно разбираться, там много объектов. Поэтому нужно найти наиболее подходящий пример и от него плясать.

например (на СИ):
открытие Doc файла и сохранение в HTML
BOOL DocToHtml(char* fIn, char* fOut) {

 // Convenient values declared as ColeVariants.
 COleVariant covTrue((short)TRUE),
             covFalse((short)FALSE),
             covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

 // Get the IDispatch pointer and attach it to the objWord object.
 _Application objWord;
 if (!objWord.CreateDispatch("Word.Application"))
 {
    return ERR_WORD_RUN;
 }
 Documents docs(objWord.GetDocuments());
 _Document doc;
   doc.AttachDispatch(docs.Open(
                          COleVariant(fIn,VT_BSTR),
                          covFalse,    // Confirm Conversion.
                          covTrue,     // ReadOnly.
                          covFalse,    // AddToRecentFiles.
                          covOptional, // PasswordDocument.
                          covOptional, // PasswordTemplate.
                          covFalse,    // Revert.
                          covOptional, // WritePasswordDocument.
                          covOptional, // WritePasswordTemplate.
                          covOptional, // Format. // Last argument for Word 97
                          covOptional, // Encoding // New for Word 2000/2002
                          covTrue      // Visible
                             )  // Close Open parameters
                             ); // Close AttachDispatch(Е)
   doc.SaveAs(COleVariant(fOut,VT_BSTR), COleVariant((short)8),
                          covOptional, covOptional, covFalse,
                          covOptional, covOptional, covOptional,
                          covOptional, covOptional, covOptional);
   objWord.Quit(covFalse, covOptional, covOptional);
 return OK;
}


 
Курдль ©   (2004-04-28 16:37) [12]


> Всё что можно сделать в Word ручками, можно сделать и программно.


ЗАЧЕМ? Если Вам понадобится в программе посчитать 2*2=4, вы что, по OLE полезете к Calculator.exe? А если Ворда на компе нет?


 
ЮрийК ©   (2004-04-28 17:08) [13]

Требуется не 2*2 посчитать, а таблицы создать и сохранить в RTF.
Это посерьёзнее будет.


 
Курдль ©   (2004-04-28 17:35) [14]


> Требуется не 2*2 посчитать, а таблицы создать и сохранить
> в RTF.
> Это посерьёзнее будет.


У меня этот код занял ~20 строк.


 
ЮрийК ©   (2004-04-28 17:49) [15]

Привели бы код в таком случае. Вместо вопроса зачем.


 
Курдль ©   (2004-04-28 17:53) [16]

Если там найдется парочка ссылок на константы из других модулей - я не виноват!

//******************************************************************************
// Функция создания образа файла RTF в виде таблицы, используемой, как источник
// данных слияния (MailMerge.DataSource) в MS Word
// Принимает TStringList с записанными в него данными. Каждая строка (Strings[i])
// предтавляет собой единицу данных. Причем группа первых строк служит заголовком
// в таблице. Количество колонок в таблице определяет аргумент colCount. Общее
// количество строк в StringList должно быть кратно числу колонок. Функция
// записывает текст RTF обратно в StringList и в случае успеха, - возвращает True
//******************************************************************************

unit uRTF;

interface

 uses Classes, Windows, Forms, SysUtils;

 function CreateRTF(StringList: TStringList; colCount: Integer): Boolean;

resourcestring
 filePrefix = "{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\froman"+
              "\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}{"+
              "\f1\froman\fcharset0 Times New Roman;}}"#13#10"\viewkind4\uc1"#13#10;
 rowPrefix = "\trowd\trgaph108\trleft-108";

 sArraySizeError = "Размер массива меньше количества колонок";
 sDivisionError = "Размер массива не делится на количество колонок";
 sError = "Ошибка";

implementation

function CreateRTF(StringList: TStringList; colCount: Integer): Boolean;
var x, y, i, ln: Integer;  s0, s, sResult: string;
begin
 ln := StringList.Count;
 Result := False;
 try
   if ln < colCount then Exception.Create(sArraySizeError);
   if (ln mod colCount) > 0 then  Exception.Create(sDivisionError);
   sResult := filePrefix;
   for y := 0 to (ln - 1) div colCount do
    begin
     sResult := sResult + rowPrefix;
     for x := 0 to colCount - 1 do sResult := sResult + "\cellx" + IntToStr(2108 + x * 2000) + " ";
     sResult := sResult + "\pard\intbl\f0\fs16 ";
     for x := 0 to colCount - 1 do
      begin
       s0 := StringList[y * colCount + x]; s := "";
       for i := 1 to Length(s0) do
        case s0[i] of
         #13:        s := s + "\line ";
         " ".."[","]".."z":  s := s + s0[i];
         #128..#255: s := s + "\""" + IntToHex(Ord(s0[i]), 2);
         "\","{","}": s := s + "\" + s0[i];
        end;
       sResult := sResult + s + "\cell ";
      end;
      sResult := sResult + "\row"#13#10;
    end;
   sResult := sResult + "\pard\par }";
   StringList.Text := sResult;
   Result := True;
 except
   on E: Exception do Application.MessageBox(PChar(E.Message), PChar(sError), MB_ICONSTOP);
 end
end;

end.



 
evvcom ©   (2004-04-28 23:38) [17]

Ну вы, блин, даете! Я про Word заикнулся только для того, чтобы посмотреть на результат. Как Word в rtf сгенерит таблицы. Перечитайте вопрос! Я совсем не намекал на то, чтобы через OLE лезть в Word, рисовать таблицы, а потом заставлять его все это сохранять в rtf, после чего этот rtf грузить в ReachEdit. Действительно так получается "удаление гланд через ж...елудок".

Повторяю еще раз, Word использовать только для того, чтобы увидеть какие именно и в каком порядке он сгенерирует тэги, о которых было упомянуто в [1] ответе.
Используйте для изучения готовые инструменты. Чего велосипеды изобретать?


 
Курдль ©   (2004-04-29 10:18) [18]


> Повторяю еще раз, Word использовать только для того, чтобы
> увидеть какие именно и в каком порядке он сгенерирует тэги,
> о которых было упомянуто в [1] ответе.
> Используйте для изучения готовые инструменты. Чего велосипеды
> изобретать?

Согласен! Но это когда не хватает документации.
А здесь же налицо готовая спецификация по формату RTF! Чего же боле?


 
evvcom ©   (2004-04-29 11:47) [19]

Очень часто работающий пример нагляднее документации. Правда, сейчас и в документациях примеров хватает. Так что ...
А автор вопроса вообще замолчал, то ли разобрался, то ли ему это уже не надо. А мы тут спорим.



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.056 c
1-1083160393
Dysan
2004-04-28 17:53
2004.05.16
массив байт в файл?


1-1083011006
MadSliMX
2004-04-27 00:23
2004.05.16
RxRichEdit. Глюки с кодировкой.


1-1083006539
MadSliMX
2004-04-26 23:08
2004.05.16
RxRichEdit. Замутить смайлы.


3-1082192120
diwin
2004-04-17 12:55
2004.05.16
запрос в Query Analyzer с выборкой из разных серверов


3-1082054430
td
2004-04-15 22:40
2004.05.16
onFilterRecord