Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизКак вызвать метод класса для всех объектов этого класса Найти похожие ветки
← →
bond (2004-04-28 15:56) [0]количество объектов не известно
← →
Игорь Шевченко © (2004-04-28 16:07) [1]Никак
← →
evvcom © (2004-04-28 16:14) [2]Когда создаешь объекты этого класса, то сохраняй их где-нибудь в динамическом массиве или списке, а потом в цикле вызывай. Какие проблемы?
← →
bond (2004-04-28 16:14) [3]Игорь Шевченко © (28.04.04 16:07) [1]
>Никак
А вот в DelphiX, например обьявляется класс
TPlayerSprite = class(TImageSprite)
Private
lngpolet:integer;
oldlngpolet:integer;
procedure Hit;
protected
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
end;
Затем создаётся после, например, нажатие пробела сколь угодное кол-во обьектов этого класса, в таймере пишется
DXSpriteEngine1.Move(LagCount);
и всё, через определённый интервал времени все объекты класса TPlayerSprite выполняют все методы, описанные в этом классе
← →
Digitman © (2004-04-28 16:15) [4]
> Как вызвать метод класса для всех объектов этого класса
как "оттанцевать" (метод класса) всех девушек (объект класса) на дискотеке, причем - одновременно ?
← →
Digitman © (2004-04-28 16:17) [5]
> А вот в DelphiX, например
а вот в нашей деревне, например, теленок опоросился.. после "нажатия пробела" ..
← →
bond (2004-04-28 16:18) [6]Digitman © (28.04.04 16:15) [4]
Это не дискотека, это объектно-орентированное программирование!
← →
Ega23 © (2004-04-28 16:21) [7]как "оттанцевать" (метод класса) всех девушек (объект класса) на дискотеке, причем - одновременно ?
причём количество девушек (объектов) заранее не известно.
← →
Ega23 © (2004-04-28 16:27) [8]А если серьёзно, то DXSpriteEngine1.Move - исходник метода, пожалуйста. И inherited Move тоже.
← →
bond (2004-04-28 16:32) [9]Ega23 © (28.04.04 16:27) [8]
procedure TCustomDXSpriteEngine.Move(MoveCount: Integer);
begin
FEngine.Move(MoveCount);
end;
деляю CTRL+клик на move, открывается следующее
procedure TSprite.Move(MoveCount: Integer);
var
i: Integer;
begin
if FMoved then
begin
DoMove(MoveCount);// Эта пустая процедура, веё теле нифига
for i:=0 to Count-1 do
Items[i].Move(MoveCount);
end;
end;
← →
bond (2004-04-28 16:35) [10]FMoved - зто какая то логическая переменная
← →
Ega23 © (2004-04-28 16:39) [11]for i:=0 to Count-1 do
Items[i].Move(MoveCount);
Ключевое место! А теперь смотрим что такое TSprite.Items и Должно быть что-то вроде TSprite.Add(...) или TSprite.AddItem(...)
И всё становится понятно!
← →
WebErr © (2004-04-28 16:40) [12]В DirectX как раз всё сохраняется в Array"ях, включая спрайты, вершины, объекты (графические 3D-шки) и т.п. Естественно, что все спрайты массива будут делать всё, что вашей душе угодно после несложного цикла for.
← →
bond (2004-04-28 16:41) [13]Ну ладно, всем спасибо. Вообще-то я догадывался, что нужно помещать все объекты в список или дин массив, но думал, мож какой поумней метод есть!
← →
vl_chel © (2004-04-28 16:44) [14]Ответ возможен при использовании объектов СОМ+, там есть фабрика классов, она может знать о бо всех,
либо использовать в модуле (где описан класс) что то, что обеспечит знание о бо всех объектах созданных
← →
Digitman © (2004-04-28 16:44) [15]
> bond (28.04.04 16:18) [6]
> Это не дискотека, это объектно-орентированное программирование!
а какая разница ? ты способен окучить ОДНОВРЕМЕННО всех девушек ? хоть на дискотеке хоть еще где-то ? Нет ! ты делаешь это черное дело последовательно, методически, в цикле от первой до последней девушки в списке "окучиваемых" ! Или ты такой уникум, что мультипен..лен от рождения ?)
то же самое и в
for i:=0 to Count-1 do //вот он, цикл ! по всем девушкам, отовым к "окучиванию" !
Items[i].Move(MoveCount);
← →
bond (2004-04-28 16:45) [16]WebErr © (28.04.04 16:40) [12]
Вот только все объекты создаются вот так
TMyClass.create;
а не так
MyVar:=TMyClass.create;
Тоесть, как я понимаю, объект создаётся и предастовляется самому себе и своим методам, и управлять им уже невозможно
← →
Юрий Зотов © (2004-04-28 16:45) [17]> bond (28.04.04 15:56)
См. ответ [2]. Можно добавлять объекты в список вручную и обходить его тоже вручную. Можно делать это автоматически, написав ровно тот же самый код в методах самого класса и вызывая эти методы. Но другого пути нет, и Ваш Move все равно делает все то же самое. Потому что чудес не бывает.
← →
bond (2004-04-28 16:45) [18]bond (28.04.04 16:45) [16]
Я правильно понимаю?
← →
Digitman © (2004-04-28 16:46) [19]
> vl_chel © (28.04.04 16:44) [14]
> Ответ возможен
ответ невозможен ... никоим образом ... в принципе невозможен !
тот же самый цикл в том или ином виде скрыт в СОМ-объекте
← →
Digitman © (2004-04-28 16:59) [20]
> bond (28.04.04 16:45) [18]
>
> Я правильно понимаю?
правильно
← →
vl_chel © (2004-04-28 17:01) [21]ЮЮ Digitman © (28.04.04 16:46) [19]
> vl_chel © (28.04.04 16:44) [14]
> Ответ возможен
ответ невозможен ... никоим образом ... в принципе невозможен !
тот же самый цикл в том или ином виде скрыт в СОМ-объекте
>> Технологию COMа можно сэмулировать, делал такую штуку еще до того как узнал о СОМе
конструктор класса может знать о глобальном списке в котором хранятся все ссылки на созданные объекты НуИ думаем о реализации
← →
vl_chel © (2004-04-28 17:05) [22]COM технология не рассматривает циклов !!!
Там есть механизм подсчета ссылок на клас и при нулевом количестве сама вызывает деструктор!!!
← →
Digitman © (2004-04-28 17:19) [23]
> vl_chel © (28.04.04 17:05) [22]
> COM технология не рассматривает циклов !!!
ты о чем ? я - о внутренней реализации алгоритма объекта .. СОМ он или не СОМ
← →
Skier © (2004-04-28 17:34) [24]>bond (28.04.04 15:56)
Например :
-при создании (конструктор) объект заносит ссылку на себя в список объектов
-при уничтожении (деструктор) объект удаляет ссылку на себя из списка объектов
-при вызове определённого метода (в теле метода) бежим по списку и вызываем этот метод для всех объектов в списке
← →
Игорь Шевченко © (2004-04-28 17:45) [25]
> -при создании (конструктор) объект заносит ссылку на себя
> в список объектов
> -при уничтожении (деструктор) объект удаляет ссылку на себя
> из списка объектов
> -при вызове определённого метода (в теле метода) бежим по
> списку и вызываем этот метод для всех объектов в списке
Область применения для такого решения можешь показать ?
← →
vl_chel © (2004-04-28 17:48) [26]Я не буду говорить о внутренней реолизации объектов основанных на коме, не разбирался и пока не собираюсь, но нужное действие делается именно как я сказал.
Но естественно сразу (в одно и тоже время вызвать нельзя (или мы имеем дело с многопроцесорной системой)) метод вызывается по списку (естествено в цикле)
← →
Skier © (2004-04-28 17:50) [27]>Игорь Шевченко © (28.04.04 17:45) [25]
Об "области применения" должен думать автор вопроса.
Я отвечал на вопрос "как..."
← →
WebErr © (2004-04-28 17:53) [28]В общем-то посты должны были оборваться сразу после [2]
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.045 c