by tinyANT on 三月 24, 2009, under FASTREPORT, 包裹, 民本, 碎末, 1,758 views

写在前面的话:翻译水平有限,只为更加方便查阅和使用,如果翻译不准确的地方欢迎指正,资料来源于FastReport官方网站。
一、使用TfrxReport 组件工作
1、加载并存储报表
默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中。多数情况下,无须再操作,因而你就不必采用特殊方法加载报表。如果你决定在文件中存储报表窗体或者是数据库的

Blob字段(他提供了非常大的弹性,你能够在非编译程序中修改),你必须使用“TfrxReport”提供的加载和存储方法。
function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;
从一个给定名字文件中加载报表。如果第二个参数等于“True”并且文件没找到,那么他会触发一个异常。如果文件加载成功,他返回“True”。

procedure LoadFromStream(Stream: TStream);
从流中加载报表。

procedure SaveToFile(const FileName: String);
用特殊名称文件存储报表。

procedure SaveToStream(Stream: TStream);
把报表存在流中。

例如:
Pascal:
frxReport1.LoadFromFile(’c:1.fr3′);
frxReport1.SaveToFile(’c:2.fr3′);

C++:
frxReport1->LoadFromFile(”c:1.fr3″);

frxReport1->SaveToFile(”c:2.fr3″);

2.设计报表
通过“TfrxReport.DesignReport”方法调用报表设计器。你必须在你的项目中包含报表设计器(必要条件是:要么使用“TfrxDesigner”组件,要么增加“frxDesgn”单元到uses

列表)
“DesigReport”方法接受两个默认参数:
procedure DesignReport(Modal: Boolean = True; MDIChild: Boolean = False);
Modal参数决定设计器是否被模态,MDIChild参数允许把设计器窗体作为一个MDI子窗体。

例如:
frxReport1.DesignReport;

3.运行报表
应用下面两个“TfrxReport”方法中的一个启动报表:
procedure ShowReport(ClearLastReport: Boolean = True);
启动报表并在预览窗体中显示。如果“ClearLastReport”参数等于“False”,报表将会增加先前的一个报表结果,否则清除前一个报表结构。

function PrepareReport(ClearLastReport: Boolean = True): Boolean;
启动报表,没有打开预览窗体,参数赋值与“ShowReport”方法同名。如果报表构造成功,他返回“True”。

多数情况下,使用第一种方法更为方便一些。在报表被构造的同时,他会立刻显示一个预览窗体。

当需要增加另一个报表到前一个报表中的时候,“ClearLastReport”参数显得方便些。(此类技术用于批量报表打印)。

例如:
frxReport1.ShowReport;

4.预览报表
使用两种途径显示一个报表是可能的:两者都是调用“TfrxReport.ShowReport”方法(先前描述过了),或者使用“TfrxReport.ShowPreparedReport”方法来帮助实现。在第二

种情况下,报表构造没有被执行,但显示了一个完成的报表。也就是说,你要么在“PreparedReport”方法帮助下构造他,要么在构造前从文件中加载报表(查看“加载/存储完

成的报表”)

例如:

Pascal:

if frxReport1.PrepareReport then
frxReport1.ShowPreparedReport;

C++:

if(frxReport1->PrepareReport(true))
frxReport1->ShowPreparedReport();

在这种情况下,报表构造器先被完成了,并显示在预览窗体中。构造一个庞大的报表可能要花费很多时间,那就是为什么使用“ShowReport”非等时同步方法会好于

“PrepareReport/ShowPreparedReport”方法。你可以通过“TfrxReport.PreviewOptions”属的缺省值设定预览参数值。(这句翻译的不够好,请参考原文)

原文参考:In this case, report construction is finished first, and after that it is displayed in the preview window. Construction of a large report can take

a lot of time, and that is why it is better to use the “ShowReport anisochronous” method, than the “PrepareReport/ShowPreparedReport” one. One can assign

preview settings by default via the “TfrxReport.PreviewOptions” property.

5、打印报表
大多数情况下,你可以从预览窗体打印报表。要人工打印报表,你应该使用“TfrxReport.Print”方法,例如:

frxReport1.LoadFromFile(…);

frxReport1.PrepareReport;

frxReport1.Print;

同时,你可以在显示的打印对话框中设置打印参数,你也可以使用默认设定值。取消打印对话框,请参考“TfrxReport.PrintOptions”属性帮助

