![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к закладкам в .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
как делаешь и как она в тривью попадает?