![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
Задача чуть-чуть сложнее, но это не суть... Заткнулся на кусочке где нужно шэйп раз в шаг таймера двигать на 1 вверх или вниз и на 1 влево или вправо, вроде всё должно быть просто, но не работает: постоянно движется вверх-влево... Никак не пойму в чём может быть проблема...
Код procedure TForm1.Timer1Timer(Sender: TObject);
begin randomize; if random(1)>0 then Shape1.Top:=Shape1.Top+1 else Shapes.Top:=Shapes[1].Top-1; randomize; if random(1)>0 then Shape1.Top:=Shape1.Top+1 else Shapes.Top:=Shapes[1].Top-1; end; -------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#2
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Тебя совсем не смущает, что вариант ф-ии 'random' для целых значений выдает диапазон от 0 до аргумента - 1 ?
-------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#3
|
|
![]() 😸🧡✊✌️ Сообщений: 16 411 Спасибо сказали: 3262 раза ![]() |
random(2) надо.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#4
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
">0" не надо. И еще автору кода хорошо бы проспаться, как по мне: "Shapes.Top:=Shapes[1].Top-1;" - это как-то совсем угнетающе...
-------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#5
|
|
![]() 😸🧡✊✌️ Сообщений: 16 411 Спасибо сказали: 3262 раза ![]() |
>> ">0" не надо.
Как раз надо. Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean. -------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#6
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
">0" не надо. И еще автору кода хорошо бы проспаться, как по мне: "Shapes.Top:=Shapes[1].Top-1;" - это как-то совсем угнетающе... Скован в выборе способа, сказали таким макаром двигать... По поводу проспаться не помешало бы, но и сделай скидку на то, что я этим занимаюсь первый год по 1 часу раз в две недели, с толпой народа... >> ">0" не нада Как раз надо. Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean. Угу тут нтак не кати,разве только окольными путями. Так как правильното будет? -------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#7
|
|
![]() 😸🧡✊✌️ Сообщений: 16 411 Спасибо сказали: 3262 раза ![]() |
Я давно писал на Delphi и совсем не помню, можно ли там перегружать operator []. Если нельзя, то к одной и той же переменной ты обращаешься с индексом и без, я не знаю, какое обращение правильное.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#8
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
насколько я помню, в дельфи нельзя перегружать ничего
|
|
|
![]()
Сообщение
#9
|
|
![]() допустим, мяў Сообщений: 24 074 Спасибо сказали: 13377 раз ![]() |
В Делфи начиная с 2006 перегружать операторы можно. Только зачем?
Но попробуй убрать один randomize. А лучше оба из цикла. Сбрось генератор 1 раз при инициализации. -------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
![]()
Сообщение
#10
|
|
![]() Etoslozhnostatus Сообщений: 8 576 Спасибо сказали: 15974 раза ![]() |
Цитата Или я дурак или одно из двух А где опрос? -------------------- - Да ну!?
- Horn of the Argali гну! |
|
|
![]()
Сообщение
#11
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
если бы ты учил матан (конкретно - пределы), то знал бы почему его нет
![]() |
|
|
![]()
Сообщение
#12
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата Или "=0", или "=1", или "<1". Это Pascal, здесь Integer нельзя использовать вместо Boolean. А, ну да, Вирт центрального процессора же... Тогда "=0", там хоть можно обойтись and reg, reg вместо cmp reg, imm. Байт, но приятно. Если нельзя, то к одной и той же переменной ты обращаешься с индексом и без, я не знаю, какое обращение правильное. И самое смешное, что ровно до этого автор пишет: "Shape1.Top:=Shape1.Top+1". Кстати говоря, это называется "Inc(Shape1.Top)". -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#13
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
|
|
|
![]()
Сообщение
#14
|
|
![]() 🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз ![]() |
Цитата Inc(Shape1.Top) Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю. -------------------- using namespace fbx;
|
|
|
![]()
Сообщение
#15
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата емнип, рандом выдает int16, так что как минимум 2 байта там будет. Изменяет: Цитата(http://www.delphibasics.ru/Random.php) function Random ( LimitPlusOne : Integer ) : Integer ...А Integer нынче приравнян к Int32... Цитата Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю. AFAIR эту проблемe решили вводом полновесной перегрузки: INC же оператором считается ? -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#16
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Цитата Вирт центрального процессора же Это неудачный юмор? По теме: одно из двух. Цитата Вроде так нельзя делать, т.к. это property, реализованный через сеттеры и геттеры, а может в новых дельфях можно, я даже и не знаю. Верно. И INC - предопределённая процедура. -------------------- |
|
|
![]()
Сообщение
#17
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
Это неудачный юмор? наверно все же намек на то, что особенности синтаксиса языка каким-то макаром влияют на результирующий код. тот же inc должен работать со свойствами, имеющими сет и гет одновременно и являющимися по сути синтаксическим сахаром.
|
|
|
![]()
Сообщение
#18
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата Это неудачный юмор? Это recordatio stultitia. Причем бессмысленной и беспощадной. Кстати, коли уж мы заговорили о булевой логике: Код Macro RandomSgn() : (1 | -Random(1)) : EndMacro ; Выдает единицу со случайным знаком. ...Так что никаких (y)if(f)’ов там, по большому счету, не нужно. Но сможет ли ОП адаптировать такой сложный код ? Цитата И INC - предопределённая процедура. Вроде местный аналог макрокоманды, если не ошибаюсь. -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#19
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Цитата Это recordatio stultitia. Причем бессмысленной и беспощадной. А если на русском? Это такой язык, который не японский, латинский и не английский. Цитата ...И никаких (y)if(f)’ов здесь, по большому счету, не нужно. Макросы? Помилуй, Хрона, начни уже читать о проектировании языков программирования, безопасной разработке программного обеспечения и доказательном программирования. Иначе всю жизнь вокруг тактов, байтов и низкоуровневых вещей ходить будешь. Код FUNCTION RandSign: INTEGER; BEGIN RESULT := 1 - 2 * Random(2); END; Цитата Вроде местный аналог макрокоманды, если не ошибаюсь. Ошибаешься. Это предопределённая процедура System.INC. Она раскрывается компилятором в коде, но это деталь реализации определённого компилятора. Цитата наверно все же намек на то, что особенности синтаксиса языка каким-то макаром влияют на результирующий код. тот же inc должен работать со свойствами, имеющими сет и гет одновременно и являющимися по сути синтаксическим сахаром. INC это предопределённая процедура, принимающая аргумент по ссылке (VAR). Свойства по ссылке передаваться не могут по понятным причинам. В конечном итоге они могут вести к функциям. -------------------- |
|
|
![]()
Сообщение
#20
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата А если на русском? Хирт - вуй. Все по аналогии (же). Цитата Макросы ? Помилуй, Хрона, начни уже читать о проектировании языков программирования, безопасной разработке программного обеспечения и доказательном программирования. Ну, почитала: http://nemerle.org/Macros Цитата Она раскрывается компилятором в коде, но это деталь реализации определённого компилятора. Тогда, простите, может еще к System.Pi следует относиться как функции ? Цитата Свойства по ссылке передаваться не могут по понятным причинам. По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти. ...Я уж не говорю, что вообще-то должны, ибо на то оно и ЯВУ. Абстракция. -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#21
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Цитата Хирт - вуй. Все по аналогии (же). Не вижу смысла в дальнейшей беседе. Цитата Тогда, простите, к System.Pi следует относиться как функции ? А как она объявлена? FUNCTION Pi : EXTENDED; Цитата По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти. Покажу лишь простой пример: PROPERTY A: INTEGER READ fA; INC(A); // нельзя, свойство недоступно на запись PROPERTY A: INTEGER READ fA WRITE fA; INC(A); // предположим, что можно, но... PROPERTY A: INTEGER READ GetA WRITE fA; // изменилось определение Весь код мёртвый, модульность и раздельная компиляция не работают. Было поле, стала функция. Поэтому даже не самые умные люди такие простые вещи понимают при разработке языков. За сим откланиваюсь, имея столько свободного времени, ликбезом можно заниматься самостоятельно. -------------------- |
|
|
![]()
Сообщение
#22
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
безопасной разработке программного обеспечения ок, замени макрос на inline. те же яйца, только в профиль.INC это предопределённая процедура, принимающая аргумент по ссылке (VAR). Свойства по ссылке передаваться не могут по понятным причинам. В конечном итоге они могут вести к функциям. но сделать инкремент универсальным можно же. propertySet(propertyGet()+1)Тогда, простите, может еще к System.Pi следует относиться как функции ? уже представил компилятор, в котором пи = 4По ссылке, в данном случае, может быть передан адрес соотв. поля в памяти. компилятор не оптимизирует, операторы не универсальны. вообще бардак. о какой передаче после этого может быть речь?
|
|
|
![]()
Сообщение
#23
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата Не вижу смысла в дальнейшей беседе. А в чем ты видишь смысл, позволь полюбопытствовать ? В вырожденной перегрузке long word’а под названием ‘Boolean’, коею компилятор даже не желает по-тихому обработать, чтобы никто не знал ? Даже, пожалуй, не поленюсь дать пример: Код If ReadFile(0, “имя_файла”); Открываем файл на чтение. Если получилось... ; [Читаем данные] Closefile(0); ...Закрываем файл. Else; [Выводим ошибку] Endif ...Да, ‘ReadFile’ в данном случае возвращает какой-то свой код, о значении которого я могу не задумываться. Теперь попробуй то же самое на Delphi. Цитата А как она объявлена? Такие подробности должны волновать доказательного программиста, коий принципиально не в курсе о байтах и тактах ? Цитата Весь код мёртвый, модульность и раздельная компиляция не работают. А если все INC'и из примера заменить на A := A + 1, то он оживет обратно ? Цитата уже представил компилятор, в котором пи = 4 Есть немного: http://www.bestwtf.com/2010/11/explaining-why-pi-is-4.html Цитата компилятор не оптимизирует, операторы не универсальны. вообще бардак. о какой передаче после этого может быть речь? После берсеркерского траура по модульности я вообще в способностях Delphi к работе с ООП сомневаться начала... Но вообще помимо Get/Set простым полям можно просто еще ввести автоконструируемое по умолчанию AccessPtr. ...Что я, собственно, пытаюсь сказать: инструмент разработки должен либо самостоятельно решать технические неувязки (HLL:Prolog,REBOL,Nemerle,etc), либо предоставить свободу работы с ними программисту (MLL:PureBASIC,C,FORTH,etc). Одно из двух, иначе получается полное Delphi. -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#24
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
Код FUNCTION RandSign: INTEGER; BEGIN RESULT := 1 - 2 * Random(2); END; Вот такая функция вполне вписывается в пройденную на данный момент часть обучения, попробую как будут делфя под рукой (дома не ставлю этого монстра)... З.Ы. Единственный кто понял вопрос правильно... Хотя бы потому что был интересен ответ не на профессиональном уровне и даже не на моём, а на уровне текущей части обучения... СПС! -------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#25
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Цитата Единственный кто понял вопрос правильно... Вообще-то он просто "перевел" за тебя мой пример, но да как будет угодно. Тему закрывать ? -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#26
|
|
![]() Что же Вы , Маэстры, ну-ка гряньте нам что-нибудь !!! Сообщений: 226 Спасибо сказали: 171 раз ![]() |
А не проще не делать привязку к знаку а просто
Код if random(2) = 1 then shape1.top := shape1.top + 1 else shape1.top := shape1.top - 1; if random(2) = 1 then shape1.left := shape1.left + 1 else shape1.left := shape1.left - 1; Randomize делается 1 раз на старте программы - традиционно в FormCreate Также можно упростить код из 1 поста до вида: Код shape1.left := shape1.left + RandSign; // Berserker's randsign shape1.top := shape1.top + RandSign; Обсуждение о булеане считаю оффтопом, давайте не холиварить, каждый инструмент для своей задачи (в паскале, собственно, низкий порог вхождения без неявностей типа скрытого каста инта в бул, который если нужен, всегда можно сделать Ord(bool) или даже непосредственно Integer(bool)) Инк-обсуждение тоже оффтоп )) Темку можно и не закрывать, чувствую, что не один вопрос ещё будет -------------------- Это всё я : кодинГ, мэпмейкинГ, скриптинГ
Инфо о моих проектах, в основном геройских, http://phomm.narod.ru Раздел моей тактической игры Интакт http://forum.df2.ru/index.php?showforum=135 |
|
|
![]()
Сообщение
#27
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
в паскале, собственно, низкий порог вхождения без неявностей типа скрытого каста инта в бул в c# же вообще неявных кастов не бывает, обязательная запись способа передачи параметра при вызове функций, сборщик мусора и нет параметров по умолчанию. куда дружелюбнее к новичкам, чем паскаль.
|
|
|
![]()
Сообщение
#28
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20596 раз ![]() |
Цитата в c# же вообще неявных кастов не бывает Расширяющие же, не? Или они не в счет? |
|
|
![]()
Сообщение
#29
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
хм, почему-то я думал они только для классов работают. но по крайней мере они не теряют информацию
|
|
|
![]()
Сообщение
#30
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
Не поленилась, вот, дизассемблировать свой вариант RandomSgn:
Код push dword 0x1 call dword 0x4054fb mov ebx, eax neg ebx or ebx, 0x1 ...и, дабы уж сразу, аналог by Berserker... Код push dword 0x1 call dword 0x4054fb mov ebx, eax add ebx, ebx neg ebx inc ebx Дело, в принципе, хозяйское (+/- операнд). Suum cique. -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#31
|
|
![]() Яблочный произвол! Сообщений: 11 080 Спасибо сказали: 3988 раз ![]() |
не пойму зачем оно переносит в ebx, если результат функции все равно в eax возвращать.
|
|
|
![]()
Сообщение
#32
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
не пойму зачем оно переносит в ebx, если результат функции все равно в eax возвращать. У компилятора PB, увы, много фобий касательно регистра EAX. Это - одна из них. -------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#33
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
Ещё 1 вопросик, незнаю как бы нагуглить, потому решил спросить...
В form1 на клик по кнопке происходит form2.show; в form2 на клик по кнопке происходит form2.hide; form1.show;... Так всё работает как надо, а вот если в form1 делать не form2.show а form2.showmodal, то после нажатия в form2 нужной кнопки она скрывается, но фокус form1 не возвращается... Вот собственно и вопрос: как вернуть фокус первой форме, если вторая открыта из него в модальном режиме? -------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#34
|
|
![]() •●Revolucionario●• Сообщений: 2 467 Спасибо сказали: 5936 раз ![]() |
http://msdn.microsoft.com/en-us/library/wi...1(v=vs.85).aspx ? Ну или местное SetFocus...
-------------------- life MOV.I #life+1, *life
האם יש זמן לעצור ? |
|
|
![]()
Сообщение
#35
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
Всё, вопрос снят, прослушал, что закрывать не hide`ом, а всего-навсего close`ом )
-------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#36
|
|
![]() Freedom Fighter Сообщений: 1 852 Спасибо сказали: 4031 раз ![]() |
И снова я...
Нужно ограничить пользователя при вводе данных в стринггрид: ввод минуса не в первую позицию, ввод второго минуса, ввод чисел перед минусом. Для эдита я решал это так: Код procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin case key of '0'..'9', #8: if (Edit1.SelStart=0)and(pos('-',Edit1.Text)>0) then Key:=#0; '-': if (Edit1.SelStart<>0)or(pos('-',Edit1.Text)>0) then Key:=#0; else Key:=#0; end; end; А в стринггриде нет селстарта, потому единственное что работает так же это запрет ввода 2-го минуса: Код '-': if pos('-',StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>0 then Key:=#0; Не подскажете, что можно сделать для оставшихся 2-х ситуаций? -------------------- In this wild and woolly universe of ours, there are only three things you can count on: your brains, your bros, and your bike! |
|
|
![]()
Сообщение
#37
|
|
![]() 😸🧡✊✌️ Сообщений: 16 411 Спасибо сказали: 3262 раза ![]() |
На всякий ввод пользователя тут же пробуй преобразовать его в число, а затем на равенство строке '-'. Если оба теста проваливаются, тут же возврашай предыдущий текст. Qt-шный QIntValidator именно так работает.
-------------------- Я слежу за тобой!
![]() ![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
![]()
Сообщение
#38
|
|
![]() 🐓🐓🐓🐓🐓🐓🐓 Сообщений: 1 845 Спасибо сказали: 1570 раз ![]() |
Может что-то типа такого? http://forum.boolean.name/showthread.php?t=5561
-------------------- using namespace fbx;
|
|
|
![]() ![]() |
Текстовая версия | Сейчас: 18 August 2025 - 17:41 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|