Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

object & property   Найти похожие ветки 

 
Slay   (2003-03-31 01:40) [0]

Hi, All
Вопрос не совсем по KOL, но все же может кто сталкивался с такой бякой.

Имеем:
Type
CFileName = object
protected
m_file: string;
public
function extractExt: string;
procedure replaceExt(const newExt: string);

property asString: string read m_file write m_file;
property ext: string read extractExt write replaceExt;
end;

Используем так:
var fn: TFileName;
begin
fn.asString := "c:\windows\explorer.exe";
writeln(fn.extractExt); //выводит: .exe
writeln(fn.ext); //ничерта не выводит
fn.replaceExt(".com");
writeln(fn.extractExt); //выводит: .com
writeln(fn.ext); //ничерта не выводит
fn.ext := ".bak"; //Access violation в момент присвоения полю m_file
end;

После клинического исследования сгенерированного Delphi"ой кода выяснилось, что для строки
fn.replaceExt(".com");
на асме примерно следующее:
MOV EDX, offset ".com"
LEA EAX, [EBP-4]
CALL CFileName.replaceExt

А для строки: fn.ext := ".bak";
MOV EDX, offset ".com"
MOV ( TMyObject) Hi, All
Вопрос не совсем по KOL, но все же может кто сталкивался с такой бякой.

Имеем:
Type
CFileName = object
protected
m_file: string;
public
function extractExt: string;
procedure replaceExt(const newExt: string);

property asString: string read m_file write m_file;
property ext: string read extractExt write replaceExt;
end;

Используем так:
var fn: TFileName;
begin
fn.asString := "c:\windows\explorer.exe";
writeln(fn.extractExt); //выводит: .exe
writeln(fn.ext); //ничерта не выводит
fn.replaceExt(".com");
writeln(fn.extractExt); //выводит: .com
writeln(fn.ext); //ничерта не выводит
fn.ext := ".bak"; //Access violation в момент присвоения полю m_file
end;

После клинического исследования сгенерированного Delphi"ой кода выяснилось, что для строки
fn.replaceExt(".com");
на асме примерно следующее:
MOV EDX, offset ".com"
LEA EAX, [EBP-4]
CALL CFileName.replaceExt

А для строки: fn.ext := ".bak";
MOV EDX, offset ".com"
MOV EAX, [EBP-4]//!!!!!!!!
CALL CFileName.replaceExt

Т.е. при доступе через свойства в методы параметр self передается не как ссылка на эксземпляр объекта, а как сам эксземпляр!!!
Это справедливо если sizeOf(TMyObject) = 4

Проверил, если в определения объекта CFileName добавить поле, к примеру, m_dummy: integer, то все нормально работает.

А теперь собственно вопрос: Кто-то уже сталкивался и если да то как побороть?

ЗЫ: Delphi 6.0 SP1


 
Bartov   (2003-03-31 02:04) [1]

> Используем так:
var fn: TFileName;


Из Help:
Unit
Sysutils
type TFileName = String;

Тебе надо написать:
var fn: CFileName; // Заметь С, а не Т.

Или я че-то не догнал?...


 
Slay   (2003-04-01 00:09) [2]

Да, там и было CFileName, в посте - опечатка. Да оно так и не скомпилировалося. Проблема именно в доступе к свойствам object"ов - instanceSize которых <= 4, с class"ами всё нормально.


 
Kladov   (2003-04-01 22:01) [3]


> как побороть?

добавить поле Dummy: Byte; ?



Страницы: 1 вся ветка

Текущий архив: 2003.12.12;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
6-36785
LOGic
2003-10-15 14:57
2003.12.12
Уважаемые мастера !! вот с такой проблемой столкнулся нужно по PO


1-36641
AlexV
2003-11-25 08:00
2003.12.12
Как подключиться и использовать OLE-объект Microsoft Outlook ?


1-36729
webpauk
2003-12-02 11:38
2003.12.12
Файлы dcu->pas


1-36714
bss
2003-12-02 14:31
2003.12.12
Открыть файл в приложении, которому он соотвествует


1-36611
mynameis
2003-12-01 15:04
2003.12.12
Перемещение мыши по десктопу из моей программы.