Логарифмический ползунок

Вдохновленный комментарием Синди Мейстер (см. Выше), я нашел следующее решение (которое включает в себя сначала создание нового объекта документа Word, затем вставку в него содержимого буфера обмена, а затем считывание номера его абзаца):

Sub InsertAndProcessMultipleParagraphs()

'Declarations    
    Dim MyData As MSForms.DataObject
    Dim intNumPara As Integer
    Dim objDoc

'Fill them objects
    Set MyData = New MSForms.DataObject
    MyData.GetFromClipboard

    Set objDoc = Application.Documents.Add
    objDoc.ActiveWindow.Visible = False

'Put clipboard contents into the new document object
    Documents(objDoc).Activate
    Selection.PasteSpecial Link:=False, DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False

'Read out paragraph number in that document    
    intNumPara = Documents(objDoc).Paragraphs.Count

'Close that document (without nasty questions)     
    Documents(objDoc).Close SaveChanges:=wdDoNotSaveChanges

'By some miracle we should now be back in Word's original target window... 
'Tests show that in practice this is the case. 

'Paste the Clipboard content into target document at current cursor position 
    Selection.PasteSpecial Link:=False, DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False

'Expand selection to cover all the paragraphs inserted    
    Selection.MoveUp Unit:=wdParagraph, Count:=intNumPara, Extend:=wdExtend

'Do somethign nice and useful with these paragraphs 
    Application.Run MacroName:="Normal.MyMacros.Do-someting-nice-and-useful"

End Sub

Однако я немного разочарован тем, что мне приходится качать такой большой и тяжелый молоток, как создание целого нового объекта документа в Word только для того, чтобы сосчитать эти абзацы. Создание документа, переключение на него, вставка чего-либо, подсчет абзацев, закрытие документа ... это много операций для очень простой вещи. Нет ли еще доступного более легкого объекта, который мог бы взять содержимое буфера обмена и чей номер абзаца я мог бы тогда прочитать?

Возможно, я попробую и другой метод: подсчитать метки абзаца (возврат каретки или около того) в строке, которую можно извлечь из объекта MyData ...

69
задан Flip 6 July 2016 в 15:44
поделиться

2 ответа

Вместо того, чтобы возиться с методами кодирования и декодирования, я считаю, что проще указать кодировку при открытии файла. Модуль io (добавлен в Python 2.6) предоставляет функцию io.open , которая имеет параметр кодирования.

Используйте метод open из io модуль.

>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")

Затем после вызова функции f read () возвращается закодированный объект Unicode.

>>>f.read()
u'Capit\xe1l\n\n'

Обратите внимание, что в Python 3 функция io.open является псевдонимом для встроенного -в открыть функцию . Встроенная функция open поддерживает аргумент кодировки только в Python 3, но не в Python 2.

Изменить: ранее в этом ответе рекомендовался модуль кодеков . Модуль кодеков может вызывать проблемы при смешивании read () и readline () , функция LogSlider (параметры) {параметры = параметры || {}; this.minpos = options.minpos || 0; this.maxpos = options.maxpos || 100; this.minlval = Math.log (options.minval || 1); this.maxlval = Math.log (options.maxval || 100000); this.scale = (this.maxlval - this.minlval) / (this.maxpos - this.minpos); } LogSlider.prototype = {// Вычислить значение из значения положения ползунка: function (position) {return Math.exp ((position - this.minpos) * this.scale + this.minlval); }, // Вычислить положение ползунка от значения position: function (value) {return this.minpos + (Math.log (value) - this.minlval) / this.scale; }}; // Использование: var logsl = new LogSlider ({maxpos: 20, minval: 100, maxval: 10000000}); $ ('# слайдер'). on ('изменение', function () {var val = logsl.value (+ $ (this) .val ()); $ ('# значение'). val (val.toFixed ( 0));}); $ ( '# Значение'). on ('keyup', function () {var pos = logsl.position (+ $ (this) .val ()); $ ('# слайдер'). val (pos);}); $ ('# значение'). val ("1000"). trigger ("keyup");

  Введите значение или используйте ползунок:   
165
ответ дан 24 November 2019 в 13:40
поделиться

To get the distribution you want, I think you can use this formula:

var value = Math.floor(-900 + 1000*Math.exp(i/10.857255959));

Here's a self-contained page that will print the values you'll get for your 0-100 slider, having passed them through that formula:

<html><body><script>
for (var i = 0; i <= 100; i++) {
    var value = Math.floor(-900 + 1000*Math.exp(i/10.857255959));
    document.write(value + "<br>");
}
</script></body></html>

The numbers go from 100 to 10,000,000 in what looks to my mathematically-rusty eye to be the distribution you want. 8-)

9
ответ дан 24 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: