Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2019, 00:24   #171
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в дополнение к #163
с этим разберусь позже. сначала надо запустить без .lfm
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 16.08.2019, 09:06   #172
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
с этим разберусь позже. сначала надо запустить без .lfm
.lfm это то же что и .dfm, но для Lazarus
и поскольку никаких модификаций формы не проводилось вполне можно использовать старый .dfm (c исправлением .lfm --> .dfm)
P.S. да еще можно (или нужно) убрать режим {$MODE DELPHI}
1.zip все тоже с добавленным face.lfm

а вообще предполагалась такая схема работы.
берем своИ модули.
читаем пункт инструкции
делаем минимально то что там написано, компилируем.(естественно пункт замены uses можно и нужно пропустить)
естественно куча ошибок, прилагаем усилия, чтобы избавиться от оных (возможно "подглядывая" в приложенные файлы)
повторяем для следующего пункта.

конечно вам было бы желательно иметь контрольные файлы ПОСЛЕ каждого из пунктов. (может и будет после выходных).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.08.2019 в 09:21.
evg_m вне форума Ответить с цитированием
Старый 16.08.2019, 12:10   #173
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а вообще предполагалась такая схема работы.
Ну, что теперь сделать.
Могу сказать, что все такио большую часть всего этого я уже сделал сам, но хуже . И удаление указателей, и изменение USES, и обдумывание избиточности Cell.Замучался, подумывал отодвинуть на месяцок эти дела, хобби же.. А тут такая реализация, к которой я бы пришел через полторы недели.так что педагогический эффект всё же получился, во всяком случае, не получился прерывистый процесс разработки. Получился последовательный.

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

Последний раз редактировалось anaschu; 16.08.2019 в 16:42.
anaschu вне форума Ответить с цитированием
Старый 17.08.2019, 13:03   #174
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

TMyEvent. Самое близкое, что я пока нашел.
http://www.cyberforum.ru/delphi-begi...read74814.html
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 17.08.2019, 17:38   #175
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
кроме последнего на 9 шаге.
При запуске у меня появляется проблема в процедуре init
Я не очень, видать, понимаю, как работают обработчики событий. В процедуру инит надо четвертым параметром подать что то связанное с классом обработки событий.

Procedure Init(Size: integer; Food, Mater: Single; notify: TNotifyEvent);

Я не знаю, что подавать в качестве notify

Вот тут прикреплены только сами юниты без интерфейса
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 17.08.2019 в 17:44.
anaschu вне форума Ответить с цитированием
Старый 18.08.2019, 22:26   #176
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
При запуске у меня появляется проблема в процедуре init
Я не очень, видать, понимаю, как работают обработчики событий. В процедуру инит надо четвертым параметром подать что то связанное с классом обработки событий.

Procedure Init(Size: integer; Food, Mater: Single; notify: TNotifyEvent);

Я не знаю, что подавать в качестве notify

Вот тут прикреплены только сами юниты без интерфейса
один юнит я проикрепил не тот, простите. юнит модель старый прикрепил, А вот нормальные файлы. кстати мои прошлые не прикреплялись, потмуо что там я полный проект заливал, да еще с историей гита. Не надо было так делать)
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 18.08.2019, 22:56   #177
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
ПОСЛЕ каждого из пунктов
ну насчет вопросов мне я пока не знаю, я не всё понял ибо.

Я не понял насчет 8 го пункта совсем. Кого мы извещаем о изменениях в клетке? насколько я понимаю изменение ячейки инициируется из модели. о чем ячейка извещает? и кого именно? мне не ясно. я тупой))

Код:
8. ну вот вчерне разобрались а теперь подумаем как мы будем получать 

информацию о состояниях.
мы выбираем вариант получать информацию о прведенных изменениях 

непосредствеено сразу после.
8.1. в таком случаем каждая ячейка (TCell) должна знать свое место на 

"карте" и уметь извещать о соем изменении.
Tcell.Create(X, Y: integer; // место
             Afood, Amater: Single; // начальные ресурсы
             notify: TNotifyEvent // и наше извещение
             );
если для отображения используется StringGrid, то не надо после каждого изменения ячейки извещать об этом! если извещать, то после изменения одной ячейки будет весь грид перерисовываться. Это влияет на перерисовку грида частенько быстродействие начинает изменяться. Или я чего то не понял?
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 18.08.2019 в 23:04.
anaschu вне форума Ответить с цитированием
Старый 18.08.2019, 22:59   #178
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Насчет пункта 3.


Код:
3. убрали переменные Mcount, Wcount. Зачем помнить то что всегда можно 

посчитать по необходимости.
Как мне кажеться, это зависит от того, сколько времени будет тратиться на вычисление. я бы не пересчитывал Mcount, Wcount каждый раз! пока не знаю, насколько много у меня мест, в которых эти значения меняются...
У меня эти счетчики меняются циклом от одного до 50 ти один раз за шаг без миграции и два раза за шаг ициклом , если миграция есть.

У меня за шаг в клетке может родиться 100 детей и 50 из них перейти в другую клетку. Получается, мне за раз надо будет 150 раз в каждой клетке пересчитывать Mcount Wcount? вот непонятно, что лучше . пересчитывать их 150 раз или переписывать Mcount Wcount 150 раз
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 18.08.2019 в 23:02.
anaschu вне форума Ответить с цитированием
Старый 19.08.2019, 09:56   #179
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Я не знаю, что подавать в качестве notify
в качестве notify передается ИМЯ процедуры(метода формы) которую мы хотим вызывать каждый раз как состояние модели (ячейки) изменилось.
у меня это
Код:
 private
     procedure AfterChangeCell(sender: TObject);
Код:
  Init(Size, 1, 1, self.AfterChangeCell);
Код:
procedure TForm1.AfterChangeCell(sender: TObject);
var
  r: TCell;
begin
  r:=sender as TCell; // изменилась вот эта ячейка
  self.StringGrid1.Cells[r.X, r.Y]:=r.Inform; // выводим информацию о состоянии ячейки в Grid
end;
[CODE]Procedure Init(Size: integer; Food, Mater: Single; notify: TNotifyEvent); //notify нам нужно только для ячеек
var
i, j: Integer;
r: TCell;
begin
...
r:=Tcell.Create(i, j, food, Mater, notify); //поэтому передаем ее тудаCODE]
Цитата:
Как мне кажеться, это зависит от того, сколько времени будет тратиться на вычисление.
до тех пор пока код подвержен изменениям а в "экспериментальных" задачах это практически всегда, лучше хранить минимально. И вводить новые состояния только при действительной(реальной) нехватке времени (преждевременная оптимизация).
любое "суммарное" состояние надо отслеживать и всегда помнить о такой необходимости при написании всего без исключения нового кода. (по прошествии времени об этом забывается, особенно если некоторое время модификации не требовали изменений данного состояния).
сортировка массива (списка) занимает времени больше чем подсчет какого-либо количества в том же списке.

Цитата:
У меня за шаг в клетке может родиться 100 детей и 50 из них перейти в другую клетку.
для этих действий (по крайней мере рождение) НЕ ТРЕБУЕТСЯ подсчет Qcount(sex).

в используемой мною версии Qcount использовался исключительно в расчетах стиля потребления.
Вот там можно рассчитать локально(использовать ЛОКАЛЬНУЮ переменную процедуры).
Код:
procedure Tcell.DoStep...
var
  Mcount, Wcount: integer;
begin
  Mcount:=Qcount(t_man);
  Wcount:=Qcount(t_woman);
 // а потом использовать в этой процедуре только что рассчитанное значение.
  ...
P.S. на самом деле здесь можно использовать просто цикл для расчета ДВУХ (и более)
Код:
 mcount:=0;
 wcount:=0;
 for j:=0 to self.popul.count-1 do begin
   r:=self.popul[j] as THuman;
   case r.GetGenotypeSex of
   t_man: inc(mcount);
   t_woman: inc(wcount);
   end;
end;
и таким образом мы избавляемся от function Qcount.
при выводе информации мы точно также можем локально посчитать.

Цитата:
если для отображения используется StringGrid, то не надо после каждого изменения ячейки извещать об этом! если извещать, то после изменения одной ячейки будет весь грид перерисовываться. Это влияет на перерисовку грида частенько быстродействие начинает изменяться. Или я чего то не понял?
в принципе да, перерисовка имеет место быть. но обычно это ровно ОДНА ячейка Grid.
каждый раз но для всех ячеек.
и в данной ситуации пошаговое исполнение(т.е. когда мы нажимаем кнопку для выполнения КАЖДОГО шага модели) это(отрисовка) выполнится быстрее чем МЫ нажмем "следующий" раз.

но пошаговое изменение позволяет лучше следить за правильностью алгоритма "жизни" (мы можем проследить за всеми изменениями).
ЕСЛИ мы желаем следить за "жизнью" в реале (запустить сразу цикл на много-много шагов).
то придется "придумывать" как будем следить.
вар.1. увидеть СРАЗУ последний. (ну или каждый десятый/пятидесятый/....)
добавить к DoStep номер шага.
Код:
TCell.DoStep(numstep: integer); // или (evstep: boolean); чтобы не считать каждый раз для каждой 
begin
...
  if numstep mod 50 then  self.Fnotify(self);
 // if evstep then self.Fnotify(self);
end;
и не использовать self.Fnotify(self) нигде более как в этой процедуре.
но опять в случае ВАЖНЫХ изменений у нас остается возможность сообщить "наблюдателю" сразу же.
т.е. все-таки использовать в некоторых ситуациях.

вар.2. посматривать время от времени. использовать таймер.
придется либо использовать потоки (иначе даже самый маленький таймер сработает только по окончании ВСЕХ шагов.)
либо делать "искусственное прерывание" цикла шагов. Application.ProcessMessage;
НО и там все также использовать можно будет все тот же механизм
Код:
Tform1.Ontimer(sender: TObject);
begin
  DoEventModel;// инициируем общий показ
end;
Код:
procedure doEventModel;
begin
  for j:=0 to Field.count-1 do
    (Field[j] as Tcell).doEvent; // теперь для каждой
end;
Код:
procedure TCell.DoEvent;
begin
  self.Fnotify(self); // и наконец 
end;
вар.3. мы хотим не просто вывести строку информации.
Цитата:
Код:
  result:=format('res=%f popul=%d\%d', [self.Food, self.Qcount(t_man), self.Qcount(t_woman)]);
А например рисовать состояние КАЖДОЙ ячейки. (причем много разных состояний).
полоса ресурсов, население( с разделением полов/...), ....
DrawCell ???
но возможно будет лучше (да и проще с т.з. программирования) это использовать Frame.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.08.2019 в 11:06.
evg_m вне форума Ответить с цитированием
Старый 19.08.2019, 11:22   #180
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
TMyEvent. Самое близкое, что я пока нашел.
http://www.cyberforum.ru/delphi-begi...read74814.html
вполне нормальное объяснение (#2).
единственно я не использовал
Цитата:
property OnMyEvent: TNotifyEvent ... write FonMyEvent;
а задавал "реакцию на событие" в конструкторе
Цитата:
constructor Create(...; notify: TNotifyEvent);
begin
...
self.FNotify:=notify; //запомнили как мы будем вызывать других если они хотя знать о нас(наших изменениях)
end;
и не писал procedure DoMyEvent;
Цитата:
Код:
procedure TMyClass.DoMyEvent;
begin
  //Если обработчик назначен, то запускаем его.
  if Assigned(FOnMyEvent) then FOnMyEvent(Self);
end;
а делал вызов реакции непосредственно по месту и без проверки.
Код:
if assigned(self.FonNotify) then self.FonNotify(self);
P.S. исключительно из-за собственной лени в наборе.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.08.2019 в 11:25.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение клеточного автомата в Excel olgafirst Помощь студентам 0 02.04.2014 00:26
Математическая модель "Автосервис" pro100saniok Помощь студентам 4 24.05.2012 18:31
Меня раздражают наши "звезды", которые считают себя сливками общества... grenles Свободное общение 53 16.02.2011 11:16
Стоит ли покупать видеокурс О.Л.Соколова, Видеокурс О.Л.Соколова "Проф.хакер" arkad-167 Помощь студентам 1 27.02.2010 10:32
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49