Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите:
    Пишу
    Const
      OneKB = 1024;
      OneMB = OneKB * 1000;
      ...
      4700_DVDRom = OneMB * 4700;
     
    Компилятор тычет на 4700_DVDRom и говорит "Overflow in conversion or arithmetic operation"
     
    Как мне сказать компилятору, что 4700_DVDRom должен быть Int64???
     
    Спасибо.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 22:28 04-12-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    А так:

    Код:
     
    Const
      OneKB = 1024;
      OneMB = int64(OneKB* 1000);
      DVDRom = int64(OneMB * 4700);
     

     
    ЗЫ: С каких это пор имена стало можно давать с ведущими цифрами (4700_DVDRom - это не прокатит!)?

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 00:59 05-12-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Ну допустим DVDRom (я просто сократил ненужную информацию).
    То-же самое...

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 01:05 05-12-2009 | Исправлено: Aleksandr N, 01:06 05-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    4700_DVDRom - это не прокатит!

    Ага. А ещё и DVDRom получился средний

    Цитата:
    мегабайт бывает коротким, средним и длинным:
    короткий — 1 000 000 байт
    средний — 1 024 000 байт
    длинный — 1 048 576 байт

    http://ru.wikipedia.org/wiki/Мегабайт
     
    Добавлено:

    Цитата:
    То-же самое...

    На D2009 и D2010 компилируется без проблем

    Код:
    {$APPTYPE CONSOLE}
     
    const
      OneKB = 1024;
      OneMB = int64(OneKB * 1000);
      DVDRom = int64(OneMB*4700);
     
    begin
    end.


    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 01:09 05-12-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    data man
    Мне без разницы длина Мб.
    В данный момент на D7 не хочет...

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 01:11 05-12-2009 | Исправлено: Aleksandr N, 01:12 05-12-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N

    Цитата:
    о-же самое...

    Перед тем как написать ответ, я его проверил на Дельфи 2007.

    Цитата:
    В данный момент на D7 не хочет..

    А почему бы сразу не указать версию компилятора?
    Счас проверил на Дельфи 7. Без сучка и без задоринки. Аж обидно Может у тебя чё-то с настройками компилятора...
     
    Добавлено:
    data man
    про средние мегабайты - прикольно

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 01:18 05-12-2009 | Исправлено: psa1974, 01:22 05-12-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974
    Интересно! Вот только интересно почему у меня не срабатывает... Буду ковыряться...
    А может ещё способ есть?

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 01:27 05-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
     
    Для начала dcc32 test.dpr, где test.dpr приведенное мною консольное приложение.
    Если скомпилируется без ошибок (а ведь должно !) - копать в сторону опций проекта.

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 01:33 05-12-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    data man
    Да, что-то в проекте не так. Только вот что - непонятно...

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 02:03 05-12-2009
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Думаю копать надо в сторону типа Ordinal. Первоначально он соответствовал длине 32 бита и даже если Delphi 6 и понимала уже тип Int64, то всё одно преобразования этого типа с типом Variant не всегда работали. Ошибки были не математические а конверсионные исключения. Мне даже думается что в компиляторе Delphi 7 в бинаре, может быть используется та же математика. Константа в нашем случае это не типизированная переменная, а некоторая экспрессия которая должна вставлятся инлайном в те места где указано её имя в коде. Для пробы можно поэкспериментировать с написанием среднего мегобайта так:
     
    const
       DVDRom2: int64 = (OneMB*4700);  
     
    ps
    Мои соболезнования по поводу Тихонова.
     
    Добавлено:
    у мну в D7 мегобайт компилируется и так и эдак.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 12:47 05-12-2009
    Delta RuBoard



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins

    Цитата:
    Delta RuBoard  
    То, что вы хотели повесить на кнопку, лучше впихнуть в отдельный поток.

    это я в принципе то и хочу. я только не могу понять как =\

    ----------
    мой маленький блог
    Создание on-line игр

    Всего записей: 382 | Зарегистр. 21-06-2005 | Отправлено: 13:32 05-12-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    delover
    Хм... Странно, что у тебя const  DVDRom2: int64 = (OneMB*4700); работает... У меня:

    Код:
     
    Const
      OneKB = 1024;  
      OneMB = int64(OneKB* 1000);  
      DVDRom= int64(OneMB * 4700);
     

    это работает во всех дельфях
     

    Код:
     
    Const
      OneKB_ = 1024;  
      OneMB_ :int64 = (OneKB_* 1000);
      DVDRom_:int64 = (OneMB_ * 4700); // [DCC Error] Unit8.pas(37): E2026 Constant expression expected
     

     

    Код:
     
    Const
      OneKB__ = 1024;
      OneMB__ = (OneKB__* 1000);
      DVDRom__:int64 = (OneMB__ * 4700);  //[DCC Error] Unit8.pas(41): E2099 Overflow in conversion or arithmetic operation
     

     
    Const
      DVDRom___:int64 =  4812800000; // работает во всех дельфиях
     
    Ситуевина одинаковая что в дельфи 7 что в дельфи 2009.  

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 14:31 05-12-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Цитата:
    OneMB_ :int64 = (OneKB_* 1000);
      DVDRom_:int64 = (OneMB_ * 4700); // [DCC Error] Unit8.pas(37): E2026 Constant expression expected  

    Потому, что OneMB_ на самом деле уже переменная.
    Может помочь опция "присваиваемые типизованные кончтанты", выставляется в настройках проекта или директивой {$J+} / {$J-} или {$WRITEABLECONST ON} / {$WRITEABLECONST OFF}. Я не проверял, если интересно можешь посмотреть.

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 01:30 06-12-2009
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tantos

    Цитата:
    DoubleBuffered=true ?

    Кому вопрос?

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 01:50 06-12-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter

    Цитата:
    Потому, что OneMB_ на самом деле уже переменная

    Мне это как раз очевидно, я просто удивлялся, как delover удалось это сделать.  
    А {$WRITEABLECONST ON}/{$WRITEABLECONST OFF} побоку, никакого эффекта в данном случае не оказывает.
     
    Aleksandr N
    Если так и не удалось заставить работать код, приведенный мной с самого начала, то как вариант можно описать глобальные переменные и инициировать их значениями в секции initialization.
    Либо, если использовать Дельфи от 2005 и выше, можно описать соответствующие inline-функции...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 03:42 06-12-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Цитата:
    Хм... Странно, что у тебя const  DVDRom2: int64 = (OneMB*4700); работает... У меня:  

    Могу ошибаться, но тип результата определяется максимальным типом входящих в выражение операндов. Поэтому в Вашем примере последнюю строку запросто можно поменять на "DVDRom= OneMB * 4700;" и все прокомпилируется, поскольку в этом вырвжении OneMB уже имеет тип Int64.  

    Код:
     
    const
      OneKB = 1024;
      OneMB = int64(OneKB* 1000);
      DVDRom= int64(OneMB * 4700);
     

     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 05:57 06-12-2009
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter

    Цитата:
    тип результата определяется максимальным типом входящих в выражение операндов

    Действительно, так работает (но и первоначальный вариант ответа для Aleksandr N Ссылка у меня тоже работал, как и у всех остальных кроме самого Aleksandr N):

    Цитата:
    Const
      OneKB = 1024;
      OneMB = int64(OneKB* 1000);
      DVDRom= OneMB * 4700;
     
     
    а так - нет (поскольку OneMB_ - уже переменная):

    Цитата:
    Const
      OneKB_ = 1024;
      OneMB_ :int64 = (OneKB_* 1000);
      DVDRom_ = OneMB_ * 4700; //[DCC Error] Unit8.pas(36): E2026 Constant expression expected
     

    Все логично

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 06:59 06-12-2009
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974

    Цитата:
    Const  
      OneKB = 1024;  
      OneMB = int64(OneKB* 1000);  
      DVDRom= OneMB * 4700;  

    А вот так действительно сработало, в торопях делал уставши...

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:49 06-12-2009
    Tantos



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EugeneBoss3

    Цитата:
    Кому вопрос?

    Тебе. Установка данного свойства для формы решит твою проблему?
     


    ----------
    Чем больше узнаю людей, тем больше люблю компьютеры.

    Всего записей: 1038 | Зарегистр. 31-05-2005 | Отправлено: 04:09 07-12-2009
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tantos
    Двойная буфферизация проблемы не решает.
     
    Решил проблему следующим образом:
    Нужно поместить нужный код до обращения к методу Application.Run.
    Пример реализации

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 07:50 07-12-2009 | Исправлено: EugeneBoss3, 03:41 08-12-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru