Подскажите функцию, пожалуйста!
Модератор: Модераторы
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Подскажите функцию, пожалуйста!
Точно помню, что видел, но никак не могу вспомнить или найти:
функция, которая "сжимает" строку до заданной длины, заменяя убранную середину многоточием
В принципе, я ее сам уже написал, но коль есть встроенные, то почему бы не пользоваться ими?
(почему-то вспомнилось, как в 1991 писал на асме для БК0011 "диспетчер ЕМТ", который перехватывал некоторые системные прерывания - в 0011 был изменен формат передачи параметров некоторым ЕМТ-вызовам - перетасовывал параметры из старого формата в новый и отдавал в таком виде родному обработчику ЕМТ в биосе. Как я был огорчен, когда потом, поковырявшись в биосе, понял, что родной обработчик повторяет часть моей процедуры 1:1, и даже использует те же самые регистры точно так же, как я. В итоге стал для частичного разбора вызывать этот кусок биоса и возвращать ему управление на несколько команд дальше, чем здорово поднял быстродействие программ, работавших через этот диспетчер - из-за смены формата программы, написанные для 0010, работали с ошибкой, особенно вывод строк и графики.)
функция, которая "сжимает" строку до заданной длины, заменяя убранную середину многоточием
В принципе, я ее сам уже написал, но коль есть встроенные, то почему бы не пользоваться ими?
(почему-то вспомнилось, как в 1991 писал на асме для БК0011 "диспетчер ЕМТ", который перехватывал некоторые системные прерывания - в 0011 был изменен формат передачи параметров некоторым ЕМТ-вызовам - перетасовывал параметры из старого формата в новый и отдавал в таком виде родному обработчику ЕМТ в биосе. Как я был огорчен, когда потом, поковырявшись в биосе, понял, что родной обработчик повторяет часть моей процедуры 1:1, и даже использует те же самые регистры точно так же, как я. В итоге стал для частичного разбора вызывать этот кусок биоса и возвращать ему управление на несколько команд дальше, чем здорово поднял быстродействие программ, работавших через этот диспетчер - из-за смены формата программы, написанные для 0010, работали с ошибкой, особенно вывод строк и графики.)
ммм... для вывода строки на канву вроде есть такая функция (т.е. для заданного шрифта и его параметров)...
а чтобы просто так сжать, не зная шрифт - хз... самому интересно стало...
а чтобы просто так сжать, не зная шрифт - хз... самому интересно стало...
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
dymken писал(а):для вывода строки на канву вроде есть
"Имя, сестра, имя!" (q)
Помнится, был такой модуль ClipperStr с аналогами строковых Clipper-функций...
Вроде там было что-то подобное.
Вроде там было что-то подобное.
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Люди, я написал эту функцию сам, но я видел ее описание где-то в документации, то есть, использовался не сторонний модуль, а из штатной поставки то ли лазаря то ли фпц, а сейчас просто не могу вспомнить даже ключевые слова, по которым ее снова можно найти 
Вот что получилось у меня, может кто по аналогии вспомнит?
Вот что получилось у меня, может кто по аналогии вспомнит?
Код: Выделить всё
//Приводим длинную строку к виду "начало...конец", чтобы уложиться в заданную
//длину
function Condense(s:string;L:integer):string;
var MyL:Integer;
begin
//защита от дурака
if L<=0 then begin Result:='';exit;end;
//если строка короче заданной длины то ее нет смысла сжимать
if Length(s)<=L then begin Result:=s;exit;end;
//если фигня, то возвращаем просто нужное кол-во точек
if L<=3 then begin Result:=AddChar('.','',L);exit;end;
//"освобождаем место" для многоточия
MyL:=L-3;
// ((x shr 1) shl 1)=x? - проверка целого на четность без mod/div
if ((MyL shr 1) shl 1)=MyL then //с обеих сторон берем одинаковые куски
Result:=LeftStr(s,MyL shr 1)+'...'+RightStr(s,MyL shr 1)
else //слева берем на символ меньше, чем справа
Result:=LeftStr(s,MyL shr 1)+'...'+RightStr(s,(MyL shr 1)+1);
end;
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Attid писал(а):форматирование как-то далеко от стандартов
И всё-таки, как же называется эта чертова функция? Неужели никто не использует?
- *vmr
- постоялец
- Сообщения: 168
- Зарегистрирован: 08.01.2007 00:46:07
- Откуда: Киев
- Контактная информация:
<OFFTOP>
Купите себе большой Wide-монитор: я тоже раньше писал таким стилем, и был уверен что так удобнее в навигаци.
Потом когда через несколько лет посмотрел на свои старые исходники(на новом монике) - ужаснулся
</OFFTOP>
Troublemaker писал(а)::) никогда не любил без нужды размазывать begin..end на несколько строк. В данном случае нужды нет, а вот неудобство листания есть, ибо это не единственная процедура в модуле.
Купите себе большой Wide-монитор: я тоже раньше писал таким стилем, и был уверен что так удобнее в навигаци.
Потом когда через несколько лет посмотрел на свои старые исходники(на новом монике) - ужаснулся
</OFFTOP>
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Troublemaker писал(а):И всё-таки, как же называется эта чертова функция? Неужели никто не использует?
я такую не видел, видел только что пути приводит к c:/progra~/mysuper~/prog.exe
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
(ничуть не возражаю против общения на "ты")*vmr писал(а):Купите себе большой Wide-монитор
Спасибо, шутку оценил. Трех рублей не хватает.
Что до стиля, то делать 4 строки для размещения двух коротких операторов - это перебор. Ну и кроме того, как говорится, каждый др..чит как хочет - стандарта на отступы-таки нет. Мы ж не на питоне (в нем, вроде, отступы критичны?) пишем.
Attid писал(а):c:/progra~/mysuper~/prog.exe
Нет, это немного не то. Я помню, что в описании мелькало что-то насчет desired length или что-то в этом роде и как результат работы приводилось именно "голова...хвост"
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Сколько программировал - не помню такого. В составе fpc строковые ф-ции, кроме rtl, находятся в модуле strutils. Может в составе какого-то из пакетов такое есть.
В документации по словам "desired length" находится только strutils.PadCenter, но она делает противоположное - дополняет с обоих концов пробелы до заданной длины.
Вообще, это довольно-таки бессмысленная задача. Везде, где довелось видеть, строки сокращаются путем обрезания конца. Так все же максимально сохраняется смысл начала (а если вырезать середину, получаем по сути несвязанные, и, возможно, из-за слишком малой длины незначимые половинки).
В документации по словам "desired length" находится только strutils.PadCenter, но она делает противоположное - дополняет с обоих концов пробелы до заданной длины.
Вообще, это довольно-таки бессмысленная задача. Везде, где довелось видеть, строки сокращаются путем обрезания конца. Так все же максимально сохраняется смысл начала (а если вырезать середину, получаем по сути несвязанные, и, возможно, из-за слишком малой длины незначимые половинки).
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Обрати внимание на приписку: "что-то в этом роде", то есть, я помню, что это переводилось примерно как "желаемая|требуемая|необходимая длина", но по-английски слишком много синонимов и у меня не получается вспомнить, какой был использован.Sergei I. Gorelkin писал(а):В документации по словам "desired length" находится только strutils.PadCenter
Sergei I. Gorelkin писал(а):если вырезать середину, получаем ... несвязанные и ... незначимые половинки
Хм... что смотрится лучше в поле длиной 40 знаков?
Оригинал:
Код: Выделить всё
E:\Documents and Settings\Sergei\My Documents\ВУЗ\diplom\app\testmemds_p.exe
/home/sergei/Документы/diplom/app/testmemds_pСередина:
Код: Выделить всё
E:\Documents and S...app\testmemds_p.exe
/home/sergei/Докум...lom/app/testmemds_pХвост:
Код: Выделить всё
...uments\ВУЗ\diplom\app\testmemds_p.exe
...rgei/Документы/diplom/app/testmemds_pВариант с отрезанием хвоста я не рассматриваю - это не число, где старшие (слева) разряды сильнее влияют на значение чем младшие (справа) - в строках, особенно в именах файлов, хвост (младшие символы) обычно важнее головы, если речь не о стране с RTL-письменностью.
С отрезанием головы я еще могу условно согласиться, хотя есть смысл знать не только имя файла, но и корень, в одном из потомков которого этот файл расположен.
Или в моей логике где-то ошибка?
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Код: Выделить всё
// ((x shr 1) shl 1)=x? - проверка целого на четность без mod/divА не проще ли будет:
Код: Выделить всё
if x and 1 = 0 then ...Добавлено спустя 6 минут 26 секунд:
Или
Код: Выделить всё
if not odd(x) then ...
Последний раз редактировалось SAK 23.05.2008 21:31:32, всего редактировалось 1 раз.
- Сергей Смирнов
- энтузиаст
- Сообщения: 595
- Зарегистрирован: 28.04.2005 13:23:25
- Откуда: Москва
- Контактная информация:
А мне вариант с выгрызанием середины тоже нравится. Более того, я даже в каких-то программах видел именно такой подход.
