Да, стоял английский язык для программ, изменил на иврит, теперь все хорошо. Спасибо.
Этот топик читают: Гость
Ответов: 537
Рейтинг: 14
|
|||
карма: 4 |
|
Ответов: 17
Рейтинг: 0
|
|||
С наступающим годом!
При использовании компонента Mask, во всех новый компиляторах "Delphi, FPC-xx" не производится сравнение части строки и последующей (*) звёздочки. см. пример. Проверил на стандартных компиляторах всё работает.
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Да, есть такое.
Для исправления строка 33 файла hiStrMask.pas должна выглядеть так: if (PChar(Msk + 1)^ = #0) or _StrCmp(Str, Msk + 1) then Сообщите, если будут другие ошибки. Редактировалось 1 раз(а), последний 2019-12-31 20:36:53 |
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit писал(а): if (PChar(Msk + 1)^ = #0) or _StrCmp(Str, Msk + 1) thenХм........ Многое я забыл, конечно же. Однако, nesco, я тебе один умный вещь скажу: возможно, что Netspirit -- таки прав. Его код (в FPC2) отличается от нашего (пакет Delphi) прежде всего тем, что он не захотел ставить в хвост Строке и Маске по дополнительному символу (у нас это #1). За что и выхватил, конечно же. НО: вроде бы и исправил. Отсюда предложение: давай и мы сделаем аналогично. Все таки, добавлять в хвосты какой-то непонятный #1 - не самое красивое решение. Да и тестеров у нас побольше (а то он еще два года тестировать будет).... --- Добавлено в 2020-01-01 18:52:56 Хотя фигушки Netspirit не поймал еще один глюк: при маске типа Ed??** в вышеприведенной схеме Netspirit, попробуй как у меня Может тоже что найдешь.... Говорю же - давно все это было, и позабылось кое чего. Редактировалось 9 раз(а), последний 2020-01-03 22:39:03 |
|||
карма: 9 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ах, да
С НОВЫМ ГОДОМ ВСЕХ Редактировалось 1 раз(а), последний 2020-01-01 19:39:58 |
|||
карма: 9 |
| ||
Голосовали: | UtoECat |
Разработчик
Ответов: 26113
Рейтинг: 2126
|
|||
Galkov писал(а): Отсюда предложение: давай и мы сделаем аналогичноТолько после праздников смогу добавить. |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Дык спешить то и не надо....
Сперва послушаем начальника транспортного цеха - он же о чем-то думал, когда шел наперекор "тестированному" Netspirit тоже, вроде бы только "по будням" активизируется (типа - с работы). А деваться-то ему и некуда, ибо его фикс не работает. Да, я еще одну фишку вспомнил - добавление символа "в хвосты" автоматически снимало вопросы уникальности строки. У меня уже есть как бы фиксинг и к этому делу... НО -- не будем торопиться. Редактировалось 1 раз(а), последний 2020-01-01 22:40:23 |
|||
карма: 9 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Galkov писал(а): что он не захотел ставить в хвост Строке и Маске по дополнительному символуGalkov писал(а): Netspirit тоже, вроде бы только "по будням" активизируется (типа - с работы).Galkov писал(а): А деваться-то ему и некуда, ибо его фикс не работает.Буду думать. --- Добавлено в 2020-01-02 12:49:31 Вариант от Galkov работает. Думаю, можно использовать, пока кто-то не предложит неработающую маску. Galkov писал(а): добавление символа "в хвосты" автоматически снимало вопросы уникальности строки. У меня уже есть как бы фиксинг и к этому делу...
Редактировалось 13 раз(а), последний 2020-01-02 13:20:56 |
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit писал(а): Но не добавлением символов, естественноДля кого естественно, а для кого и не очень. Когда-то было Коллега, побольше слов, пожалуйста. Хотелось бы убийственного аргумента в этом направлении. Чтобы душа развернулась, а потом обратно свернулась Как все это было, когда-то давно... Понимал я уже, конечно же - и про "уникализацию", и про "звездатые заморочки". А тут на тебе - вариант, решающий и то, и другое. Надежный, как автомат Калашникова - хоть ногами его пинай. Ну и не стал отлаживать альтернативу, которой мы сейчас занимаемся. Т.е., корректного сравнения в кодах обоих вариантов стратегии - не было. Сейчас будет, однако. Netspirit писал(а): (StrCase в этом плане жжот )Это CharLower жжот. Вот такое есть winapi... Наступал я уже на эти грабли где-то, но позабыл. Пришлось вспомнить: нормально работает CharLower(pointer(String)), а не PChar. Netspirit писал(а): В предложенном коде? Не увиделНе, не в ранее предложенном.... До меня ведь тоже не все сразу после праздника доходит. Выкладываю пофиксенную версию (в INI изменен порядок свойств, чтобы при инициализации Mask было известно: он CaseSesinive, или нет). Типа, теперь можно сравнивать, чего стоит отказ от добавления символа "по хвостам", и компенсируется ли это некими благоприобретениями. Смотрим, обсуждаем Редактировалось 5 раз(а), последний 2020-01-02 15:54:49 |
|||
карма: 9 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Не, ну к CharLower() никаких претензий нет: она то работает так как написано в документации.
Galkov писал(а): нормально работает CharLower(pointer(String)), а не PChar(Galkov имел в виду пустую строку и CharLower(), а не её уникальность) К последнему выложенному варианту не имею вопросов (кроме как к форматированию кода, ну, и названия функций, обычно, должны отражать действие, то-есть, SetMask(), а не просто Mask()). Редактировалось 7 раз(а), последний 2020-01-02 16:29:42 |
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit писал(а): Не, ну к CharLower() никаких претензий нет:Как бы это помягче сказать... Скажем так: Если бы она не падала, при попытке модифицировать пустую строку (т.е., когда не надо делать ничего), то я бы сказал, что она работает так как написано в документации. Netspirit писал(а): Упадёт, например, на константе, как и PChar()Не совсем понял: ты имеешь в виду исключения при попытке модификации в кодовом сегменте, защищенном от записи ??? Так не помню я у нас таких строк... А падала она на пустой строке (повторюсь: когда не надо делать ничего). И что точно можно сказать, что даже константная строка (у которой RefCnt=-1) после UniqueString попадает в хип, т.е. в сегмент памяти разрешенный на запись. Netspirit писал(а): А вот CharLower(@S[1]) может и проканаетВспомнил, было такое:
Самолично проверял дизасмом: чего это за фигня, думаю себе - два раза подряд вызывается UniqueString, я же один раз писал. Хотя уникализация уже уникальной строки не делает ничего (в смысле - не заморачивается с хипом). В отличие, между прочим, от AnsiLowerCase. И в котором, не к ночи будет сказано, вызов winapi таки защищается от пустой строки. Причем, что занимательно: использование @fn[1] воспринимается как вмешательство в строку, а использование pointer(fn) - не воспринимается. Велик и могуч буржуинский интеллект, однако Netspirit писал(а): кроме как к форматированию кода, ну, и названия функций, обычно, должны отражать действие, то-есть, SetMask(), а не просто Mask()Про SetMask согласен сразу, это была просто неистребимая природная лень в написании тех буковок. А про форматирование - не соглашусь. Вопрос не принципиальный, и агитировать никого не буду, но мне ближе Обероновский стиль. На котором это выглядело бы примерно так (на вскидку, в спецификации давно не лазил):
А отсутствие в языке elseif-а не вынуждает меня строить лесенки... Нет, ну конечно, совсем канонически было БЫ после служебных слов THEN ELSE DO - начинать новый statement с новой строки с отступом. Но, отнесем это к совсем уж мелкой вредности... Типа, если statement всего один, то можно и нахулиганить. Самую малость. Вообще-то, я комбинацию end else if воспринимаю (но никому не навязываюсь) как единый и целый elseif. А лесенки при форматировании - только запутывают. Обероновцы, они вообще на цикл Дейкстры молятся. Который позволяет много-вложенный цикл писать не лесенкой, а на одном отступе. Но, повторюсь: никому не навязываюсь. Просто немного не соглашусь Редактировалось 8 раз(а), последний 2020-01-02 23:24:28 |
|||
карма: 9 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Вообще-то, стиль выравнивания вещь сугубо индивидуальная. Лишь бы система была законченная и непротиворечивая.
Чего здесь главное, спрашивается... А вот глядишь ты на этот код, и как-то это отражается на твоей мозговой деятельности. По разному написано, по разному и отражается. Вот посмотрел я на обероновский код выше, посмотрел, посмотрел -- и подумал себе: а может вот эдак красивше будет ???
Редактировалось 10 раз(а), последний 2020-01-03 02:12:04 |
|||
карма: 9 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Galkov писал(а): ты имеешь в виду исключения при попытке модификации в кодовом сегменте, защищенном от записи ???Так не помню я у нас таких строк..."Кодовый сегмент" - это, насколько я понимаю у нас получается разве что в CharLower(PChar(S)), когда при пустой S Delphi приведением к PChar() подставляет ссылку на байт $00, лежащий где-то там же в коде функции рядом с проверкой строки на пустоту. А CharLower() с какого-то чуда, видимо, пытается этот 0 "ловернуть", хотя по достижении 0 должен был выйти из цикла перебора символов. Но есть ещё секция констант "только для чтения" в исполняемом файле, где лежат строковые константы. Причём они остаются лежать там даже после множества присвоений переменным и передачи как аргументов функций. До применения UniqueString() или других методов копирования.
_prop_Name := PChar('XXX'#0); Это делает строки в свойствах компонентов модифицируемыми. Но не защищает от возможности получить константу из какого-то другого места. Мне не понравилось, поэтому в данной редакции пакета я это убрал. Кроме того, это не позволяет использовать символ с кодом #0 в строковых свойствах.Galkov писал(а): а использование pointer(fn) - не воспринимается.По форматированию - кроме отступов нужно учитывать ещё регистр идентификаторов, и некоторые правила вроде префиксов "T" для типов, "P" для ссылочных типов, "F" для приватных полей класса. Скажем, я бы предпочел
Редактировалось 7 раз(а), последний 2020-05-26 16:50:33 |
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit писал(а): Но есть ещё секция констант "только для чтения" в исполняемом файлеДа понятно все. Твой пример убедителен, хотя и не удивил аж нисколько. Netspirit писал(а): Но в кодогенераторе стоит костыльЕго не так просто убрать... Мне это тоже не нравилось, но в то время я не решался так глубоко лезть в наши системные файлы. Да и не все я решал. Во-первых, принудительное добавление нулика в хвост - это один из способов уговорить Delphi что это таки строка а не символ, для односимвольной строки. Во-вторых, если текст длиннее 255 символов, то Delphi огорчается, и не хочет компилировать. В этом случае таковая строка помещается в соответствующую секцию ресурса, откуда возвращается только как PChar. Т.е, опять облом с нулевым символом. Надо, видимо, помещать в ресурс также, как и Stream, с соответствующим извлечением (а это функции из share). И найти таки вариант записи для односимвольной строки. Ну не смогла я В то время... В общем, не все так просто. Netspirit писал(а): "F" для приватных полей классаДа запросто Замена Mask на SetMask добавила 12 символов код. Замена intMask на FMask - вернет обратно 10 Netspirit писал(а): Скажем, я бы предпочелА вот смотри сюда:
И у меня все Statement-ы имеют одинаковый отступ. А у тебя каждый последующий все глубже и глубже. Ну хорошо, что их всего 4... А если бы 20 ??? Вот это я и называю "лесенкой", особого семантического смысла не имеющего. Такая комбинация ELSEIF-ов (если их записать раздельно, как else if - смысл-то от этого не меняется) - это же просто как супер-навороченный CASE. Нас же не оскорбляет, что все его ветки на одном уровне отступа. Почему же здесь мы должны обижаться... Netspirit, я не спорю, у тебя все канонически правильно. Просто пойми, что в мой подход тоже системен и логичен. Вот и все. Хм... А есть еще особо тонкие ценители отступов. Так они еще на один отступ смещают BEGIN-END, а то, что внутри - тоже на один (как у тебя). Не, ну действительно, почему это последний BREAK с отступом, а первый BEGIN - нет... Чем это он хуже BREAK-а Вот я не хочу спорить с этим народом, и располагаю этот BEGIN на другой строке. Но это все так... Размышления о прекрасном. Не более того. Да, вот. Netspirit, ты ничего не сказал про мой код из предыдущего поста. Функционально эквивалентный, как мне пока кажется, тому, что мы обсуждаем. Там, между прочим, нет ELSEIF-ов Вместо одного EXIT-а и двух BREAK-ов -- два EXIT-а. Что уже легче. Да и BREAK-и были нацелены на то, что в результате некой оконечной суеты таки произойдет выход с обязательным FALSE. Теперь тот же выход, но без суеты. А то придет nesco после праздника, и строго спросит: так на чем же вы все-таки договорились ??? Я его знаю |
|||
карма: 9 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Galkov писал(а): Во-первых, принудительное добавление нулика в хвост - это один из способов уговорить Delphi что это таки строка а не символ, для односимвольной строки.Galkov писал(а): В этом случае таковая строка помещается в соответствующую секцию ресурса, откуда возвращается только как PChar.Galkov писал(а): И найти таки вариант записи для односимвольной строки.Galkov писал(а): ты ничего не сказал про мой код из предыдущего постаGalkov писал(а): Вот это я и называю "лесенкой", особого семантического смысла не имеющего.Главное чтобы было "системно", а не кто в лес, кто по дрова, чего можно насмотреться по кодам наших компонентов. Galkov писал(а): Я его знаюРедактировалось 1 раз(а), последний 2020-01-03 15:57:23 |
|||
карма: 26 |
|