Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить ссылку из RTF документа ? [D7]


KygECHuK ©   (2006-05-05 14:34:00) 

Мне необходимо написать утилиту корая убирала ссылки из документов  формата  rtf.  Как это можно сделать ?


KygECHuK   (2006-05-11 15:17:00) [1]

Если кому интересно:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Mask, ToolEdit, Gauges;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ggProgress: TGauge;
   OpenDialog1: TOpenDialog;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
const
 ld_HYPER_LINK = 'HYPERLINK';
 ld_FULL_BEGIN = '{\field{\*\fldinst';
 ld_STR_BEGIN  = '}{\fldrslt';
 ld_FULL_END   = '}}}';
var
 Form1: TForm1;

implementation

{$R *.dfm}
uses
 xtools;

procedure TForm1.Button1Click(Sender: TObject);
var
 HyperSizeS   : integer;
 FullBeginS   : integer;
 StrBeginS    : integer;
 FullEndS     : integer;
 FullBegin    : Integer;
 StrBegin     : integer;
 FullEnd      : integer;
 i, K, j      : Integer;
 L            : Int64;
 FileStream   : TFileStream;
 BigStr       : String;
 BuffStr      : String;
 FileName     : String;

 ForDebug     : String;
begin
 HyperSizeS := length(ld_HYPER_LINK);
 FullBeginS := length(ld_FULL_BEGIN);
 StrBeginS  := length(ld_STR_BEGIN);
 FullEndS   := Length(ld_FULL_END);

 if not OpenDialog1.Execute then exit;
 if not FileExists(OpenDialog1.FileName)then exit;
 FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite);
 try

   SetLength(BigStr, cardinal(FileStream.Size));
   FileStream.Read(pointer(Pchar(BigStr))^, FileStream.Size);
   ggProgress.Progress := 0;
   ggProgress.MaxValue := FileStream.Size - 1;
   for i := 1 to length(bigstr) do
   begin
     ggProgress.Progress := i;
     if copy(BigStr, i, HyperSizeS) = ld_HYPER_LINK then
     begin
       for k := i downto 1 do
       if copy(BigStr, k, FullBeginS) = ld_FULL_BEGIN then
       begin
         FullBegin := k;
         Break;
       end;
       for k := i to length(bigstr) do
       if copy(BigStr, k, StrBeginS) = ld_STR_BEGIN then
       begin
         StrBegin := k;
         Break;
       end;
       for j := k to length(bigstr) do
       if copy(BigStr, j, FullEndS) = ld_full_end then
       begin
         FullEnd := j;
         Break;
       end;
       BuffStr := '{' + copy(BigStr, StrBegin + 24, FullEnd - StrBegin - 24) + '}';
       Delete(BigStr, FullBegin, (FullEnd + 3) - FullBegin);
       Insert(BuffStr, BigStr, FullBegin);
     end;
   end;
   FileStream.Position := 0;
   FileStream.Write(pointer(Pchar(BigStr))^, length(bigStr));
 finally
   FileStream.Free;
 end;
end;

end.


KygECHuK   (2006-05-05 18:01:00) [2]

Да оно отличается и даже в нескольких местах и применение парсинга или замены текста слишком трудоёмко, я хочу найти болле простой способ, возможно какой-нибуть компонент или готовый алгоритм.


AlexanderMS   (2006-05-05 17:24:00) [3]

Я не смотрел, но оформление текста с гиперссылкой должно отличаться от такового без гиперссылки. Затем, я думаю, можно через поиск замену.


KygECHuK   (2006-05-05 17:04:00) [4]

Посмотрел. Сделала вывод что ине нужны более конкреьные рекомендации


AlexanderMS   (2006-05-05 16:49:00) [5]

Попробуйте открыть RTF-файл, содежащего гиперссылку, в блокноте и посмотрите, как он оформляется, а также, как оформляется обычный текст. Сравните 2 варианта и сделайте выводы!


Наверх

Титульная страница Поиск, карта сайта Написать письмо