Подскажите функцию, пожалуйста!

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 22.05.2008 17:23:08

Точно помню, что видел, но никак не могу вспомнить или найти:

функция, которая "сжимает" строку до заданной длины, заменяя убранную середину многоточием

В принципе, я ее сам уже написал, но коль есть встроенные, то почему бы не пользоваться ими?

(почему-то вспомнилось, как в 1991 писал на асме для БК0011 "диспетчер ЕМТ", который перехватывал некоторые системные прерывания - в 0011 был изменен формат передачи параметров некоторым ЕМТ-вызовам - перетасовывал параметры из старого формата в новый и отдавал в таком виде родному обработчику ЕМТ в биосе. Как я был огорчен, когда потом, поковырявшись в биосе, понял, что родной обработчик повторяет часть моей процедуры 1:1, и даже использует те же самые регистры точно так же, как я. В итоге стал для частичного разбора вызывать этот кусок биоса и возвращать ему управление на несколько команд дальше, чем здорово поднял быстродействие программ, работавших через этот диспетчер - из-за смены формата программы, написанные для 0010, работали с ошибкой, особенно вывод строк и графики.)
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение dymken » 22.05.2008 20:33:36

ммм... для вывода строки на канву вроде есть такая функция (т.е. для заданного шрифта и его параметров)...
а чтобы просто так сжать, не зная шрифт - хз... самому интересно стало...
dymken
новенький
 
Сообщения: 11
Зарегистрирован: 10.01.2008 11:50:14

Re: Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 23.05.2008 07:06:35

dymken писал(а):для вывода строки на канву вроде есть

"Имя, сестра, имя!" (q)
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение m_guest » 23.05.2008 09:12:56

Помнится, был такой модуль ClipperStr с аналогами строковых Clipper-функций...
Вроде там было что-то подобное.
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Re: Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 23.05.2008 09:42:05

Люди, я написал эту функцию сам, но я видел ее описание где-то в документации, то есть, использовался не сторонний модуль, а из штатной поставки то ли лазаря то ли фпц, а сейчас просто не могу вспомнить даже ключевые слова, по которым ее снова можно найти :(
Вот что получилось у меня, может кто по аналогии вспомнит?
Код: Выделить всё
//Приводим длинную строку к виду "начало...конец", чтобы уложиться в заданную
//длину
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
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение Attid » 23.05.2008 11:29:05

if Length(s)<=L then begin Result:=s;exit;end;

ужос =) коментирован хорошо, но вот форматирование как-то далеко от стандартов =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 23.05.2008 12:05:29

Attid писал(а):форматирование как-то далеко от стандартов

:) никогда не любил без нужды размазывать begin..end на несколько строк. В данном случае нужды нет, а вот неудобство листания есть, ибо это не единственная процедура в модуле.

И всё-таки, как же называется эта чертова функция? Неужели никто не использует?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение *vmr » 23.05.2008 14:10:15

<OFFTOP>
Troublemaker писал(а)::) никогда не любил без нужды размазывать begin..end на несколько строк. В данном случае нужды нет, а вот неудобство листания есть, ибо это не единственная процедура в модуле.

Купите себе большой Wide-монитор: я тоже раньше писал таким стилем, и был уверен что так удобнее в навигаци.
Потом когда через несколько лет посмотрел на свои старые исходники(на новом монике) - ужаснулся :)
</OFFTOP>
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: Подскажите функцию, пожалуйста!

Сообщение Attid » 23.05.2008 14:53:28

Troublemaker писал(а):И всё-таки, как же называется эта чертова функция? Неужели никто не использует?


я такую не видел, видел только что пути приводит к c:/progra~/mysuper~/prog.exe
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 23.05.2008 15:14:31

*vmr писал(а):Купите себе большой Wide-монитор
(ничуть не возражаю против общения на "ты")

Спасибо, шутку оценил. Трех рублей не хватает.

Что до стиля, то делать 4 строки для размещения двух коротких операторов - это перебор. Ну и кроме того, как говорится, каждый др..чит как хочет - стандарта на отступы-таки нет. Мы ж не на питоне (в нем, вроде, отступы критичны?) пишем.
Attid писал(а):c:/progra~/mysuper~/prog.exe

Нет, это немного не то. Я помню, что в описании мелькало что-то насчет desired length или что-то в этом роде и как результат работы приводилось именно "голова...хвост"
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение Sergei I. Gorelkin » 23.05.2008 16:51:32

Сколько программировал - не помню такого. В составе fpc строковые ф-ции, кроме rtl, находятся в модуле strutils. Может в составе какого-то из пакетов такое есть.
В документации по словам "desired length" находится только strutils.PadCenter, но она делает противоположное - дополняет с обоих концов пробелы до заданной длины.
Вообще, это довольно-таки бессмысленная задача. Везде, где довелось видеть, строки сокращаются путем обрезания конца. Так все же максимально сохраняется смысл начала (а если вырезать середину, получаем по сути несвязанные, и, возможно, из-за слишком малой длины незначимые половинки).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Подскажите функцию, пожалуйста!

Сообщение Troublemaker » 23.05.2008 17:32:13

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-письменностью.
С отрезанием головы я еще могу условно согласиться, хотя есть смысл знать не только имя файла, но и корень, в одном из потомков которого этот файл расположен.
Или в моей логике где-то ошибка?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Подскажите функцию, пожалуйста!

Сообщение SAK » 23.05.2008 21:00:38

Код: Выделить всё
// ((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 раз.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Подскажите функцию, пожалуйста!

Сообщение Attid » 23.05.2008 21:19:13

Troublemaker писал(а):Хм... что смотрится лучше в поле длиной 40 знаков?

вариант с тильдой =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Подскажите функцию, пожалуйста!

Сообщение Сергей Смирнов » 23.05.2008 21:52:41

А мне вариант с выгрызанием середины тоже нравится. Более того, я даже в каких-то программах видел именно такой подход.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru