Delphi使用资源文件全攻略

在通常情况下使用delphi设计程序,都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来 不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源。因此,这就需要一种新的引用资源的文件:资源文件。资源文件就是将 一些资源,如字符串、图像等信息进行编译,然后在程序中引用编译后的资源文件,最后和源程序一起编译生成可执行文件。由于在资源文件中的资源是在需要时加 载,因此,比较节省系统资源,而且,如果要做国际化版本的系统,只需要将资源文件一换,重新编译即可。下面就详细介绍delphi中资源文件的建立和使用。

查看更多内容...

Posted in 软件开发 at September 6, 2015. by 傻猫 .    Views: 1198    No Comments

StringGrid使用百科全书

目录:

StringGrid行列的增加和删除
如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样
StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中
在StringGrid怎样制作只读的列在 OnSelectCell事件处理程序中
stringgrid从文本读入的问题
StringGrid组件Cells内容对齐
StringGird的行列背景色设置
怎么改变StringGrid控件某一列的背景和某一列的只读属性
StringGrid控件标题栏的对齐
怎么改变StringGrid控件某一列的背景和某一列的只读属性
StringGrid控件标题栏的对齐
在stringGrid中使用回车键模拟TAB键切换单元格的功能实现
stringgrid如何清空
让记录在StringGrid中分页显示在
打印StringGrid
如何实现在stringgrid中删除鼠标点中的那一行,下一行再顶上的效果
让stringgrid点列头进行排序
正确地设置StringGrid列宽而不截断任何一个文字方法
实现StringGrid的删除,插入,排序行操作
TstringGrid 的行列合并研究

查看更多内容...

Posted in 软件开发 at May 20, 2015. by 傻猫 .    Views: 1809    No Comments

通过MAP文件尝试解决Access violation at address错误

1.什么是 MAP 文件?
简单地讲,MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。

2.DELPHI下生成MAP文件的方法: 偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢!
生成详细的MAP信息的方法:
1). project -> options -> Linker -> Map file 选择detailed.
2). D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32 -GD project1.dpr

3.示例
我们的代码为:
unit Unit1;
//{$D+,L+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: Integer;
p: PChar;
begin
I := 10;
J := 0;
//I := I div J; // 32
//ShowMessage(IntToStr(I));
p := nil;
p^ := 'A'; // 38
end;
end.

// 想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃 ^_^
然后执行,点击,然后出错,我的机器上,崩溃地址为 00 44 d9 46。

如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:
崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 <= 后面列出的 0004C946 就是它了。
我们用ultraedit32之类的工具打开 .map文件,搜索 0004C94,找到了,然后就找
<= 0004c946的那个地址,然后看到了:
Line numbers for Unit1(Unit1.pas) segment .text

37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C

38 0001:0004C946 就是它了。。。unit1.pas的第38行!!去代码里看一下,果然就是38行 ^_^.....

4.补充
如果由地址查不到代码行,则将
Project -> Options -> Compiler 中的 Debugging 的 Use Debug DCUs 勾选上后编译,
则将调用的系统文件均编译到执行文件中,同时记录在Map文件中.
这时在查找地址,不信找不到;

Posted in 软件开发 at March 27, 2015. by 傻猫 .    Views: 2074    No Comments

SMExportToXLS导出时自动去掉尾部空格

use SMEEngine

procedure TfrmXLSExport.SMExportToXLS1GetCellParams(Sender: TObject;
Field: TField; var Text: String; AFont: TFont; var Alignment: TAlignment;
var Background: TColor; var CellType: TCellType);
begin
if Assigned(Field) then
begin
Text:=Trim(Text);
end;
end;

Posted in 软件开发 at January 6, 2015. by 傻猫 .    Views: 2943    No Comments

StringGrid控件使用技巧

StringGrid控件
组件名称:StringGrid

