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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

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


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


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alex1334
    странно, с точкой должно работать. вот так
    ShowMessage(Format('%.8x', [$FF]));
    что выдает?
     
    От настроек не должно зависеть, цитата из хелпа D6:

    Цитата:
     
    Hexadecimal. The argument must be an integer value. The value is converted to a string of hexadecimal digits. If the format string contains a precision specifier, it indicates that the resulting string must contain at least the specified number of digits; if the value has fewer digits, the resulting string is left-padded with zeros
     

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 15:29 31-10-2012 | Исправлено: A_V, 15:54 31-10-2012
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    alex1334
     
    формат %.8х слева 0:  Format('%.8x',[1234]) >  [000004D2]
    формат %8х слева пробелы:  Format('%8x',[1234]) > [     4D2]
     
    Функция trim удаляет пробелы

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 15:59 31-10-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет.
    Есть такой неприятный косяк.
    Загружаю файл в stringlist

    Код:
    var F : TStringList;
    ...
    F:=TStringList.Create();
    F.LoadFromFile(path);

     
    Если пытаться прочитать строчу, в которой много нулей (та, что на рисунке), то происходит исключение

    и дальше работать отказывается.
    Это переполнение или особенности хранения строчек StringList?  
     

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 21:33 01-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    давайте полную информацию
    - что за исключение происходит (тип, текст)  
    - где именно (строчка кода)
    а то так только гадать можна - на LoadFromFile или потом при использовании (тогда и тот код нужен)

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 01:13 02-11-2012
    krapotkin

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ichigo2
    Предполагается. что LoadFromFile готов прочитать то, что записалось в SaveToFile.
    Думаю, что просто не предполагается, что в строке вообще могут быть символы #0.
    Обойти это можно, загрузив файл в TFileStream и далее оттуда добавлять построчно в StringList
     
    Накладные расходы - 10 строк кода.

    Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 10:36 02-11-2012
    Gnom3



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

    Цитата:
    Это переполнение или особенности хранения строчек StringList?  


    Цитата:
    Думаю, что просто не предполагается, что в строке вообще могут быть символы #0.  

    символ #0 в каждой строке быть обязан, я давно уже вбил себе это в голову - это символ окончания строки для любого строкового параметра, в том числе и для каждого элемента массива типа tStrings. Совсем другое дело, когда пачка таких символов в одной строке. можно порекомендовать читать файл вручную, и парсить каждую строку, если больше одного #0 находим, то все предидущие в этой строке заменяем на, например, #32 (вроде под этим символом пробел идет).
     
    Есть вопрос - скорей всего ничего сложного, но все-же - как заполнить ImagеList системными иконками из Shell.dll? (вроде там они лежат...)

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 11:03 02-11-2012 | Исправлено: Gnom3, 12:59 02-11-2012
    krapotkin

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Gnom3
    Строго говоря, #0 не является частью строки. Это терминатор, что располагается после нее.
    Еще раз предлагаю обратиться к файлу, что создается по TStringList.SaveToFile
    там строки разделяются #13#10 и все.
    следовательно, появление #0 для StringList - сюрприз
     
    p.s. предЫдущие
    p.p.s #0 при разборе вообще игнорировать и пропускать

    Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 12:32 02-11-2012
    Ichigo2



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Оказывается уже после этой строчки ничего нет.

    Попробую через TFileStram

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 13:02 02-11-2012
    Gnom3



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

    Цитата:
    p.p.s #0 при разборе вообще игнорировать и пропускать

    все зависит от файла, и будет-ли он сохраняться в прочитанном виде обратно. Хотя не могу не согласиться что такой вид - наиболее вероятно, что ошибка при предидущей записи.
    Цитата:
    Строго говоря, #0 не является частью строки.

    Эмм. Этот знак всегда присутствует в конце строки. strlen('mama') возвращает 5, просто "нечтение" этого символа заложено во всех функциях работы со строками. Хотя, это всего-лишь мой взгляд, а в работе со строками у меня часто бывают проблемы, может как раз из-за того, что неправильно понимаю принцип построения строки..

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 13:05 02-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Выложите сам файл и часть кода
    Если код а-ля
    for i := 0 to f.count do
    ...
    то конечно будет падать, после того, как i = count...
     
     

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 13:24 02-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    а попробуйте "по честному" - открыть файл и в цикле while not eof через readln строки вытягивать

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 21:25 02-11-2012
    krapotkin

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Gnom3
    >>strlen('mama')
     
    http://www.cplusplus.com/reference/clibrary/cstring/strlen/
    :: number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself)
    http://delphi.scps.ru/string/str5223.htm
    :: количество символов строки без учета символа конца строки.
     
    strlen('mama') = 4 !
     

    Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 00:20 03-11-2012 | Исправлено: krapotkin, 00:21 03-11-2012
    gosnami

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    strlen - длина БЕЗ учета символа конца строки.
    StrEnd    Возвращает указатель на символ окончания длинной строки.

    Всего записей: 101 | Зарегистр. 02-11-2012 | Отправлено: 00:29 03-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    krapotkin
    Что-то я не понял вашего изумления...
    круче было бы, если бы результат был бы НЕ 4?????

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 00:59 03-11-2012
    Varenik



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    salexn1
    Цитата:
    Что-то я не понял вашего изумления...  
    А почитать выше - слабо?
    Цитата:
    strlen('mama') возвращает 5
    All  
    И вообще, по-моему здесь тема по Delphi а не CBuilder…

    ----------
    Если нравится, считайте, что получилось…

    Всего записей: 1766 | Зарегистр. 21-07-2001 | Отправлено: 16:50 03-11-2012 | Исправлено: Varenik, 16:56 03-11-2012
    alex1334

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
     Не все строки в дельфи содержат конечный ноль. Есть тип данных shortstring в дельфи он интерпритируется как массив [1..255] элемент с индексом 0 содержит длинну массива. Когда вы указываете тип string то в зависимости от опции компилятора он может восприниматься и как shortstring. Однако есть и строки с нуль символом в конце. Строки типа PChar точно имеют завершающий нуль. A вот как хранятся данные в строках longstring и wideString я не знаю. Не удивлюсь если они тоже не имеют завершающего нуля.
      Класс Tstring имеет свойство capacity определяющее сколько строк мах может содержать объект. Сами строки хранятся в формате string а это значит что очень даже может строка НЕ содержать завершающего нуля

    Всего записей: 148 | Зарегистр. 10-10-2010 | Отправлено: 21:55 04-11-2012 | Исправлено: alex1334, 22:38 04-11-2012
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    alex1334
    я просто сталкивался с заполнением массива строк, и получал неожиданные значения размера массива, когда нужно было включать chr(0) в составе некоторых строк. поэтому и увидел проблему именно в этом. Утверждать не буду, просто проблема товарища Ichigo2, перекликается с моей тогдашней засадой.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 11:22 05-11-2012 | Исправлено: Gnom3, 11:23 05-11-2012
    gosnami

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Господа, есть форма... на ней много Edit'ов... хочу в зависимости от значения менять цвет... причем для всех едитов одинаково - если 0 - то серый, если >0 - красный...
    Как лучше организовать?.. приложение мультипользовательское....
    по таймеру вызывать функцию, обновляющую значения для всех полей?
    И как правильнее написать функцию? Можно ли написать 1 функцию...которая будет подходить для всех полей... и вызывать функцию, передавая в качестве аргумента эти самые эдиты... или это нереально?

    Всего записей: 101 | Зарегистр. 02-11-2012 | Отправлено: 18:11 05-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gosnami
    Думаю, в данном случае удобнее всего вызывать по таймеру - в случае, если значение может быть изменено извне другим пользователем.
    В функции перебирать все контролы на форме. Если Components[i] is TEdit и условие выполнилось,  то перекрашивать в нужный цвет

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 18:26 05-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gosnami
    Правильно ли я понимаю:
    есть 2 пользователя, они видят одни и те же данные.  
    Пользователь 1 меняет значение одного edit и тут же у другого изменяется цвет?
     
    как и где хранятся данные?

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 19:16 05-11-2012 | Исправлено: salexn1, 19:19 05-11-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru