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

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

Доступ к закладкам в .rtf [D7, WinXP]


Dell3r ©   (2006-08-16 11:20:00) 

Уважаемые мастера, подскажите есть ли возможность обращаться к закладкам документа? Документ в формате rtf отображается в RichEdit'e.
Другими словами делаю структуру документа и по щелчку в TreeView в RichEdit'e документ должен перелистнуть на определенный заголовок.


Dell3r   (2006-08-21 15:55:00) [1]

Спасибо. Проверим.


clickmaker   (2006-08-16 14:55:00) [2]

набросал на коленке за 20 минут. Ф-ия возвращает номер строки, на которой закладка.

function LocateBookmark(const FileName, BMName: string): integer;
var
 hFile: THandle;
 LSize, BytesRead, i: Cardinal;
 Buff: PByte;
 P: PByte;
 LineCount: integer;
 BMTag, ParTag, PageTag: string;
 StartCountLines: boolean;
begin
 Result := -1;
 BMTag := 'bkmkstart';
 ParTag := #13#10'\par';
 PageTag := ' \page';
 hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
   nil, OPEN_EXISTING, 0, 0);
 if (hFile <> INVALID_HANDLE_VALUE) then begin

   LSize := GetFileSize(hFile, nil);
   Buff := PByte(AllocMem(LSize));
   ReadFile(hFile, Buff^, LSize, BytesRead, nil);
   LineCount := 0;
   P := Buff;
   i := 0;
   StartCountLines := false;
   while (i < LSize) do begin

     if CompareMem(PChar(ParTag), P, Length(ParTag)) and not StartCountLines then begin
       StartCountLines := true;
     end;
     if CompareMem(PChar(BMName), P, Length(BMName)) then begin

       Dec(P, 10);
       if CompareMem(PChar(BMTag), P, Length(BMTag)) then begin

         Result := LineCount;
         break;
       end;
       Inc(P, 10);
     end;
     if (CompareMem(PChar(ParTag), P, Length(ParTag)) or
         CompareMem(PChar(PageTag), P, Length(PageTag))) and StartCountLines then begin
       Inc(LineCount);
    end;
     Inc(i);
     Inc(P);
   end;
   FreeMem(Buff);
   CloseHandle(hFile);
 end;
end;


Ketmar   (2006-08-16 13:49:00) [3]

нет в RichEdit такого. надо своё писать.


Dell3r   (2006-08-16 13:28:00) [4]

Нет. там при просмотре в мемо все символы непонятно на какой строке. Ты же видел РТФ в текстовом варианте? Посему таким способом не получиться


clickmaker   (2006-08-16 13:23:00) [5]


> Изучил

ну и? значит ты можешь определить номер строки, где у тебя закладка?


Dell3r   (2006-08-16 12:58:00) [6]

Изучил. Только вот как к ним обращаться?.
Получается, что никому никогда не приходилось сталкиваться с навигацией в документе?


clickmaker   (2006-08-16 12:55:00) [7]


> Dell3r ©   (16.08.06 12:42) [5]

идеи? изучить формат РТФ на предмет как там хранятся закладки


Dell3r   (2006-08-16 12:42:00) [8]

Было бы замечательно если бы в Ворде сделать закладки, а потом в Delphi обращаться к ним. Так есть идеи?


clickmaker   (2006-08-16 12:33:00) [9]


> Dell3r ©   (16.08.06 12:19) [3]

не уверен что в ричэдит есть подобная функциональность. Разве что недокументированная..


Dell3r   (2006-08-16 12:19:00) [10]

В тревью TreeView.LoadFromFile(заранее подготовленный файл);


Dell3r   (2006-08-16 12:17:00) [11]

Делаю пока через обычный поиск текста (заголовка) Потом прокручиваю Rich так, чтобы заголовок был первой строчкой

var
Find:String;
ypos:inetger;
Begin
Find:=TreeView1.Selected.Text;
//Тут собственно сам поиск.
If P=0 then
SendMessage(RichEdit1.Handle,EM_LINESCROLL,0,0) else
begin
 RichEdit1.SelStart:=P-Buff;
 ypos:= SendMessage(RichEdit1.Handle,EM_LINEFROMCHAR,RichEdit1.SelStart,0);
 SendMessage(RichEdit1.Handle,EM_LINESCROLL,0,-ypos);
 ypos:= SendMessage(RichEdit1.Handle,EM_LINEFROMCHAR,RichEdit1.SelStart,0);
 SendMessage(RichEdit1.Handle,EM_LINESCROLL,0, ypos);

Код пишу по памяти. Иногда у меня ypos увеличивается на 1. Поэтому строка сбивается. Еще боюсь, что когда нибудь часть текста будет соответствовать названию заголовка и неизвестно как себя поведет система. Поэтому хотелось бы использвать закладки.


clickmaker   (2006-08-16 11:58:00) [12]


>  делаю структуру документа и по щелчку в TreeView

как делаешь и как она в тривью попадает?


Наверх

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