6.载入并存储报表
这个功能可以在预览窗口中执行。也可以使用手工方法执行,帮助参考“TfrxReport.PreviewPages”方法:
function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean;

procedure SaveToFile(const FileName: String);

procedure LoadFromStream(Stream: TStream);

procedure SaveToStream(Stream: TStream);
赋值和参数化类似与TfrxReport相应的方法。文件包含了完成的报表,默认情况下以“FP3”为扩展名。

例如:
Pascal:
frxReport1.PreviewPages.LoadFromFile(’c:1.fp3′);
frxReport1.ShowPreparedReport;

C++:
frxReport1->PreviewPages->LoadFromFile(”c:1.fp3″);
frxReport1->ShowPreparedReport();

注意,完成的报表加载完毕后,预览方法是通过“ShowPreparedReport” 方法执行的。

7.导出报表
他可以从预览窗口中执行。也可以手动操作,通过“FfrxReport.Export”方法,及这个方法中的参数,你可以导出你想要导出的文件类型:

frxReport1.Export(frxHTMLExport1);

导出过滤组件必须是有效的(你必须把他们放到你项目中的窗体上)并调整正确。

The export filter component must be available (you must put it on the form of your project) and be adjusted correctly.

8.创建自定义预览窗体
FastReport在标准的预览窗口中显示报表。如果因为某些原因而不适合你,你可以创建一个自定义预览窗体。为了这个目的,需要设计FastReport组件面板中的“TfrxReport”组

件。要显示报表,TfrxReport.Preview方法应该连接到这个组件。

在使用TfrxPreview组件的时候,有两个典型的问题。他不会处理按键(箭头,PgUp,PgDown等等)和鼠标滚轮(如果有的话)。要让TfrxPreview同按键工作,设置焦点给他(他

是可以做到的,例如,在窗体的OnShow事件句柄中)

frxPreview.SetFocus;

要让TfrxPreview同鼠标滚轮工作,你必须创建OnMouseWheel事件句柄,并且调用TfrxPreview.MouseWheelScroll方法。

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
frxPreview1.MouseWheelScroll(WheelDelta);
end;

9.建立复合报表(批量打印)
在某些情况下,需要立刻组织几个报表打印,或者在一个打印预览窗体中封装并呈现几个报表。要执行这些,在FastReport中有些工具能够允许建立一个新的报表附加在一个

已经存在的报表上。“TfrxReport.PrepareReport”方法中有一个选项“ClearLasReport”布尔类型参数,默认情况下他等于True,这个参数定义了是否有必要在建立报表时清除

前一个报表。下面的方法展示了如何从两个报表中建立一个批量报表:
Pascal:

frxReport1.LoadFromFile(’1.fr3′);
frxReport1.PrepareReport;
frxReport1.LoadFromFile(’2.fr3′);
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport;

C++:

frxReport1->LoadFromFile(”1.fr3″);
frxReport1->PrepareReport(true);
frxReport1->LoadFromFile(”2.fr3″);
frxReport1->PrepareReport(false);
frxReport1->ShowPreparedReport();
我们加载并建立第一个报表,但并没有显示他。然后我们加载第二个报表到同一个TfrxReport对象,并使用“ClearLastReport”参数,让他等于False。这就允许第二个报表

附加在先前建立的报表之后。接下来,我们在预览窗口中显示一个完成的报表。

9.1 复合报表中的页数
你可以使用“Page”,“Page#”,“TotalPages”和“TotalPages#”系统变量显示页数或总页数,在复合报表中,这些变量以下面的方式工作:
Page – 当前报表页数
Page# – 批量报表页数
TotalPages – 当前报表总页数(报表必须两遍)
Totalpages# – 批量报表总页数

9.2 合并符合报表页数
正如上面所说的,报表设计页中的“PrintOnPrevousPage”方法让你在打印报表的时候使用前一页的剩余空间接合报表。在复合报表中,允许你在前一个报表的最后一页的剩

余空间创建一个新的报表。要执行这个,要使能每一个连续报表的第一个设计页“PrintOnPreviousePage”属性

10.交互报表
在交互报表中,你可以在预览窗口定义任意报表对象的鼠标单击反应。例如,一个用户能够单击数据线,结果运行一个带有选择线的明细数据。
任何报表都能交互。要执行他,你仅仅需要创建TfrxReport.OnClickObject事件句柄。下面代码是这个事件句柄的示例:
Pascal:

