Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: 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 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
3-1098811212
Sid
2004-10-26 21:20
2004.11.28
Обновление DBChart


3-1099281637
sanek
2004-11-01 07:00
2004.11.28
как создать вычисляемое поле через DBGRId


1-1100558592
noob
2004-11-16 01:43
2004.11.28
Строка и символы ... трабла


1-1100625546
Neiron
2004-11-16 20:19
2004.11.28
VB to Delphi


3-1097219685
Настенька
2004-10-08 11:14
2004.11.28
синхронизация dbgridов