level 11
procedure TMainForm.EditFIChange(Sender: TObject);
var
pf: TParaFormat2;
begin
if not IsEditSel then // 防止选取段落的时候触发
begin
FillChar(pf, SizeOf(TParaFormat2), #0);
pf.cbSize := SizeOf(TParaFormat2);
pf.dwMask := PFM_STARTINDENT or PFM_OFFSET; // 声明那些量将改变。
pf.dxStartIndent := EditFI.Position * 15; // 这个值是所有文本距离左端的值
pf.dxOffset := (EditLI.Position - EditFI.Position) * 15; // 这个值是第一行以外所有行距离左端的值
SendMessage(EditEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@pf));
// 使用传递消息的手段代替原本封装的函数,原本的函数容易出问题。
end;
EditEdit.SetFocus;
EditLFI.Caption := '首行:' + IntToStr(EditFI.Position);
end;
这是设置首行缩进的代码。
2016年06月23日 11点06分
4
level 11
procedure TMainForm.EditLIChange(Sender: TObject);
var
pf: TParaFormat2;
begin
if not IsEditSel then
begin
FillChar(pf, SizeOf(TParaFormat2), #0);
pf.cbSize := SizeOf(TParaFormat2);
pf.dwMask := PFM_OFFSET;
pf.dxOffset := (EditLI.Position - EditFI.Position) * 15;
SendMessage(EditEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@pf));
end;
EditEdit.SetFocus;
EditLLI.Caption := '左侧:' + IntToStr(EditLI.Position); // 这个用来在GUI上标识
end;
左端缩进原理类似。
2016年06月23日 11点06分
5
level 11
procedure TMainForm.EditRIChange(Sender: TObject);
var
pf: TParaFormat2;
begin
if not IsEditSel then
begin
FillChar(pf, SizeOf(TParaFormat2), #0);
pf.cbSize := SizeOf(TParaFormat2);
pf.dwMask := PFM_RIGHTINDENT;
pf.dxRightIndent := (EditRI.MAX - EditRI.Position) * 15; // 这个值代表所有文本距离右端的值。
SendMessage(EditEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@pf));
end;
EditEdit.SetFocus;
EditLRI.Caption := '右侧:' + IntToStr(EditRI.MAX - EditRI.Position);
end;
右端缩进需要用到一个新量,原理类似。
2016年06月23日 11点06分
6
level 11
procedure TMainForm.EditPBChange(Sender: TObject);
var
pf: TParaFormat2;
begin
FillChar(pf, SizeOf(paraformat2), #0);
pf.cbSize := SizeOf(paraformat2);
pf.dwMask := PFM_SPACEBEFORE;
pf.dySpaceBefore := EditPB.Position * 10; // 段前空出的值
SendMessage(EditEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@pf));
EditEdit.SetFocus;
EditLPB.Caption := '段前:' + IntToStr(EditPB.Position);
end;
procedure TMainForm.EditPAChange(Sender: TObject);
var
pf: TParaFormat2;
begin
FillChar(pf, SizeOf(paraformat2), #0);
pf.cbSize := SizeOf(paraformat2);
pf.dwMask := PFM_SPACEAFTER;
pf.dySpaceAfter := EditPA.Position * 10; // 段后空出的值
SendMessage(EditEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@pf));
EditEdit.SetFocus;
EditLPA.Caption := '段后:' + IntToStr(EditPA.Position);
end;
段前、段后的空格与缩进使用的命令相类似。
2016年06月23日 11点06分
7
level 11
该程序通过与前后文不同的颜色识别超链接。
超链接识别如下
procedure TMainForm.EditLinkClick(Sender: TObject);
var
i, s, a, b: Integer;
cl: TColor;
str: string;
begin
with EditEdit do
begin
str := string(Text).Replace(
#$D#
$A, #$D, [rfReplaceAll]); //为了配合SelStart
LinkEnable := False;
EditEdit.Cursor := crDefault;
cl := SelAttributes.Color;
s := SelStart;
if s > 0 then
b := Pos(#$D, str, s)
else
b := Pos(#$D, str);
if b = 0 then
b := Length(str) + 1;
a := 0;
for i := s downto 1 do
if str[i] = #$D then
begin
a := i;
Break;
end;
while (SelAttributes.Color = cl) and (SelStart < b - 1) do
SelStart := SelStart + 1;
if SelAttributes.Color <> cl then
SelStart := SelStart - 1;
b := SelStart;
SelStart := s;
repeat
SelStart := SelStart - 1;
until (SelAttributes.Color <> cl) or (SelStart <= a);
a := SelStart;
SelLength := b - a;
FindLink;
end;
end;
超链接的内容应为:
富文本中:其所在笔记页的组件的标题。
附图文本中:其中附图的标题,其所在笔记页的组件的标题。
富文本组中:其中成员的标题,其所在笔记页的组件的标题。
增强的超链接:
格式:附图文本标题.附图的标题。
这种格式的超链接能够提取其他附图文本组件中的附图。
以下是具体实现
procedure FindLink;
var
str, sub: string;
i: Integer;
begin
str := MainForm.EditEdit.SelText;
i := Pos('.', str);
if (i > 0) and (Length(str) > i) then
begin
sub := Copy(str, i + 1, Length(str) - i);
str := Copy(str, 1, i - 1);
FindPageEdit(str, sub); // 这个是强化的超链接,支持.操作符的图像超链接
end
else
case EditModiType of
1:
FindPageEdit(str);
2:
if not FindPageGEdit(str) then
FindPageEdit(str);
3:
if not FindPageMEdit(str) then
FindPageEdit(str);
end;
MainForm.EditEdit.SelLength := 0;
end;
function FindPageEdit(str: string): Boolean;
var
gd: TPanel;
i: Integer;
begin
gd := TPanel(ModiPanel.Parent);
for i := 0 to gd.ControlCount - 1 do
begin
if TEdit(TPanel(gd.Controls[i]).Controls[1]).Text = str then // gd.Controls[i]).Controls[1]这个控件中含有组件标题
begin
MainForm.EditBackClick(nil); //相当于手动操作返回以及进入
ModiPanel := TPanel(gd.Controls[i]);
ModiObj := ModiPanel.Controls[0];
PageMultiView;
Exit(True);
end;
end;
Exit(False);
end;
2016年06月23日 12点06分
9
level 11
function FindPageEdit(str, sub: string): Boolean;
var
gd: TPanel;
i, j: Integer;
begin
gd := TPanel(ModiPanel.Parent);
for i := 0 to gd.ControlCount - 1 do
begin
if (TPanel(gd.Controls[i]).Tag = 3) and
(TEdit(TPanel(gd.Controls[i]).Controls[1]).Text = str) then
with TPageControl(TPanel(gd.Controls[i]).Controls[0]) do
begin
for j := 1 to PageCount - 1 do
begin
if Pages[j].Hint = sub then
begin
TImage(Pages[j].Controls[0]).OnDblClick(Pages[j].Controls[0]);
Exit(True);
end;
end;
end;
end;
Exit(False);
end;
function FindPageGEdit(str: string): Boolean;
var
i: Integer;
begin
with MainForm.GEditG do
for i := 0 to ControlCount - 1 do
if Controls[i] is TImage then
if TEdit(FindControl(Controls[i].Tag)).Text = str then
begin
TImage(Controls[i]).OnDblClick(Controls[i]);
Exit(True);
end;
Exit(False);
end;
function FindPageMEdit(str: string): Boolean;
var
i: Integer;
begin
with MainForm.MEditList do
for i := 0 to Items.Count - 1 do
if Items[i] = str then
begin
ItemIndex := i;
OnClick(nil);
Exit(True);
end;
Exit(False);
end;
这是另外的超链接操作函数。
2016年06月23日 12点06分
10
level 11
整个程序的精华除了这里就是加密部分了,这个算法比较诡异,不知道具体安全性,所以就不说了。
这个教程大概就这样吧……如果有什么代码上的问题,欢迎提问。(其实我也不知道具体说什么……)
源代码里面没有注释(别骂我……),命名习惯可能和大家的不一样(不要打我……),多多包涵。
可能缩进那一部分比较有用吧……
2016年06月23日 12点06分
13