procedure TForm1.frxReport1ClickObject(Page: TfrxPage; View: TfrxView;
Button: TMouseButton; Shift: TShiftState; var Modified: Boolean);
begin
if View.Name = ‘Memo1′ then
ShowMessage(’Memo1 contents:’ + #13#10 + TfrxMemoView(View).Text);
if View.Name = ‘Memo2′ then
begin
TfrxMemoView(View).Text := InputBox(’Edit’, ‘Edit Memo2 text:’, TfrxMemoView(View).Text);
Modified := True;
end;
end;

C++:
void __fastcall TForm1::frxReport1ClickObject(TfrxView *Sender,
TMouseButton Button, TShiftState Shift, bool &Modified)
{
TfrxMemoView * Memo;
if(Memo =  dynamic_cast <TfrxMemoView *> (Sender))
{
if(Memo->Name == “Memo1″)
ShowMessage(”Memo1 contents:nr” + Memo->Text);
if(Memo->Name == “Memo2″)
{
Memo->Text = InputBox(”Edit”, “Edit Memo2 text:”, Memo->Text);
Modified = true;
}
}
}

在对象的单击事件句柄上,你可以做如下事情:
- 修改一个对象或页的内容,传递句柄(结果,被修改的将被特殊标记,因此修改的内容应该引起重视);
- 由于使用重构或重新建立报表,调用TfrxReport.PrepareReport方法

在此例中,点击名字为memo1对象的结果显示这个对象内容的消息。当点击memo2是显示一个对话框,这个对象的内容可能被修改。设置Modified标志为True,允许保持和显示变更

同样的方法,单击事件可以被定义成不同的响应。例如,运行一个新报表。如下注释是必要的。在FastReport3版本中,一个报表组件可以在一个预览窗口中显示唯一的报表(不像

FastReport2.x版本)。那就是为什么一个报表预览窗也会在分开的对象中运行一个报表,或者是同一个对象,但当前报表必须被抹除。

关于给终端用户一个可单击对象提示定位,在预览窗口中,鼠标经过一个可单击对象的时候,我们可以修改鼠标的光标。要做到这些,在报表设计器上选择一个要设计的对象并设置

他的cursor属性为不同于crDefault的某个值。

更多的细节涉及到定义的单击对象。在简单报表中,可以依照对象的名字或他的内容来定义。然而,这就不能更多的执行可修改的事例。例如,一个明细报表应当在一个数据选择

行被创建。一个用户单击了内容为12的memo1对象。数据行让这个对象参考什么?那就是为什么你应当知道主键了,主键用于明确的标识这一行。FastReport能够赋值一个字串,包

含任意数据(在我们的事例主键数据中),对于每个报表对象,这个字串存储在TagStr属性中。

让我们来通过一个报表的例子来举例说明,这个报表包含在FastReportDemo.exe-’Simple list’示例中。这是一个公司的客户列表,包含诸如客户名称,地址,联系人等数据。数

据源是来自DBDEMOS演示数据库的Customer.db表。这个表有一个主键,CustNO字段,他没有出现在报表中。我们的任务是终止他通过参考单击完成报表上的任意对象记录他,这就

意味着要获取主键的值,要执行此项操作,就要为所有对象的TagStr属性加入值,依赖于主数据栏:
[Customers."CustNo"]

在报表建立期间,使用相同的方法计算TagStr属性内容,同时计算文本对象的内容;这就意味着变量值会替代所有变量的位置。变量细节使用方括号括起来。那就是为什么行值

是’1005′, ‘2112′等类似值了。在报表建立后,包含TagStr属性对象的类型取决与主数据栏。一个简单的从字串到整形的转换就会提供给我们一个主键的值,这也是所需记录能够

找到的主键。

如果主键是复合的(包含多个字段),TagStr属性的内容可能是如下值:
[Table1."Field1"];[Table1."Field2"]

在构造一个报表完成后,TagStr属性包含“1000;1”类型值, 此值不同比相同要好。

11.从代码中存取报表对象
报表对象(例如:report page, band, memo-object)是不能在你的代码中直接存取的。这就意味着你不能通过名字寻址对象。例如,当你在你的窗体上寻址一个按钮。要寻址一

个对象,在TfrxReport.FindObject方法中找到帮助:

Pascal:
var
Memo1: TfrxMemoView;
Memo1 := frxReport1.FindObject(’Memo1′) as TfrxMemoView;

C++:
TfrxMemoView * Memo =
dynamic_cast <TfrxMemoView *> (frxReport1->FindObject(”Memo1″));

然后,你就能够寻址对象的属性和方法。你也使用“TfrxReport.Pages”属性寻址报表页。

Pascal:
var
Page1: TfrxReportPage;
Page1 := frxReport1.Pages[1] as TfrxReportPage;

C++:
TfrxReportPage * Page1 = dynamic_cast <TfrxReportPage *> (frxReport1->Pages[1]);

12.从代码中创建报表
作为一项规则,你将在设计器中创建多数报表。然而,在某些情况下(例如,当报表窗体未知的时候),使用代码手工创建一个报表是是十分必要的。
想要手工创建一个报表,你需要执行下面的顺序步骤:
- 清除报表组件
- 添加数据源
- 添加数据页
- 添加报表页
- 添加栏页
- 设置栏属性,接着把他们同数据相连
- 在每个栏上加入对象
- 设置对象属性,接着把他们同数据相连

让我们来检查一下创建一个简单报表的类型列表。假设我们拥有如下组件:frxReport1: TfrxReport and frxDBDataSet1: TfrxDBDataSet(最后一个连接到DBDEMOS数据,

Customer.db表)。我们的报表将包含一个带有报表标题和主数据栏的页。在报表标题栏上有一个带有“Hellow FastReport”文本的对象,主数据栏包含一个带有连接到“CustNo”

字段的对象。

Pascal:

var
DataPage: TfrxDataPage;
Page: TfrxReportPage;
Band: TfrxBand;
DataBand: TfrxMasterData;
Memo: TfrxMemoView;

{ 清除报表 }
frxReport1.Clear;
{ 为报表添加数据集到可存取的列表中 }
frxReport1.DataSets.Add(frxDBDataSet1);

{ 添加”Data”页 }
DataPage := TfrxDataPage.Create(frxReport1);

{ 添加页 }
Page := TfrxReportPage.Create(frxReport1);
{ 创建唯一名称 }
Page.CreateUniqueName;
{ 设置默认字段大小, 纸张和打印方向 }
Page.SetDefaults;
{ 修改纸张方向 }
Page.Orientation := poLandscape;

{ 添加一个报表标题栏 }
Band := TfrxReportTitle.Create(Page);
Band.CreateUniqueName;
{ it is sufficient to set the ?Top? coordinate and height for a band }
{ both coordinates are in pixels }
Band.Top := 0;
Band.Height := 20;

{ 为标题栏添加一个对象 }

Memo := TfrxMemoView.Create(Band);
Memo.CreateUniqueName;
Memo.Text := ‘Hello FastReport!’;
Memo.Height := 20;
{ 这个对象将伸展坐标到栏的宽度 }
Memo.Align := baWidth;

{ 添加主数据栏 }
DataBand := TfrxMasterData.Create(Page);
DataBand.CreateUniqueName;
DataBand.DataSet := frxDBDataSet1;
{ 顶端的调整应当比先前加入栏的顶部+高度大一些 }
DataBand.Top := 100;
DataBand.Height := 20;

{ 在主数据栏上添加一个对象 }
Memo := TfrxMemoView.Create(DataBand);
Memo.CreateUniqueName;
{ 连接数据 }
Memo.DataSet := frxDBDataSet1;
Memo.DataField := ‘CustNo’;
Memo.SetBounds(0, 0, 100, 20);
{ 调整文本到右侧的对象边缘 }
Memo.HAlign := haRight;

{ 显示报表 }
frxReport1.ShowReport;

C++:

TfrxDataPage * DataPage;
TfrxReportPage * Page;
TfrxBand * Band;
TfrxMasterData * DataBand;
TfrxMemoView * Memo;

// 清除报表
frxReport1->Clear();

// 在报表上添加一个数据集到数据集存取列表
frxReport1->DataSets->Add(frxDBDataset1);

// 添加“数据”页
DataPage = new TfrxDataPage(frxReport1);

// 添加一页
Page = new TfrxReportPage(frxReport1);

// 创建一个不重复的名称
Page->CreateUniqueName();

// 设置域大小, 纸张和默认的打印方向
Page->SetDefaults();

// 修改纸张的打印方向
Page->Orientation = poLandscape;

// 增加一个报表标题栏
Band = new TfrxReportTitle(Page);
Band->CreateUniqueName();

// 为栏充分设置顶部坐标和高度
// 在像素上包含坐标
Band->Top = 0;
Band->Height = 20;

// 在报表标题栏加入一个对象
Memo = new TfrxMemoView(Band);
Memo->CreateUniqueName();
Memo->Text = “Hello FastReport!”;
Memo->Height = 20;

// 此对象将会被按照栏的宽度延展
Memo->Align = baWidth;

// 添加主数据栏
DataBand = new TfrxMasterData(Page);
DataBand->CreateUniqueName();

DataBand->DataSet = frxDBDataset1;
// 顶部坐标应该大于前边添加栏的顶部坐标+高度
DataBand->Top = 100;
DataBand->Height = 20;

// 主数据上加入一个对象
Memo = new TfrxMemoView(DataBand);
Memo->CreateUniqueName();
// 连接到数据

Memo->DataSet = frxDBDataset1;
Memo->DataField = “CustNo”;
Memo->SetBounds(0, 0, 100, 20);

// 调整文本到右侧对象的空白
Memo->HAlign = haRight;
// 显示报表
frxReport1->ShowReport(true);

让我们来解释一些细节:
所有在报表中使用的数据集都必须添加到数据源列表中,在我们示例中,是用frxReport1.DataSets.Add(frxDBDataSet1)这一行执行的。否则,报表就不会工作。
数据页对于插入内部数据集是必要的,例如TfrxADOTable。这些数据集只能放在数据页。
调用Page.SetDefaults不是必须的,因为在这个案例中页A4纸张设置和页边距都是0毫米。默认值设置10毫米页边距,并捕获打印机页大小和对齐方式。
在增加栏到页面的同时,你要确认他们没有互相重叠在一起。要执行他,顶部和高度的坐标是相似的。总是要在设计器中定位相同的位置的。

对象的坐标和大小是以像素为单位的,因为所有对象的left, Top, Width和Height属性都拥有扩展类型,你能够指出非整形值。下面常量用于转化像素到厘米和英寸:
fr01cm = 3.77953;
fr1cm  = 37.7953;
fr01in = 9.6;
fr1in  = 96;

例如,一个栏的高度等于5毫米如下设定:
Band.Height := fr01cm * 5;
Band.Height := fr1cm * 0.5;

12.代码中创建对话框
我们知道,报表可以包含对话框窗体。下面的例子展示了如何创建一个带有OK按钮的对话框窗体:

Pascal:

{ for working with dialogue objects the following unit should be used }

uses frxDCtrl;

var
Page: TfrxDialogPage;
Button: TfrxButtonControl;

{ 添加页 }
Page := TfrxDialogPage.Create(frxReport1);
{ 创建唯一名称 }
Page.CreateUniqueName;
{ 设置大小 }
Page.Width := 200;
Page.Height := 200;
{ 设定位置 }
Page.Position := poScreenCenter;

{ 添加一个按钮 }
Button := TfrxButtonControl.Create(Page);
Button.CreateUniqueName;
Button.Caption := ‘OK’;
Button.ModalResult := mrOk;
Button.SetBounds(60, 140, 75, 25);

{ 显示报表 }
frxReport1.ShowReport;

C++:

//使用对话框对象工作,会用到下面的单元

#include “frxDCtrl.hpp”

TfrxDialogPage * Page;
TfrxButtonControl * Button;

//添加一页
Page = new TfrxDialogPage(frxReport1);

//创建唯一名称
Page->CreateUniqueName();

//设置大小
Page->Width = 200;
Page->Height = 200;

//设定位置
Page->Position = poScreenCenter;

// 添加一个按钮
Button = new TfrxButtonControl(Page);
Button->CreateUniqueName();
Button->Caption = “OK”;
Button->ModalResult = mrOk;
Button->SetBounds(60, 140, 75, 25);

//显示报表
frxReport1->ShowReport(true);

转载于:https://www.cnblogs.com/djcsch2001/archive/2010/07/09/2035701.html

FastReport4.6程序员手册_翻译 转相关推荐

  1. FastReport4.6程序员手册_翻译

    一.使用TfrxReport 组件工作 1.加载并存储报表 默认情况下,报表窗体同项目窗体构存储在同一个DFM文件中.多数情况下,无须再操作,因而你就不必采用特殊方法加载报表.如果你决定在文件中存储报 ...

  2. unix程序员手册_推荐几本实惠电子书,程序员读的经典书都有,比如deep learning...

    小编挑了几本大家耳熟能详的经典电子书,希望您能喜欢.四折的价格小编都用红框标注出来喽!!!祝您阅读愉快!以下推荐的9本电子书均由异步社区出品,如需要请移步https://www.epubit.com/ ...

  3. Cocos2d-x程序员手册(ProgrammersGuide)v3.3 第9章:3D

    Cocos2d-x程序员手册(ProgrammersGuide)v3.3 翻译--第9章:3D 原著是英文,本文只是一个个人的简单理解的中文的非正式翻译,供自己学习使用,参考需谨慎. 向原著的作者Sl ...

  4. java程序员语录_「java程序员面试题」2018java程序员面试题整理 - seo实验室

    java程序员面试题 1.@PathVariable注解和@requestParam注解的区别. @RequestParam注解是获取静态URL传入的参数 @PathVariable是获取请求路径中的 ...

  5. 翻译翻译什么叫她妈的惊喜_妈的程序员说,翻译

    翻译翻译什么叫她妈的惊喜 我们都知道, 产品经理使用相同的术语来解释其实际含义 . 但是软件工程师对具有隐藏含义的普通方言同样有罪. 这是翻译过的最常见的八种程序员谚语. 免责声明:我是前PM. 但是 ...

  6. 程序员数字_作为社会科学程序员处理不同的数字数据

    程序员数字 Yesterday I had a discussion with a fellow student in Social Data Science, and we asked oursel ...

  7. DOS程序员手册(四)

    5.4打印机功能 打印机是能够直接控制的输出设备之外的唯一的重要输出设备.它们的功能比屏幕 107页 功能要简单得多,因为它们只涉及字符输出,并最小程度地与打印机的输入有关. 输出给打印机的最简单的方 ...

  8. 程序员夜猫子_如何像夜猫子一样高效

    程序员夜猫子 Let me start by admitting the truth: In the 46 years of my life, I have never managed to wake ...

  9. DOS程序员手册(二)

    2.6存储设备 随着DOS的升级,磁盘存储容量也有了很大扩充.表2.4介绍了软盘容量的增加以 及所支持驱动器型号的数量. 表2.4软盘容量 DOS版本 软盘 容量 1.0 5.25英寸SSDD 160 ...

最新文章

  1. linux tcpdump抓包,wireshark实时解析
  2. 你们还留恋windows什么呢?
  3. python三种变量方式_python2.x 3种变量形式调用
  4. 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...
  5. Java注解学习一:注解术语
  6. AWR Report and session_cached_cursor
  7. 专利技术交底书撰写经历
  8. Xpose安装 xposed下载出错 http://dl.xposed.info/repo
  9. 微信小程序--云开发静态网站h5跳小程序
  10. c# word 在当前光标位置插入内容
  11. php continue什么意思,php switch continue 什么意思??
  12. 《计算机组成原理》— 指令系统
  13. Tobii pro lab学习笔记1
  14. pycharm中import导入包呈现灰色问题
  15. 程序员适合做自由职业者吗?
  16. html表单元素的colspan和rowspan合并单元格
  17. linux系统启动的第一个进程是,CentOS6开机启动过程详解
  18. 如何让百度搜索收录自己的Hexo博客文章
  19. 复杂网络中衡量网络中节点中心性的几种度量指标
  20. 程序员职场选择——工作不够好,该换还是继续干?

热门文章

  1. 日常生活 -- UNIX再学习告一段落
  2. hdu1272(简单并查集)
  3. Android 5.0 Usb调试拦截分析及修改
  4. 初识Frida--Android逆向之Java层hook (二)
  5. Mastering Android NDK Build System - Part 2: Standalone toolchain
  6. APK加壳【3】通用内存加载dex方案分析
  7. 把“血”注入到产品里
  8. linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
  9. JZOJ 5938. 【NOIP2018模拟10.30】分离计划
  10. JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed