Как добавить заголовки к многостолбцовому полю списка в userform Excel с помощью VBA

Похоже, это связано с тем, как MacOS переводит процессы в режим ожидания, когда экран блокируется. Это заставляет дочерний процесс osasscript никогда не завершать выполнение и блокировать цикл for.

Одна вещь, которую вы можете сделать, это запустить команду с контекстом тайм-аута. Я пытался, и это работает. Выполнение возобновится, когда экран разблокирован и истечет время ожидания.

Пример:

package main

import (
    "context"
    "fmt"
    "os/exec"
    "time"
)

func main() {
    for {
        time.Sleep(time.Second * 5)

        // run your command with a timeout
        ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
        cmd := exec.CommandContext(
            ctx,
            "/usr/bin/osascript",
            "-e",
            `display dialog "hello" with title "hello"`,
        )

        err := cmd.Run()
        if err != nil {
            fmt.Println(err)
        }
        // don't forget to cancel your context to avoid context leak
        cancel()
    }
}

В качестве альтернативы, если вы не хотите тайм-аут, вы можете проверить, заблокирован ли экран, прежде чем пытаться вызвать диалоговое окно дисплея.

package main

import (
    "context"
    "fmt"
    "os"
    "os/exec"
    "strings"
    "time"
)

func main() {
    for {
        time.Sleep(time.Second * 5)

        ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
        cmd := exec.CommandContext(
            ctx,
            "python",
            "-c",
            "import sys,Quartz; d=Quartz.CGSessionCopyCurrentDictionary(); print d",
        )

        var err error
        var b []byte
        if b, err = cmd.CombinedOutput(); err != nil {
            cancel()
            continue
        }
        cancel()

        // if screen is not locked
        if !strings.Contains(string(b), "CGSSessionScreenIsLocked = 1") {
            cmd = exec.Command(
                "/usr/bin/osascript",
                "-e",
                "display dialog \"Hello\"",
            )
            cmd.Stdout = os.Stdout
            cmd.Stderr = os.Stderr

            err = cmd.Run()
            if err != nil {
                fmt.Println("err: ", err)
            }
        }
    }
}
12
задан Excellll 18 April 2013 в 14:33
поделиться

2 ответа

Нет. Я создаю маркировки выше поля списка для служения в качестве заголовков. Вы могли бы думать, что это - королевская боль для изменения маркировок каждый раз изменения lisbox. Вы были бы правы - это - боль. Это - боль для установки в первый раз, а тем более изменения. Но я не нашел лучший путь.

17
ответ дан 2 December 2019 в 03:33
поделиться

Простой ответ: нет.

То, что я сделал в прошлом, является загрузкой, заголовки в строку 0 затем устанавливают ListIndex на 0 при отображении формы. Это затем выделяет "заголовки" синего цвета, давая появление заголовка. Кнопки действий формы проигнорированы, если ListIndex остается в нуле, таким образом, эти значения никогда не могут выбираться.

Конечно, как только другой элемент списка выбран, заголовок теряет фокус, но к этому времени их задание сделано.

Выполнение вещей, этот путь также позволяет Вам иметь заголовки, которые прокручивают горизонтально, который трудно/невозможно сделать с отдельными маркировками, которые плавают выше поля списка. Обратная сторона - то, что заголовки не остаются видимыми, если поле списка должно прокрутить вертикально.

В основном это - компромисс, который работает в ситуациях, в которых я был.

5
ответ дан 2 December 2019 в 03:33
поделиться
Другие вопросы по тегам:

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