Re[2]: [oodisc] три вопроса по ОО rc4

Vladimir vbux на artmed.ru
Ср Окт 1 11:11:08 MSD 2003


Добрый день.

AK> Что ж, это замечательно. Тогда у меня два пожелания:

AK> -- почему бы всё-таки не заменить RecodeCyrDoc и RecodeCyrSheet
AK> моей версией? Она ведь явно лучше. Сейчас в RecodeCyrSheet
AK> используется крайне кривой алгоритм перебора листов в книге:
AK> организуется бесконечный цикл с выходом по факту возникновения
AK> ошибки;

Я согласен, что неплохо разместить переработанную версию.
Мне кажется, что более удачно было бы оформить макросы в таком виде.
Это более красиво выглядит с точки зрения выделения процедур, кроме
того более функционально за счет:
1) блокировки вывода на экран, что существенно ускоряет перекодировку;
2) возможнсти применение процедуры не только к текущему документу, а к
любому или конкретному листу таблицы (RecodeAll перекодирует текущий
документ как и прежде).
Для меня это имеет большое значение, поскольку я это активно
использую, например, при обработке чужих прайс листов.
Библиотека в целом станет более универсальна и, как следствие, функциональна.

Option Explicit
Dim sCP1252 (127) As String
Dim sCP1251 (127) As String
Private oDocument As Object

Sub Init()
        sCP1252() = Array("┬","┌","?","└","┘","├","┤","?","┴","S","▀","?","Z", _
                                                 ......
                                        "u","u","u","y","?","y")
 
        sCP1251() = Array("─","┌","┐","└","┘","├","┤","┬","┴","┼","▀","▄","▌", _
                                                 ......
                                        "ъ","ы","ь","э","ю","я")
End Sub

Sub RecodeAll()
        RecodeDoc(ThisComponent)
End Sub

Sub RecodeSheet(oDoc As Object, Num As Integer)
        Init()  
        If oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then
                oDoc.lockControllers()
                RecodePart(oDoc.Sheets(Num))
                oDoc.unlockControllers()
        End If
End Sub

Sub RecodeDoc(oDoc As Object)
        Dim i As Integer
        Init()  
        oDoc.lockControllers()
        If oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then
                For i = 0 To oDoc.Sheets.getCount() - 1
                        RecodePart(oDoc.Sheets(i))
                Next i
        ElseIf oDoc.SupportsService("com.sun.star.text.TextDocument") Then
                RecodePart(oDoc)
        Else
                MsgBox ("Please, run this macro either on a text document or on a spreadsheet!", _
                        64, "Recode Cyrillic Document")
        End If
        oDoc.unlockControllers()
End Sub

Sub RecodePart(oReplaceObject As Object)
        Dim oReplace As Object
        Dim i As Integer
        oReplace = oReplaceObject.createReplaceDescriptor
        For i = lbound(sCP1252()) To ubound(sCP1252())
                oReplace.SearchString = sCP1252(i)
                oReplace.ReplaceString = sCP1251(i)
                oReplace.SearchCaseSensitive = True
                oReplaceObject.replaceAll(oReplace)
        Next i
End Sub

Готов к дискуссии по этому вопросу.

С уважением,
 Владимир <vbux на artmed.ru>
----------- следущая часть -----------
EГ(uЮ╡╞8╘j e┴ф╜┼┴Ъг8╘r┴╘╜К,yщyГу+≈Зb╔ЙФj)╒┤b╠к╛ЁЖ╜╣╖!≥ИМЁЩ╢с}tс_ЗuМ7ГWЪEГ(uЮ╡╜╦╖


Подробная информация о списке рассылки Oo-discuss