Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизДоступ к закладкам в .rtf Найти похожие ветки
← →
Dell3r © (2006-08-16 11:20) [0]Уважаемые мастера, подскажите есть ли возможность обращаться к закладкам документа? Документ в формате rtf отображается в RichEdit"e.
Другими словами делаю структуру документа и по щелчку в TreeView в RichEdit"e документ должен перелистнуть на определенный заголовок.
← →
clickmaker © (2006-08-16 11:58) [1]
> делаю структуру документа и по щелчку в TreeView
как делаешь и как она в тривью попадает?
← →
Dell3r © (2006-08-16 12:17) [2]Делаю пока через обычный поиск текста (заголовка) Потом прокручиваю 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. Поэтому строка сбивается. Еще боюсь, что когда нибудь часть текста будет соответствовать названию заголовка и неизвестно как себя поведет система. Поэтому хотелось бы использвать закладки.
← →
Dell3r © (2006-08-16 12:19) [3]В тревью TreeView.LoadFromFile(заранее подготовленный файл);
← →
clickmaker © (2006-08-16 12:33) [4]
> Dell3r © (16.08.06 12:19) [3]
не уверен что в ричэдит есть подобная функциональность. Разве что недокументированная..
← →
Dell3r © (2006-08-16 12:42) [5]Было бы замечательно если бы в Ворде сделать закладки, а потом в Delphi обращаться к ним. Так есть идеи?
← →
clickmaker © (2006-08-16 12:55) [6]
> Dell3r © (16.08.06 12:42) [5]
идеи? изучить формат РТФ на предмет как там хранятся закладки
← →
Dell3r © (2006-08-16 12:58) [7]Изучил. Только вот как к ним обращаться?.
Получается, что никому никогда не приходилось сталкиваться с навигацией в документе?
← →
clickmaker © (2006-08-16 13:23) [8]
> Изучил
ну и? значит ты можешь определить номер строки, где у тебя закладка?
← →
Dell3r © (2006-08-16 13:28) [9]Нет. там при просмотре в мемо все символы непонятно на какой строке. Ты же видел РТФ в текстовом варианте? Посему таким способом не получиться
← →
Ketmar © (2006-08-16 13:49) [10]нет в RichEdit такого. надо своё писать.
← →
clickmaker © (2006-08-16 14:55) [11]набросал на коленке за 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;
← →
Dell3r © (2006-08-21 15:55) [12]Спасибо. Проверим.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c