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

Вниз

можно ли использовать один класс в разных модулях?   Найти похожие ветки 

 
MadGhost   (2004-02-15 12:29) [0]

уважаемые мастера, подскажите как это сделать?
есть например модуль Unit10.pas в котором я описал какой то класс. Есть форма Unit1 и другая Unit2 как мне создать объект этого класса чтобы обе формы могли пользоваться им совместно?


 
Digitman   (2004-02-15 12:39) [1]

unit1;

uses Unit10, ...;

....

unit2;

uses Unit10, ...;


 
MadGhost   (2004-02-15 13:25) [2]

не совсем то, я имел в виду например создаешь объект в Unit1 т.е. в главной форме,
MyObject1:TMyObject; из Unit10
в Unit2 тоже также, но это же разные объекты получаются.
а надо один, и пользовать потоки тоже надо чтобы он обновлял переменные в этом объекте.


 
Юрий Зотов   (2004-02-15 13:46) [3]

В unit10:

interface

type
TMyObject = class(...)
...
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;

implementation

var
MyObject: TMyObject;

class function TMyObject.NewInstance: TObject;
begin
if MyObject = nil then
Result := inherited NewInstance
else Result := MyObject
end;

procedure TMyObject.FreeInstance;
begin
inherited;
MyObject := nil
end;

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


 
Digitman   (2004-02-15 13:59) [4]


> пользовать потоки тоже надо чтобы он обновлял переменные
> в этом объекте


без использования крит.секций не обойтись

В unit10:

interface

type
TMyObject = class(...)
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
SomeField: Integer;
end;
...
var
CritSect: TCriticalSection;

implementation

var
MyObject: TMyObject;

...

initialization
CritSect := TCriticalSection.Create;

finalization
CritSect.Free;

....

в поточной ф-ции :

CritSect.Enter;
try
TMyObject.NewInstance.SomeField := SomeValue;
finally
CritSect.Leave;
end;


 
Defunct   (2004-02-15 15:17) [5]

Если используется всего один объект и больше не планируется создание новых. Можно создать его при инициализации модуля:

Unit Unit10;

Interface

TMyClass = class(_)
...
End;

Var MyObject : TMyClass;

Implementation

//..
//Реализация методов TMyClass
//..

Begin
// Инициализация модуля
MyObject := TMyClass.Create(_);
End.


 
MadGhost   (2004-02-16 13:49) [6]

во, решпект огроменный, то что надо :) большое спасибо.



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

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

Наверх





Память: 0.46 MB
Время: 0.01 c
1-93873
avsam
2004-02-16 13:45
2004.02.29
Версии Делфи


1-93855
Grinder
2004-02-16 16:46
2004.02.29
Resize в ListView


14-94179
Nelud
2004-02-07 12:10
2004.02.29
Проблема с RW


14-94113
ИМХО
2004-02-09 00:39
2004.02.29
Абрамович заарканил Роналдо и Роберто Карлоса


3-93811
Russko
2004-02-03 13:40
2004.02.29
БД на SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский