解决方案 »
- 关于获取接口实例的实现问题
- 请问DLL文件的源码丢失如何解救
- 百分求教,如何实现QQ那样的好友列表界面?!
- 用TApdSendFax控件发送传真,总提示"Cancel requested"
- 进销存财务一体化管理软件
- 请各位前辈推荐一些适合入门的Delphi好书,谢谢!!!
- 有一个极其奇怪的问题我搞一晚上没能找出原因,请指教谢谢
- ★★★★★★本人打算辞去DELPHI小版[Wwin32 SDK/API]|[DateBase]的版主一职,希望获得批准!★★★★★★
- 组件NMStrm1的问题
- 关于treeview的问题?
- 这种情况是不是要用线程,SPCOMM如何在线程中使用?
- 关于ComboBox和DBLookupComboBox多步操作产生错误的问题
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
I:=1;//加上开关后,此处就可以下断点了
end;
{$O+}
TMyObject = class(TInterfacedObject)
private
FMsg: string;
procedure ShowMsg;
public
destructor Destroy; override;
end;{ TMyObject }destructor TMyObject.Destroy;
begin
ShowMessage('Free了');
inherited;
end;procedure TMyObject.ShowMsg;
begin
ShowMessage(FMsg)
end;procedure TForm1.FormCreate(Sender: TObject);
var
I: IInterface;
O: TMyObject;
begin
O := TMyObject.Create;
I := O; O.FMsg := 'abc';
O.ShowMsg;
//此处并没有显示调用O.Free,但由于I自动释放,就隐式调用了O.Free!
end;end.
期待LZ继续爆料,跟踪学习中~~
Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
const
{$I str.inc}
begin
ShowMessage(MSG);
end;str.inc
MSG = 'abc';
另外一些第三方组件中基本都会使用inc,好像还会有交叉的,有时看源码看得自己有点乱
begin
SetTextBuf('abc');
ShowMessage(Text);
Text := 'def';
ShowMessage(Caption)
end;
program Project1;//{$APPTYPE CONSOLE}uses
SysUtils,
Dialogs;begin
ShowMessage('abc')
end. 新建一个普通工程,然后在工程源文件里,在program一句的下一行加上{$APPTYPE CONSOLE},这样就可以在程序中使用Write之类的语句在控制台输出调试信息了。
program Project2;{$APPTYPE CONSOLE}uses
Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
Write('start!');
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
MessageBeep(MB_OK)
end.
asm//eax存储a,edx存储b,相加的结果又保存到eax
add eax,edx
end;procedure TForm1.FormCreate(Sender: TObject);
type
TAdd=function(a,b:Integer): Integer;
var
P: Pointer;
I: Integer;
begin
P := @Add;
I := TAdd(P)(1,2); ShowMessageFmt('%d', [I])
end;
这样就能在工程里包含zz.rc脚本,并自动build出zz.res!
TObj = class
private
FNumber: Integer;
public
property Number: Integer read FNumber;//只读属性,不可写
end;procedure TForm1.FormCreate(Sender: TObject);
var
O: TObj;
begin
O := TObj.Create;
PInteger(@O.Number)^ := 2;//通过指针的方式访问
ShowMessageFmt('%d', [O.Number]);
O.Free;
end;
TObj = class
private
FNumber: Integer;
public
property Number: Integer write FNumber;//只写属性,不可读
end;procedure TForm1.FormCreate(Sender: TObject);
var
O: TObj;
I: Integer;
begin
O := TObj.Create;
O.Number := 2;//对此句下断点,看cpu,可看到O.Number的地址为eax+4
asm
push edx
mov edx, [eax+4]
mov I, edx
pop edx
end;
ShowMessageFmt('%d', [I]);
O.Free;
end;
const
STR = 'abc';
begin
Form1.Tag := Integer(PChar(STR));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
a;
ShowMessage(PChar(Form1.Tag))
end;
//program Project1;uses
Forms,
Unit1 in 'Unit1.pas' {Form1};//{$R *.res}
{$R Project1.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
再来另一个省略program的例子,运行包含以下代码的批处理文件,则build出来a.exe。
@more /e +1 "%~f0">a.dpr&dcc32 a&goto :eof
uses Windows;
begin
MessageBeep(MB_OK)
end.[size=9px]ps:本人最近有要事在身,最近几天不会更新了![/size]
PTestStru = ^TTestStru;
TTestStru = record
ID : integer;
B : Boolean;
Name : String;
Time : TSystemTime;
Closed : Boolean;
Prop : DWORD;
end;
var
iOffset : integer;
begin
//得到Closed在TTestStru结构中的偏移
iOffset := Integer(@PTestStru(NIL).Closed);
//该方法只能运行时得到,不能用这个表达式定义常量.囧
end;