●固定行及固定列:
StringGrid.FixedCols:=固定行之数;
StringGrid.FixedRows:=固定列之数;
StringGrid. FixedColor:=固定行列之颜色;
StringGrid.Color:=资料区之颜色;
●资料行列之宽高度:
StringGrid.DefaultColWidth:=内定全部之宽度;
StringGrid.DefaultRowHeight:=内定全部之高度;
StringGrid.ColWidths[Index:Longint]:=某一行整行之宽度;
StringGrid.RowHeights[Index:Longint]:=某一列整列之高度;
●数据区(CELL)指定:
将某一行列停在画面之资料区最左上角:
StringGrid.LeftCol:=某一行号;
StringGrid.TopRow:=某一列号;
焦点移至某一格(CELL)内:
StringGrid.Row:=?;
StringGrid.Col:=?;
设定数据行列数:(包含固定行、列亦算在内)
StringGrid.RowCount:=?;
StringGrid.ColCount:=?;
写一字符串至某一格(CELL)内:
StringGrid.Cells[Col值 , Row值]:=字符串;
判断鼠标指针目前在哪一格(CELL)范围内:
在StringGrid之Mouse事件中(UP,DOWN或MOVE)下:
VAR C , R : Longint;
Begin
StringGrid.MouseToCell(X,Y,C,R); {X,Y由MOUSE事件传入}
{取回 C , R 即为目前之Col , Row值 }

查看更多内容...

Posted in 软件开发 at November 27, 2014. by 傻猫 .    Views: 2432    No Comments

System-Set8087CW、Default8087CW

//FPU:浮点运算器,Floating Point Unit的简写,浮点运算单元是专门用于浮点运算的处理器,集成于CPU之内,效率高、执行快
//Set8087CW(开关FPU)
//Set8087CW($1372):开FPU,默认值
//Set8087cw($133f):闭FPU
//Procedure Set8087CW(NewCW: Word);
//Default8087CW: Word = $1332;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=FloatToStr(100.123*123.456/788.88);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RadioGroup1.Items.Add('Open FPU');
RadioGroup1.Items.Add('Close FPU');
Edit2.Text:=IntToStr(System.Default8087CW);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
System.Set8087CW($1372);
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex=0 then
System.Set8087CW($1372);
if RadioGroup1.ItemIndex=1 then
System.Set8087CW($133f);
end;

Posted in 软件开发 at November 18, 2014. by 傻猫 .    Views: 2462    No Comments

Delphi之TStrings和TStringLists类

Delphi之TStrings和TStringLists类

有些类不是组件,但它们支持存在的组件。这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings、TCanvas和TCollection。 

TStrings和TStringLists类

TStrings是一个抽象类,使你可以操纵属于组件(如TListBox)的字符串列表。TStrings实际上并不管理字符串的内存(那是由拥有TStrings类的组件管理的),它只是定义了方法和属性来访问和操纵组件的字符串,而不是使用组件的Win32 API函数和消息。 

注意,我们所说的TStrings是一个抽象类。这就意味着TStrings并没有真正实现操纵字符串的代码,它只是定义了必要的方法有哪些。TStrings的派生组件实现了实际上的字符串操纵方法。

为了进一步说明这个点,举几个组件的例子,如TListBox.Items、TMemo.Lines、和TComboBox.Items等属性都是TStrings类型。你也许怀疑,如果它们的属性是TStrings类型,当这些属性的方法在代码中尚未实现时,怎么能调用这些方法呢?问得好。答案是,尽管这些属性被定义为TStrings类型,但这些属性的变量(例如设为TListBox.FItems)是被实例化为派生类。为了阐明这点,设FItems是TListBox的Items属性的私有存储域:

查看更多内容...

Posted in 软件开发 at November 12, 2014. by 傻猫 .    Views: 2467    No Comments

Delphi CheckListBox用法

CheckListBox如何设置行高?
默认设置是 lbStandard 或者 lbOwnerDrawVariable 会忽略你的行高设置值的
改为lbOwnerDrawFixed 属性即可

删除:CheckListBox.DeleteSelected;
上下移: CheckListBox.Items.Move

删除用
CheckListBox1.Items.Delete(Index);

上下移动用
CheckListBox1.Items.Move(CurrentIndex,NewIndex);

//在项目中添加字符串(子项目的最后一位接着添加)
CheckListBox1.Items.Add(edit1.Text);

查看更多内容...

Posted in 软件开发 at August 14, 2014. by 傻猫 .    Views: 2436    No Comments