Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];

Вниз

Keywords: record, class, interface, object. Object?   Найти похожие ветки 

 
PavDimka   (2010-09-24 15:39) [0]

О первых двух написано очень много, об интерфейсах чуть меньше, но что такое объект (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;
что в некоторых случаях очень удобно.


 
PavDimka   (2010-09-24 15:46) [1]

Объекты прекрасно наследуются, инкапсулируются и даже есть полиформизм.
Однако объекты имеют размер равный размеру всех его элементов.

Кто работал с объектами?
Где можно прочитать по этому вопросу литературу?
В интернете ничего не нашел подходящего.


 
Германн ©   (2010-09-24 15:56) [2]


> Мы все привыкли считать под этим словом любой класс (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.


 
Сергей М. ©   (2010-09-24 15:59) [3]

> Где можно прочитать по этому вопросу литературу?

В стандартной справке к Borland Pascal 7
Объекты эти перебрались в Delphi и дальше именно оттуда.


 
PavDimka   (2010-09-24 16:06) [4]

Object types are supported for backward compatibility only
Вот тут я впервые с ним и столкнулся.
А как насчет удаления объектов из памяти при выключении программы?
Как вообще осуществляется удаление процедур и функций в Delphi? Это происходит автоматически?
Как реагирует объект на потоки если он объявлен в ThreadVar?


 
Германн ©   (2010-09-24 16:11) [5]


> А как насчет удаления объектов из памяти при выключении
> программы?

Если в Windows, то система сама всё подчистит при закрытии программы.
> Как вообще осуществляется удаление процедур и функций в
> Delphi?

Процедуры т функции в Дельфи обычно удаляются клавишами DEL и/или Backspace :)


 
Palladin ©   (2010-09-24 16:33) [6]


> Мы все привыкли считать под этим словом любой класс (TObject).

какое обширное слово... МЫ.... за все не говори, да...


 
PavDimka   (2010-09-24 16:38) [7]

:)
Большое спасибо.

А ещё у меня есть один вопросик, ответ на который я так и не нашел.
Как во время выполнения программы размножить процедуру?
Я имею в виду вот что:


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:41) [8]

а это еще за на кой фиг?


 
Сергей М. ©   (2010-09-24 16:42) [9]


> Как во время выполнения программы размножить процедуру?


Нафига ?
Этому есть разумное объяснение и применение ?
И слышал ли ты что-нибудь про DEP ?)


 
Palladin ©   (2010-09-24 16:43) [10]


> DEP

да да кстати... )


 
Amoeba_   (2010-09-24 16:43) [11]


> Кто работал с объектами?
> Где можно прочитать по этому вопросу литературу?
> В интернете ничего не нашел подходящего.

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=216


 
Игорь Шевченко ©   (2010-09-24 16:56) [12]

В справке еще очень много открытий, только не надо о них пафосных постов на форуме, умоляю.


 
Anatoly Podgoretsky ©   (2010-09-24 16:56) [13]

> PavDimka  (24.09.2010 16:38:07)  [7]

Нет


 
PavDimka   (2010-09-24 16:58) [14]

Программно реализованная DEP по умолчанию защищает только отдельные системные файлы.
http://support.microsoft.com/?scid=kb%3Bru%3B875352&x=0&y=0


> Этому есть разумное объяснение и применение ?

Алгоритм криптозащиты, например.


 
PavDimka   (2010-09-24 17:00) [15]


> Игорь Шевченко

Сори за пафос, до этого я спросил 6 человек и никто о ничего вообще не слышал. Вот на этой ноте и написал так.


 
Юрий Зотов ©   (2010-09-24 17:34) [16]

> Получить размер процедуры в байтах

Если компилятор располагает код процедур в том же порядке, в каком они идут в исходнике (а компилятор Delphi так и поступает), то очень просто:

procedure A(...);
begin
 ...
end;

procedure B(...);
begin
 ...
end;

// ================
SizeOfA := Cardinal(@B) - Cardinal(@A);
 

Чтобы создать и вызвать копию процедуры, делаем так: получаем ее размер, выделяем под нее память, копируем тело и вызываем через приведение типа.

Только на фига копия-то? Почему просто не вызвать оригинал?


 
Ega23 ©   (2010-09-24 17:38) [17]


> Только на фига копия-то? Почему просто не вызвать оригинал?

ну в защите, наверное, такое действительно полезно. Возможно. Надо у Розыча спрашивать.


 
Юрий Зотов ©   (2010-09-24 17:50) [18]


> Ega23 ©   (24.09.10 17:38) [17]

С вызовом могут быть проблемы. Страница динамически выделенной памяти должна иметь атрибут Executable (как-то так он называется), иначе при вызове получим облом. Есть, правда, обходной маневр, но говорить о нем публично вряд ли стоит.


 
PavDimka   (2010-09-24 17:58) [19]

Size := Cardinal(@Beta) - Cardinal(@Alpha);
 ProcP := GetMemory(Size);
 Move((@Alpha)^, (@Proc)^, Size);
 Proc := TProc(ProcP^); - Это ошибка, а как правильно?
 Proc;


 
PavDimka   (2010-09-24 18:03) [20]


> Юрий Зотов

А как с Вами можно об этом поворить?


 
Юрий Зотов ©   (2010-09-24 18:15) [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:23) [22]

Выходит ошибка Access Violation


 
Юрий Зотов ©   (2010-09-24 18:30) [23]

Видимо, тот самый облом и есть.


 
PavDimka   (2010-09-24 18:34) [24]

Call dword ptr [ebp-$04] - ошибка. Вызываю без атрибутов/
GetLastError = 126


 
Юрий Зотов ©   (2010-09-24 18:35) [25]


> PavDimka   (24.09.10 18:23) [22]

Поскажу, но не более: Windows разрешает исполнение кода в стеке.
Дальше - сами. Там несложно.


 
RWolf ©   (2010-09-25 00:02) [26]


> PavDimka   (24.09.10 17:00) [15]
> до этого я спросил 6 человек и никто о ничего вообще не слышал.

тут на дельфимастерах целый форум этим объектам посвящён.
точнее, фреймворку, что на них основан.
http://delphimaster.ru/cgi-bin/forum.pl?n=10


 
Германн ©   (2010-09-25 02:16) [27]


> целый форум этим объектам посвящён

Мёртвое дело, имхо.


 
6x8   (2010-09-27 14:02) [28]


> Страница динамически выделенной памяти должна иметь атрибут
> Executable (как-то так он называется), иначе при вызове
> получим облом. Есть, правда, обходной маневр, но говорить
> о нем публично вряд ли стоит.


О чём, о VirtualProtect? Ну да, это-же секретная функция, описанная в секретном разделе MSDN. А MakeObjectInstance так вообще основана на Тайном Знании, натурально.


> Поскажу, но не более: Windows разрешает исполнение кода
> в стеке.


Ага, правильно. Только наоборот.


 
icWasya ©   (2010-09-27 16:00) [29]

Помимо всего прочего, в ссылках на другие процедуры по умолчанию ставятся относительные адреса. Если в скопированной процедуре есть вызовы других процедур - гарантировано получим AV.


 
han_malign   (2010-09-28 11:43) [30]


> Удивительно, но на RAD 2010 этот код работат

- а BDS 2006 на это почему то ругался, приходилось делать:
{$IF CompilerVersion >= 18.0}record{$ELSE}object{$IFEND}...


 
Юрий Зотов ©   (2010-09-28 13:05) [31]


> 6x8   (27.09.10 14:02) [28]

Ваш сарказм блестящ, но лучше бы Вы помогли топикстартеру простым примером кода. Это было бы куда более конструктивно, нежели упражнения в демонстрации Ваших, безусловно, глубоких познаний.


 
Anatoly Podgoretsky ©   (2010-09-28 13:31) [32]

> Юрий Зотов  (28.09.2010 13:05:31)  [31]

Ему интереснее шляться по ветками и нападать на всех.


 
6x8   (2010-09-28 13:55) [33]


> Юрий Зотов ©   (28.09.10 13:05) [31]

Сарказм так себе, да и знания мои по нескольким постам оценить невозможно, а они вобщем-то средние, может чуть выше. Вы неискренни, а жаль.

За конструктив - а по-моему, я высказываюсь вполне в духе здешнего форума. Я вот тут походил по веткам, получил общее впечатление - завсегдатаи зачастую говорят с разными "пришлыми" на грани хамства, открытого или завуалированного. Иногда за гранью. Вот я подумал, почему-бы не помочь людям взглянуть на ситуацию с, так-сказать, с другой стороны.

Но к Вам лично это вроде не относится, потому - прошу извинить, мне жаль.


 
6x8   (2010-09-28 13:56) [34]


> Anatoly Podgoretsky ©   (28.09.10 13:31) [32]


> Ему интереснее шляться по ветками и нападать на всех.

В точку. Развлекаюсь за чужой счёт, пока не забанят.


 
Anatoly Podgoretsky ©   (2010-09-28 14:57) [35]

> 6x8  (28.09.2010 13:56:34)  [34]

Ну за этим дело не встанет. Но пока особо не за что.

А пока впечатление такое, и оно идет в противовес с "Я вот тут походил по
веткам, получил общее впечатление - завсегдатаи зачастую говорят с разными
"пришлыми" на грани хамства, открытого или завуалированного. Иногда за
гранью. Вот я подумал, почему-бы не помочь людям взглянуть на ситуацию с,
так-сказать, с другой стороны."

А глядишь не стой.


 
6x8   (2010-09-28 15:14) [36]


> А глядишь не стой.

Да с той, с той. Я ведь с тебя в основном пример беру. Ученик, можно сказать.


 
Юрий Зотов ©   (2010-09-28 16:23) [37]

> 6x8   (28.09.10 13:55) [33]

1. С чего Вы взяли, что я неискренен? Непонятно.

