Форум » Clipper » резка строк » Ответить

резка строк

СевДон: надо порезать для печати длиную строку (наименование контрагента) на 3 части с выравниванием по ПРАВОМУ краю и НЕ РЕЗАТЬ слова в этой строке Пример Есть в базе: 'ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' Надо при печати поместить в рамку из 3х строк, каждая длиной 60 символов, типа так: '..........ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ' '..........................."Донбастрансгаз" Новопсковське ЛВУ МГ' '....................................................................................... ' (здесь точки -- пробелы, сайт частично "кушает" пустые строки) мож кто-нить уже боролся с такой бякой?

Ответов - 9

Dima: На скорую руку. Сам допилишь в обчем ;) [pre2] Local a:='ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' local i,ms ms:=Perenos(a,60) for i=1 to len(ms) ? padl(alltrim(ms[ i ]),60) next Func Perenos(strk,dlina) local ms:={},i for i=1 to mlcount(strk,dlina) aadd(ms,memoline(strk,dlina,i)) next return ms [/pre2]

AlexMyr: Мой вариант [pre2]func main() Local a:='äè "ô¬αΓαáß¡ßúáº" ìÇè "ìáΣΓ«úẠô¬αá⌡¡¿" Σi½i∩ ôîâ "ä«¡íáßΓαá¡ßúáº" ì«ó«»ß¬«óß∞¬Ñ ïéô îâ' local len_str:=60 local res_str:={}, ibeg := 1, ik:=0 REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT( "UA1251" ) while ik<len(a) aadd(res_str,substr(a,ibeg,len_str)) if len(res_str[len(res_str)])>=len_str if substr(a,ik+len_str+1,1)!=" " x1:=hb_rat(" ",res_str[len(res_str)]) res_str[len(res_str)]:=substr(a,ibeg,x1-1) endif ibeg := x1+1 ik+=ibeg else exit endif enddo aadd(res_str,space(60)) aeval(res_str,{|x|qout(padl(x,len_str)," ")}) return nil[/pre2]

santy: Приблизительный вариант : [pre2] REQUEST HB_LANG_UAKOI8 REQUEST HB_CODEPAGE_UAKOI8 Function Main() Local sdata:='ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' local _len:=60,i,cTokTemp:='',aRes:={},nTokens nTokens:= NumToken( sdata, " " ) FOR i:=1 TO nTokens If LEN(cTokTemp)+LEN(Token( sdata, " ", i )) < _len cTokTemp+=" "+Token( sdata, " ", i ) Else aadd(aRes,cTokTemp);cTokTemp:=Token( sdata, " ", i ) EndIf IF i==nTokens aadd(aRes,cTokTemp) ENDIF Next aadd(aRes,SPACE(_len)) FOR I:=1 TO LEN(aRes) ? HB_AnsiToOem(padl(aRes,_len)," ") NEXT Return Nil [/pre2]


AlexMyr: Немного переработал, теперь с проверкой количества необходимых строк: [pre2]FUNC main() LOCAL a := 'ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' local mas REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT( "UA1251" ) mas:=res_s(a,60,3) ?len(mas) aeval(mas,{|x|qout(padl(x,60," "))}) RETURN nil FUNC res_s( a, nlen, kEl ) LOCAL a_str := {}, x1 WHILE !Empty( a ).or.len(a_str)!=kEl AAdd( a_str, SubStr( a,1,nlen ) ) x1 := 0 IF len(a)>nLen .and. SubStr( a, 1, nlen + 1 ) != " " x1 := hb_rat( " ", a_str[len(a_str)] ) a_str[len(a_str)] := SubStr( a, 1, x1 - 1 ) ENDIF a := iif(x1==0,substr(a,nLen+2),substr(a,x1+1)) if empty(a).and.len(a_str)<kEl aadd(a_str,"") endif ENDDO RETURN a_str[/pre2]

Сыроежка: santy AlexMyr Хотел спросить, а чем вас функция MEMOLINE не устраивает?

AlexMyr: Сыроежка пишет: Хотел спросить, а чем вас функция MEMOLINE не устраивает? СевДон пишет: на 3 части с выравниванием по ПРАВОМУ краю и НЕ РЕЗАТЬ слова в этой строке Не ищем мы легких путей

AlexMyr: Посмотрел, устраивает: [pre2]func main() LOCAL a := 'ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' LOCAL nLineLength := 60, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT( "UA1251" ) nLines := MLCOUNT(a, nLineLength,nTabSize, lWrap) FOR nCurrentLine := 1 TO 3 ? padl(alltrim(MEMOLINE(a, nLineLength, nCurrentLine,nTabSize, lWrap)),60," ") NEXT return nil[/pre2]

santy: [pre2] func main() LOCAL a := 'ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' LOCAL nLineLength := 60, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine REQUEST HB_CODEPAGE_UA1251 HB_CDPSELECT( "UA1251" ) FOR nCurrentLine := 1 TO MLCOUNT(a, nLineLength,nTabSize, lWrap) ? HB_AnsiToOem(padl(alltrim(MEMOLINE(a, nLineLength, nCurrentLine,nTabSize, lWrap)),60," ")) NEXT return nil [/pre2]

СевДон: спасибо за советы, много думал MLCOUNT и MEMOLINE помогли (давно их юзал и забыл) добавить только проверку на превышение кол-ва "дробленых" строк сверх требуемого значения. ведь в названии может быть много длинных слов есчо раз всем спасибо



полная версия страницы