![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Keywords: record, class, interface, object. Object?
PavDimka © (2010-09-24 15:39:00)О первых двух написано очень много, об интерфейсах чуть меньше, но что такое объект (object). Мы все привыкли считать под этим словом любой класс (TObject).
А как Вам такой код?
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
Type
TMyObject = object
strict private
FValue: Int32;
procedure SetValue(const AValue: Int32);
public
TextString: String;
property Value: Int32 read FValue write SetValue;
end;
{ MyObject }
procedure TMyObject.SetValue(const AValue: Int32);
begin
FValue := AValue;
end;
var
MyObject : TMyObject;
begin
SetLastError(0);
try
MyObject.TextString := 'Test Object';
MyObject.Value := SizeOf(TMyObject);
WriteLn(MyObject.TextString);
WriteLn('Size Of object = ' + IntToStr(MyObject.Value));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
if not GetLastError = 0 then
WriteLn('Find Error number: ' + intToStr(GetLastError));
ReadLn;
end.
Удивительно, но на RAD 2010 этот код работат, не пробовал на других, но в нём есть одно преимущество.
когда я пишу так:
MyObject.и нажимаю пробел, то в выпадающем списке имею только то что сам положил в секцию public (секция published отсутствует). То есть на экране для данного примера появляется
var TextString: String;
property Value: Integer;
что в некоторых случаях очень удобно.
Юрий Зотов (2010-09-24 18:15:00) [21]Не нужно косвенной адресации, все делается "в лоб":
type
TMyProc = procedure(...);
var
P: Pointer;
begin
Size := Cardinal(@Beta) - Cardinal(@Alpha);
GetMem(P, Size);
try
TMyProc(P)(...) // Тут может быть облом из-за неверного атрибута
finally
FreeMem(P)
end
end;
PavDimka (2010-09-24 18:03:00) [22]
> Юрий Зотов
А как с Вами можно об этом поворить?
PavDimka (2010-09-24 17:58:00) [23]Size := Cardinal(@Beta) - Cardinal(@Alpha);
ProcP := GetMemory(Size);
Move((@Alpha)^, (@Proc)^, Size);
Proc := TProc(ProcP^); - Это ошибка, а как правильно?
Proc;
Юрий Зотов (2010-09-24 17:50:00) [24]
> Ega23 © (24.09.10 17:38) [17]
С вызовом могут быть проблемы. Страница динамически выделенной памяти должна иметь атрибут Executable (как-то так он называется), иначе при вызове получим облом. Есть, правда, обходной маневр, но говорить о нем публично вряд ли стоит.
Ega23 (2010-09-24 17:38:00) [25]
> Только на фига копия-то? Почему просто не вызвать оригинал?
ну в защите, наверное, такое действительно полезно. Возможно. Надо у Розыча спрашивать.
Юрий Зотов (2010-09-24 17:34:00) [26]> Получить размер процедуры в байтах
Если компилятор располагает код процедур в том же порядке, в каком они идут в исходнике (а компилятор Delphi так и поступает), то очень просто:
procedure A(...);
begin
...
end;
procedure B(...);
begin
...
end;
// ================
SizeOfA := Cardinal(@B) - Cardinal(@A);
Чтобы создать и вызвать копию процедуры, делаем так: получаем ее размер, выделяем под нее память, копируем тело и вызываем через приведение типа.
Только на фига копия-то? Почему просто не вызвать оригинал?
PavDimka (2010-09-24 17:00:00) [27]
> Игорь Шевченко
Сори за пафос, до этого я спросил 6 человек и никто о ничего вообще не слышал. Вот на этой ноте и написал так.
PavDimka (2010-09-24 16:58:00) [28]Программно реализованная DEP по умолчанию защищает только отдельные системные файлы.
http://support.microsoft.com/?scid=kb%3Bru%3B875352&x=0&y=0
> Этому есть разумное объяснение и применение ?
Алгоритм криптозащиты, например.
Anatoly Podgoretsky (2010-09-24 16:56:00) [29]> PavDimka (24.09.2010 16:38:07) [7]
Нет
Игорь Шевченко (2010-09-24 16:56:00) [30]В справке еще очень много открытий, только не надо о них пафосных постов на форуме, умоляю.
Amoeba_ (2010-09-24 16:43:00) [31]
> Кто работал с объектами?
> Где можно прочитать по этому вопросу литературу?
> В интернете ничего не нашел подходящего.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=216
Palladin (2010-09-24 16:43:00) [32]
> DEP
да да кстати... )
Сергей М. (2010-09-24 16:42:00) [33]
> Как во время выполнения программы размножить процедуру?
Нафига ?
Этому есть разумное объяснение и применение ?
И слышал ли ты что-нибудь про DEP ?)
Palladin (2010-09-24 16:41:00) [34]а это еще за на кой фиг?
PavDimka (2010-09-24 16:38:00) [35]:)
Большое спасибо.
А ещё у меня есть один вопросик, ответ на который я так и не нашел.
Как во время выполнения программы размножить процедуру?
Я имею в виду вот что:
FA: TProc;
FB: TProc;
Size: Integer;
procedure A;
begin
ShowMessage('OK');
end;
FA := A;
Size := Someproc(someData); { Получить размер процедуры в байтах }
Pointer(FB) := GetMemory(Size) {получить память под экземляр процедуры }
Move(@Cardinal(FA)^, @Cardinal(FB)^, Size); {Скопировать тело процедуры}
FB; -> ShowMessage('OK');
Надуюсь это было понятно.
Palladin (2010-09-24 16:33:00) [36]
> Мы все привыкли считать под этим словом любой класс (TObject).
какое обширное слово... МЫ.... за все не говори, да...
Германн (2010-09-24 16:11:00) [37]
> А как насчет удаления объектов из памяти при выключении
> программы?
Если в Windows, то система сама всё подчистит при закрытии программы.
> Как вообще осуществляется удаление процедур и функций в
> Delphi?
Процедуры т функции в Дельфи обычно удаляются клавишами DEL и/или Backspace :)
PavDimka (2010-09-24 16:06:00) [38]
Object types are supported for backward compatibility only
Вот тут я впервые с ним и столкнулся.
А как насчет удаления объектов из памяти при выключении программы?
Как вообще осуществляется удаление процедур и функций в Delphi? Это происходит автоматически?
Как реагирует объект на потоки если он объявлен в ThreadVar?
Сергей М. (2010-09-24 15:59:00) [39]> Где можно прочитать по этому вопросу литературу?
В стандартной справке к Borland Pascal 7
Объекты эти перебрались в Delphi и дальше именно оттуда.
Германн (2010-09-24 15:56:00) [40]
> Мы все привыкли считать под этим словом любой класс (TObject).
As an alternative to class types, you can declare object types using the syntax
type objectTypeName = object (ancestorObjectType)
memberList
end;
where objectTypeName is any valid identifier, (ancestorObjectType) is optional, and memberList declares fields, methods, and properties. If (ancestorObjectType) is omitted, then the new type has no ancestor. Object types cannot have published members.
Since object types do not descend from TObject, they provide no built-in constructors, destructors, or other methods. You can create instances of an object type using the New procedure and destroy them with the Dispose procedure, or you can simply declare variables of an object type, just as you would with records.
Object types are supported for backward compatibility only. Their use is not recommended.