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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.036 c
4-1097859065
GanibalLector
2004-10-15 20:51
2004.11.28
GetDiskFreeSpace


4-1096624185
MadSliMX
2004-10-01 13:49
2004.11.28
Как определить заголовок активного окна


14-1100179508
}|{yk
2004-11-11 16:25
2004.11.28
А как подключиться к инету через встроенный модем телефона?


1-1100622946
JIuraradg
2004-11-16 19:35
2004.11.28
Как оставить циклическую процедуру?


14-1100011383
matt
2004-11-09 17:43
2004.11.28
CAN-контроллеры





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