Delphi Edit1.text 是什么类型的?
补充:var
S:Pchar;
D:dword;
begin
S:=Pchar(edit1.Text);
asm
pushad
mov ecx,s
mov eax,[ecx+$c]
mov d,eax
popad
end;
memo1.Lines.Clear;
memo1.Lines.Add(inttohex(d,$8));
这段代码显示的值是, 00950031
var
S:Pchar;
D:dword;
begin
S:=Pchar('threeqtest001');
asm
pushad
mov ecx,s
mov eax,[ecx+$c]
mov d,eax
popad
end;
memo1.Lines.Clear;
memo1.Lines.Add(inttohex(d,$8));
这段显示的值是: 00000031
内容是一样的,怎么会这样...
答案:S:Pchar;
这句你S申明的类型是pchar,是个指针类型,Edit1.text的类型是string类型,我们知道delphi里的string类型有个特点,就是当一个字符串被重复引用时,它不会去复制一份字串出来,而是给string类型内置的有一项叫引用计数加1,实际指向还是最原始的地址,在这例就是edit1.text的地址,所以Pchar(edit1.Text)和直接pchar('threeqtest001')是不同的,哪怕你edit1.Text的值就是'threeqtest001'.
原因是Pchar(edit1.Text)传的是text的指针,而pchar('threeqtest001')传的是函数体内一个字符串的指针。edit1.Text 和你函数体内字符串的内存地址显然是不同的
其他:应该是皮肤一类的把 能给分就给分吧 这两段代码都嵌入了汇编语言.咱也搞不懂.edit1.text肯定是字符串类型.但它通过Pchar('threeqtest001');语句进行了强制转换. function TCustomEdit.GetSelText: string;
var
P: PChar;
SelStart, Len: Integer;
begin
SelStart := GetSelStart;
Len := GetSelLength;
SetString(Result, PChar(nil), Len);
if Len <> 0 then
begin
P := StrAlloc(GetTextLen + 1);
try
GetTextBuf(P, StrBufSize(P));
Move(P[SelStart], Pointer(Result)^, Len);
finally
StrDispose(P);
end;
end;
end;
上一个:如何用delphi做一个通讯录
下一个:在Delphi 怎么能让多个指向同一张表查询的DataSet实现数据操作同步?