2014-10-21 3 views
-1

Я знаю, что динамические объекты являются объектами, созданными во время выполнения. Я должен использовать динамические объекты для проекта, но не совсем уверен, что делать. Я не слишком уверен, что на самом деле есть динамические объекты, кроме определения, и, например, после нажатия кнопки создается панель, но это не совсем то, что мне нужно. Он должен быть более сложным и значимым.Динамические объекты в delphi

Каковы другие примеры динамических объектов и когда и зачем вы его используете?

+0

Похоже, вы имеете в виду «компоненты» и «элементы управления» вместо «объектов». –

+0

Это не имеет большого смысла. Вернемся к началу. Чего вы пытаетесь достичь? –

ответ

2

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

Основные примеры такие вещи, как TStringList для работы со строками или текстовых файлов, TStream потомков как TFileStream или TResourceStream, нити с помощью TThread, общие списки, такие как TList<T> и многие другие классы.

Например, для работы с текстовым файлом, пример динамически созданный TStringList может быть следующим:

var 
    SL: TStringList; 
begin 
    SL := TStringList.Create; 
    try 
    SL.LoadFromFile('C:\Temp\MyFile.txt'); 
    SL[0] := 'I changed this line.'; 
    SL.SaveToFile('C:\Temp\MyFile.txt'); 
    finally 
    SL.Free; 
    end; 
end; 
+0

'TArray ' не является объектом, это на самом деле динамический 'массив T'. Возможно, вы имели в виду 'TList ' вместо этого? –

+0

@ Руди: Да, ты прав. Закрепление. –

+0

Ничего себе, это было быстро. –

1

Это звучит как проект класса, и вы, кажется, не понимают некоторые из используемая терминология.

Чтобы обобщить это немного, в Delphi экземпляры любого класса, который вы определяете, должны создаваться динамически. Это контрастирует с записями, которые могут быть объявлены статически как переменные, так и динамически распределены.

В обоих случаях (классы и записи) при динамическом создании экземпляра память для них выделяется из кучи, а не из стека (где создаются локальные вары). Но в каждом случае синтаксис различен.

В Delphi это резко контрастирует с C++, потому что классы C++ в основном представляют собой структуры (например, записи Delphi) с некоторыми украшениями, что означает, что вы можете объявлять экземпляры классов в C++ в качестве переменных-членов, где их память выделяется в стеке так же, как вы можете объявлять экземпляры структур, а также записи в Pascal.

Но это не работает в Delphi, хотя синтаксис выглядит одинаково. Это связано с тем, что в Delphi переменные, относящиеся к классам, действительно являются указателями, как на C++, но они автоматически разыменовываются, поэтому они выглядят синтаксически, как если бы они были просто экземплярами, а не указателем на экземпляр.

В Delphi, если вы работаете с классом, вы ДОЛЖНЫ создать его динамически (вызывая TMyObj.Create (...)). Таким образом, каждый класс имеет связанный с ним конструктор; если вы его не определяете, вызывается конструктор TObject.Create по умолчанию. (Это опять-таки отличается от того, что на C++, где для компилятора будет создан конструктор по умолчанию для любого класса, который нуждается в нем, и он не определен.)

Я повторю это снова, чтобы вы поняли это.Все, что определено, как это в Delphi:

type 
    Twhatever = class 

эквивалентно следующему:

type 
    Twhatever = class(TObject) 

и абсолютно должны быть созданы динамически в коде следующим образом:

var 
    xyz : Twhatever; // xyz is really a pointer here! It's NOT an "instance" 
begin 
    xyz := Twhatever.Create(); // you need to create an instance using the Create() method 
    try 
    // do some stuff 
    finally 
    xyz.Free; 
    end; 

Вы не можете НЕ использовать хуг без предварительного создания экземпляра его с помощью метода .Create.

Смежные вопросы