2014-03-14 2 views
1

Возможно ли создать что-то вроде немедленного окна на форме?Создать немедленный журнал стиля окна на форме

Я попытался отправить различные обновления в текстовое поле, но скорость обновления в текстовом поле кажется намного медленнее, чем то, что вы получаете с Debug.Print в ближайшее окно.

Было бы полезно сообщить пользователю, какие операции выполняются в настоящее время, пока они ждут чего-то, что нужно обработать (и не пропускать некоторые операции, потому что они обрабатываются быстрее, чем скорость обновления, по-видимому, позволяет).

+0

Не могли бы вы опубликовать код, где вы обновляете свой текстовое поле? – Zaider

ответ

1

В прошлом я пытался использовать один из нескольких строк Text Box в виде окна прокрутки состояния, но это, казалось, премного суетливым, когда дело дошло до статуса выбора текста (.SelText, .SelLength, .SelLength). В конце концов я просто пошел с пятью (5) однострочными текстовыми блоками и «прокрутил» их сам.

В следующем скриншоте элементы управления Text Box названы txtStatus4, txtStatus3 ... txtStatus0 (сверху вниз)

myForm.png

и код обновления, что «окно» статус (на самом деле управление кадра) является

Private Sub UpdateStatus(StatusText As String) 
    Dim i As Long 
    For i = 4 To 1 Step -1 
     Me.Controls("txtStatus" & i).Value = Me.Controls("txtStatus" & i - 1).Value 
    Next 
    Me.txtStatus0.Value = StatusText 
    Me.Repaint 
End Sub 
+0

Есть ли элемент управления рамкой в ​​текстовых полях? –

+0

@MattHall Нет, элемент управления Frame (иногда называемый Option Group) - это просто «глазная конфета», чтобы придать виду «окно» или «окно» вокруг отдельных элементов текстового поля. –

+0

Очень приятно. Большое спасибо. –

2

Вы можете установить текст текстового поля (или метки), а затем вызвать метод DoEvents. Этот последний вызов важен, потому что сумасшедший вы выполняете длительный процесс, и экран будет перерисовываться только на простое.

В качестве альтернативы, вы можете использовать строку состояния для уведомления прогресса:

SysCmd acSysCmdSetStatus, "Doing some long task, please wait..." 
'Do your work 
SysCmd acSysCmdSetStatus, "" 

Если вы можете измерить ваш прогресс, можно включить индикатор. То есть обработки записей:

bk = rs.Bookmark 
    rs.MoveLast 
    r = SysCmd(acSysCmdInitMeter, caption, rs.RecordCount) 
    rs.Bookmark = bk 

    Do Until rs.EOF 
    'Do something 
    i = i + 1 
    If i Mod 10 = 0 Then  'Do not update the meter for every processed record 
     SysCmd acSysCmdUpdateMeter, i 
    End If 
    rs.MoveNext 
    Next 
    SysCmd acSysCmdRemoveMeter 
+0

Спасибо, это полезно, но я собираюсь пойти с ответом Горда, поскольку он больше подходит для внешнего вида и ощущения, которые я имел в виду :) –

1

Только в случае, если кто-либо ищет этот раз, есть способ сделать то, что спросил OP, без нескольких текстовых полей.

Screenshot of solution

На вашей форме, добавить текстовое поле. Регулярное текстовое поле будет делать. Дайте ему имя, например txtLog. Размер его должен быть достаточно большим, чтобы отобразить кучу текста.

Вот суб обрабатывать обновления:

Private Sub WriteToLogText(strText As String, Optional blnClear As Boolean = False) 
    txtLog.SetFocus 
    If blnClear = True Then 
     txtLog = strText 
    Else 
     txtLog = txtLog.Text & Chr(13) & Chr(10) & strText 
    End If 
End Sub 

Затем вызовите к югу, чтобы написать свой текст:

strMsg = "Warning: Commodity '" & Trim(drs("RawCommodity")) & "' is not mapped." 
WriteToLogText strMsg 
Смежные вопросы