Автор | Сообщение |
|
| |
Пост N: 62
Зарегистрирован: 25.02.10
|
|
Отправлено: 09.02.12 18:15. Заголовок: резка строк
надо порезать для печати длиную строку (наименование контрагента) на 3 части с выравниванием по ПРАВОМУ краю и НЕ РЕЗАТЬ слова в этой строке Пример Есть в базе: 'ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ "Донбастрансгаз" Новопсковське ЛВУ МГ' Надо при печати поместить в рамку из 3х строк, каждая длиной 60 символов, типа так: '..........ДК "Укртраснсгаз" НАК "Нафтогаз України" фiлiя УМГ' '..........................."Донбастрансгаз" Новопсковське ЛВУ МГ' '....................................................................................... ' (здесь точки -- пробелы, сайт частично "кушает" пустые строки) мож кто-нить уже боролся с такой бякой?
|
|
|
Ответов - 9
[только новые]
|
|
|
| |
Пост N: 2284
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.02.12 18:24. Заголовок: На скорую руку. Сам ..
На скорую руку. Сам допилишь в обчем ;) 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
|
|
|
|
| |
Пост N: 407
Зарегистрирован: 11.06.10
|
|
Отправлено: 10.02.12 00:13. Заголовок: Мой вариант func ma..
Мой вариант 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
|
|
|
|
| |
Пост N: 43
Зарегистрирован: 16.12.08
|
|
Отправлено: 10.02.12 02:21. Заголовок: Приблизительный вари..
Приблизительный вариант : 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
|
|
|
|
| |
Пост N: 408
Зарегистрирован: 11.06.10
|
|
Отправлено: 10.02.12 10:01. Заголовок: Немного переработал,..
Немного переработал, теперь с проверкой количества необходимых строк: 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
|
|
|
|
| |
Пост N: 142
Зарегистрирован: 11.10.11
|
|
Отправлено: 10.02.12 12:41. Заголовок: santy AlexMyr Хоте..
santy AlexMyr Хотел спросить, а чем вас функция MEMOLINE не устраивает?
|
|
|
|
| |
Пост N: 410
Зарегистрирован: 11.06.10
|
|
Отправлено: 10.02.12 13:14. Заголовок: Сыроежка пишет: Хот..
Сыроежка пишет: цитата: | Хотел спросить, а чем вас функция MEMOLINE не устраивает? |
| СевДон пишет: цитата: | на 3 части с выравниванием по ПРАВОМУ краю и НЕ РЕЗАТЬ слова в этой строке |
| Не ищем мы легких путей
|
|
|
|
| |
Пост N: 411
Зарегистрирован: 11.06.10
|
|
Отправлено: 10.02.12 13:28. Заголовок: Посмотрел, устраивае..
Посмотрел, устраивает: 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
|
|
|
|
| |
Пост N: 44
Зарегистрирован: 16.12.08
|
|
Отправлено: 10.02.12 14:07. Заголовок: func main() LOCAL ..
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
|
|
|
|
| |
Пост N: 63
Зарегистрирован: 25.02.10
|
|
Отправлено: 10.02.12 16:06. Заголовок: спасибо за советы, м..
спасибо за советы, много думал MLCOUNT и MEMOLINE помогли (давно их юзал и забыл) добавить только проверку на превышение кол-ва "дробленых" строк сверх требуемого значения. ведь в названии может быть много длинных слов есчо раз всем спасибо
|
|
|
|