Вниз
Скачать: CL | DM;

Ссылки классов или переменные классов, как быть ?   Найти похожие ветки 

← →
Rule ©   (2004-11-11 16:49) [0]

возьмем простой вариант, необходимо сдулать процедуру, в ней 2 входящий параметра: первый это класс, а второй - переменная этого класса, и процедура просто создает экземпляр этого класса ...
как в процедуре указать переменную класса в качестве входного параметра, если в делфи нет переменных класса, скажите пожалуйста как мне быть ...
всем спасибо ...


← →
Ш-К   (2004-11-11 16:51) [1]


> в делфи нет переменных класса

в делфи есть переменных класса


← →
Rule ©   (2004-11-11 16:54) [2]

Ш-К   (11.11.04 16:51) [1]
хммм, получается борланд врет ?


← →
Ega23 ©   (2004-11-11 16:59) [3]

По-моему ЮЗ когда-то кусочек кода выкладывал:

procedure TForm1.Button1Click(...);
var
FormClass:TFormClass;
begin
case UsesrType of
 2 : FormClass:=TForm2;
 3 : FormClass:=TForm3;
 ....
 else
  FormClass:=nil;
end;
 
if FormClass<>nil then
 with FormClass.Create(nil) do
 try
   if ShowModal=mrOK then
    begin
     ....
    end
 finally
   Free
 end
else
 ShowMessage("Unknown user type")
end;


Не совсем то, что ты просишь, но около того...


← →
Ш-К   (2004-11-11 17:00) [4]

Rule ©   (11.11.04 16:54) [2]

Любой объект - переменная класса.
Вот такая процедура должна получиться:
procedure Do(AClass: TClass; AObject: TObject);

Только нахрена тебе нужно передвать первый параметр.


← →
Rule ©   (2004-11-11 17:04) [5]

Ш-К   (11.11.04 17:00) [4]
ну надо сделать чтото вроде
TApplication.CreateForm
тут же один параметр это класс а второй - это переменная ....


← →
Ш-К   (2004-11-11 17:04) [6]

Прошу прощения, не вчитался в вопрос:
procedure Do(AClass: TClass; AObject: TObject);
begin
AObject := AClass.Create;
end;


← →
MBo ©   (2004-11-11 17:05) [7]

посмотри на TApplication.CreateForm


← →
Rule ©   (2004-11-11 17:05) [8]

Ш-К   (11.11.04 17:04) [6]
Пробовал, только вместо AObject: TObject писал TForm,   щас попробую с TObject


← →
Rule ©   (2004-11-11 17:06) [9]

MBo ©   (11.11.04 17:05) [7]
это только завтра, я сегодня глянул и мне страшно стало ::))), не должно же быть все так сложно :)


← →
Rule ©   (2004-11-11 17:06) [10]

Ega23 ©   (11.11.04 16:59) [3]
Спасибо, действительно чуть-чуть не то ...


← →
Rule ©   (2004-11-11 17:10) [11]

MBo ©   (11.11.04 17:05) [7]
там используется метод NewInstance,  а в хелпе написано Do not call NewInstance directly


← →
Rule ©   (2004-11-11 17:12) [12]

разобрался с TApplication.CreateForm, не так все и сложно как казалось при первом взгляде :)


← →
Rule ©   (2004-11-11 17:18) [13]

хех, все получилось :), спасибо всем за помощь ...

значит объясняю, может кому понадобится мое решени .. значит у меня MDI  приложение  и в нем можно открывать только по одному экземплюру каждого дочерного окна, вот и надо было сделать общую процедуру, в которую передаются класс окна и переменная этого класса, и процедура должна проверить существует ли уже такое окно, если нет, то создает, если да то далет его активным, вот кусок кода который у меня получился :
procedure TMain.CreateFormAZS(InstanceClass: TComponentClass;
 var Reference);
 var
 i:integer;
 Instance: TComponent;
begin
 for i:=MDIChildCount-1 downto 0 do
 if MDIChildren[i] is InstanceClass then begin
     MDIChildren[i].Show;
     exit;
     end;
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
  Instance.Create(Self);
except
  TComponent(Reference) := nil;
 raise;
end;


← →
Гаврила ©   (2004-11-11 18:04) [14]


> Прошу прощения, не вчитался в вопрос:
> procedure Do(AClass: TClass; AObject: TObject);
> begin
> AObject := AClass.Create;
> end;


Только
var AObject: TObject

иначе ссылка не не будет доступна снаружа


← →
jack128 ©   (2004-11-11 18:31) [15]

Гаврила ©   (11.11.04 18:04) [14]
> procedure Do(AClass: TClass; AObject: TObject);
> begin
> AObject := AClass.Create;
> end;


Ну О-О-ОЧЕНЬ ограниченное применение у этой функции. Поскольку не выполняется конструктор. Вообще классовые ссылки имеет смысл использовать только в иерархияхв виртуальным конструктором. Простейший пример - компоненты.


← →
Гаврила ©   (2004-11-11 21:00) [16]


> [15] jack128



> Вообще классовые ссылки имеет смысл использовать только
> в иерархияхв виртуальным конструктором


Или вообще без конструкторов(кроме как от TObject или от того класса, чья классовая ссылка прислана)


← →
Rule ©   (2004-11-12 14:26) [17]

Ш-К   (11.11.04 16:51) [1]
Специально почитал Макро Кенту, потомучто у него видел что он писал и давал ссилку где написано, что вделфи нет переменных классов, но есть ссылки классов, что мы щас и использовали :)
jack128 ©   (11.11.04 18:31) [15]
ну почему, вот мой случай тому пример, что не только в компоеннтах используется такой подход ...
и естественно и дураку понятно что все это будет работать только когда конструкторы виртуальные иначе фигня получится ...


← →
Rule ©   (2004-11-12 14:28) [18]

Rule ©   (12.11.04 14:26) [17]
извиняюсь, не уточнил виртуальные конструкторы у базового класса, в моем случае TComponentClass,и естественно у всех потомков этот конструктор должен быть перектрыт, если они хотят исползовать свой ...



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

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.021 c
1-1100371562
TSoftman
2004-11-13 21:46
2004.11.28
Прорисовка в TreeView


6-1095827118
seregin2
2004-09-22 08:25
2004.11.28
Передача Stream в Socket ах


14-1100244430
GreySerg
2004-11-12 10:27
2004.11.28
Как установить компоненты на другом пользователе ?


9-1090874908
RyDmi
2004-07-27 00:48
2004.11.28
Для чего нужен параметр doWaitVBlank в DXDRAW?


1-1100512557
TObjectField
2004-11-15 12:55
2004.11.28
Работа с TObjectField........




   Наверх