VCL下的文字综合处理以及加密程序(含源码和讲解)
delphi吧
全部回复
仅看楼主
level 8
825082 楼主
一楼祭天。
以下是程序以及源代码。
链接: 百度网盘 密码: gvcm
2016年06月23日 11点06分 1
level 11
大号出了一点问题,用小号继续。
2016年06月23日 11点06分 3
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分 11
level 11
整个程序的精华除了这里就是加密部分了,这个算法比较诡异,不知道具体安全性,所以就不说了。
这个教程大概就这样吧……如果有什么代码上的问题,欢迎提问。(其实我也不知道具体说什么……)
源代码里面没有注释(别骂我……),命名习惯可能和大家的不一样(不要打我……),多多包涵。
可能缩进那一部分比较有用吧……
2016年06月23日 12点06分 13
level 11
另外,代码缩进是被度娘吞掉的……别怪我……
2016年06月23日 12点06分 14
吧务
level 14
欢迎分享
2016年06月23日 13点06分 15
1