2. Если Вы не одобряете духа здешнего форума, то зачем Вы поддерживаете его, высказываясь в нем же? Непонятно.

3. Если Вы считаете, что ко мне лично это не относится, то почему пост [28] адресован именно мне лично? Непонятно.

4. Что за трусливая (извините, но факт есть факт) манера писать нелицеприятные вещи, прикрываясь анонимностью?

5. Вместо того, чтобы помочь топикстартеру, Вы затеяли склоку (да-да, затеяли ее именно Вы, причем без всякого повода). После этого - Вам ли говорить о духе форума?


 
6x8   (2010-09-28 18:17) [38]


>  1. С чего Вы взяли, что я неискренен? Непонятно.

Да с того, что Вы никак не могли оценить мой уровень, у Вас для этого просто недостаточно данных. Что тут непонятного?


> 2. Если Вы не одобряете духа здешнего форума, то зачем Вы
> поддерживаете его, высказываясь в нем же? Непонятно.

Я его не доддерживаю и не осуждаю - мне он по барабану, и я всё равно не собираюсь здесь  надолго задерживаться. Но мне не нравятся законы дворовых шаек, в которых каждый член всегда прав уже потому, что он свой. А не свой всегда неправ потому, что он чужак. И меня забавляет, когда член такой шайки сам оказывается в неприятном положении. Что тут непонятного?


> 3. Если Вы считаете, что ко мне лично это не относится,
> то почему пост [28] адресован именно мне лично? Непонятно.

Потому, что Вы член местного сообщества. Что-то я не видел, чтобы Вы вмешались, когда кто-то из завсегдатаев вёл себя некорректно. А это означает молчаливый одобрямс,
что тут непонятного?

> 4. Что за трусливая (извините, но факт есть факт) манера
> писать нелицеприятные вещи, прикрываясь анонимностью?

Глупости. Для меня Вы ровно такой-же аноним, как и я для Вас. В базе этого форума наверняка десятки мёртвых аккаунтов, что изменится, если добавится ещё один? В сети все анонимы, и если Вы даже укажете в анкете свой точный адрес, для большинства иногородних останетесь всё тем-же анонимом. Они будут знать сетевой персонаж, но не реального человека, улавливаете мою мысль?

> 5. Вместо того, чтобы помочь топикстартеру, Вы затеяли склоку
> (да-да, затеяли ее именно Вы, причем без всякого повода).
>  После этого - Вам ли говорить о духе форума?

Склоку?! Забавно.
Да не собираюсь я ни спасать, ни переделывать мир, пусть себе катится. И топикстартеру помогать не собирался, с чего-бы вдруг? Я себе ни в святые, ни в апостолы не записывал.

Да ладно, не переживайте, надоело мне здесь.


 
Anatoly Podgoretsky ©   (2010-09-28 19:03) [39]


> Да ладно, не переживайте, надоело мне здесь.

Наконец настал момент такой.

> не собираюсь здесь  надолго задерживаться.


 
Юрий Зотов ©   (2010-09-28 19:06) [40]


> 6x8   (28.09.10 18:17) [38]

> Вы никак не могли оценить мой уровень, у Вас для этого просто
> недостаточно данных.

Достаточно. Вы сами его обозначили (см. [28]). Человек, знающий об атрибутах страниц, VirtualProtect и о выполнении кода в стеке имеет вполне достаточный для сабжа уровень. Хотя, пример кода, конечно, не помешал бы - он позволил бы понять, реален ли этот уровень, или всего лишь из серии "слышал звон".

> Я его не доддерживаю и не осуждаю - мне он по барабану,
Не виляйте. Если бы это было так, то [28] не появилось бы.

> Что-то я не видел, чтобы Вы вмешались, когда кто-то из завсегдатаев
> вёл себя некорректно.

Вы или плохо видите, или недавно здесь. Вмешивался, и не раз.

> Да не собираюсь я ни спасать, ни переделывать мир
Снова - не виляйте. Если бы это было так, то с чего это Вы вдруг решили бороться за чистоту нравов?

> Да ладно, не переживайте, надоело мне здесь.
Это называется: "поквакал - и в тинку". Что ж, дело Ваше. До свидания.

PS.
Совет: если Вы вдруг все же вздумаете снова побороться за чистоту нравов - здесь, или где то еще - то, наверное, не будет лишним сначала вникнуть в ситуацию поглубже, чем Вы это сделали только что.



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

Форум: "Начинающим";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.005 c
15-1284469263
azamatufa
2010-09-14 17:01
2010.12.26
Помгите найти sp1 для D7


15-1284560635
csc
2010-09-15 18:23
2010.12.26
как защитить свою программу от взлома?


15-1284617463
boriskb
2010-09-16 10:11
2010.12.26
Завершился конкурс


15-1284409769
Юрий
2010-09-14 00:29
2010.12.26
С днем рождения ! 14 сентября 2010 вторник


2-1285737249
ruslan_as
2010-09-29 09:14
2010.12.26
Как начать считывать текстовый файл с нужной строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский