Книга знаний |
|
1С:Предприятие |
Прокрутка сообщений!
Начало.Итак, начнем с начало и продолжим до самого конца ;)). Кидаем на форму «текст» и лезем в его свойства. Там в строке идентификатор» обзываем его lbMonitor. btAction Действия SetEnableAction()Баловство.Начнем как обычно с попы. Если быть точнее, то с функции SetEnableAction()btAction//******************************************* function SetEnableAction() if strlen(Form.lbMonitor.Caption()) = 0 then Form.btAction.Enable(0); else Form.btAction.Enable(1); endif; endfunction Смотрим, что у нас в мониторе есть. Если не фиха, то доступ к кнопке отключаем. Вкурили? Тогда курим дальше. Курить дальше будем за кнопку. Если быть точнее научим ее реагировать на тупые поползновения зверей. То есть, разрешим ему кое-что делать с информацией в мониторе. А разрешим им многое. Целых три действия. Каких. Говорилось выше. Итак, мостырим нашу процедурку: //******************************************* procedure btAction() vlAction = createobject("valuelist"); vlAction.AddValue("clear", "К ядреной матери"); vlAction.AddValue("show", "Заказать историю..."); vlAction.AddValue("save", "Записать историю..."); strCommand = ""; if vlAction.ChooseValue(strCommand, , , , 1) > 0 then if strCommand = "clear" then elsif strCommand = "show" then elsif strCommand = "save" then endif; endif; endprocedure Что тут и за чем, объяснять думаю не надо. Надо? Ну, грубо создаем список значений, в который заталкиваем набор необходимых нам действий. И даем выбрать пользователю, нужное действие, когда он кликнет по кнопочке. Программировать сами действия будем несколько позже. Когда закодим монитор. Монитор.Хм, так сказать начинаем делать основную вещь. Выводить на форму текст. Ясно, что текст надо будет выводить в несколько строк. Глупо же крутить монитор в одну строку. Для того, что бы знать, сколько строк нам отображать заведем переменную, в которой будем хранить максимальное количество строк. Еще нам потребуется ограничитель по скорости, тьфу, количеству символов в строке. Для хранения истории сообщений заведем переменную типа Текст. Все три переменных должны быть доступны любой процедуре и функции в модуле. То есть, делаем их глобальными, в нашем модуле. Объявляем:
//*******************************************
var intCountStrMonitor, intCountChar;
var txtHistory;
Инициализируем: //******************************************* procedure OnOpen() intCountStrMonitor = 16; intCountChar = 60; txtHistory = createobject("Text"); endprocedure Все ограничители подбираются опытным путем. Для вывода сообщения в монитор заводим процедуру, которая по дефолту будет мессачить пустую строку.
//*******************************************
procedure InputMonitor(strMessage = "")
endprocedure
Для начала получим то, что уже вывели на «экранчик»: strMonitor = Form.lbMonitor.Caption(); Далее начнем разбираться с переданной строкой. И первое на что обратим внимание, будет linebreaklinebreakchr(10)chr(13)chr(10)chr(13)chr(13)
strMessage = strreplace(strMessage, chr(13), "");
Далее проверим по количеству символов в строке. На предмет выхода их за наше ограничение. Проверять будем функцией, которую рассмотри не много позже. Сейчас главное, что она есть, она просто не может не есть. Ну и после всех проверок добавим строку к уже выведенной на экран информации. strMessage = strCutLength(strMessage, intCountChar); strMonitor = ?(strlen(strMonitor) = 0, "", strMonitor + chr(10)) + strMessage; Теперь посмотрим, сколько у нас строк в strMonitorwhile strcountoccur(strMonitor, chr(10)) > intCountStrMonitor do strMonitor = right(strMonitor, strlen(strMonitor) - find(strMonitor, chr(10))); enddo; Ну и все. Осталось отобразить на «экране монитора» полученный результат. Form.lbMonitor.Caption(strMonitor); История.Теперь займемся историей. Только не той что в учебниках, да на всяких форумах. А историй того, что мы выводили в монитор. Что бы оное можно было смотреть, удалять и куда-нибудь сохранять. Как уже говорилось выше она, история, будет храниться в переменой txtHistoryAddLinechr(10)intPos = find(strMessage, chr(10)); while intPos > 0 do txtHistory.AddLine(left(strMessage, intPos - 1)); strMessage = right(strMessage, strlen(strMessage) - intPos); intPos = find(strMessage, chr(10)); enddo; strCutLength()Функция это будет рекруссивна. Для чего. Как сами думаете? Правильно. Допустим нам передали строку длиной в 180 символов а наш ограничитель всего на 60. Да и есть еще один бэнч. В строке уже может присутствовать символ конца строки. Короче описывать все лень. Кому надо тот поймет. Кому не надо, то не надо. Вот вся функция целиком: //******************************************* function strCutLength(strTemp = "", intLength = 255) Answer = strTemp; if strlen(Answer) > intLength then intLineBreak = find(Answer, chr(10)); if intLineBreak = 0 then if strlen(Answer) > intLength then Make = "yes"; intPos = intLength; while Make = "yes" do chrSimb = mid(Answer, intPos, 1); if find("""'()\*/-+=_&,.?!^ ", chrSimb) > 0 then Make = "no"; else intPos = intPos - 1; if intPos = 0 then intPos = intLength; Make = "no"; endif; endif; enddo; Answer = left(Answer, intPos) + chr(10) + strCutLength(right(Answer, strlen(Answer) - intPos), intLength); endif; elsif intLineBreak > intLength then Answer = strCutLength(left(Answer, intLineBreak - 1), intLength) + chr(10) + strCutLength(right(Answer, strlen(Answer) - intLineBreak), intLength); else Answer = left(Answer, intLineBreak) + strCutLength(right(Answer, strlen(Answer) - intLineBreak), intLength); endif; endif; return Answer; endfunction Опять к «Действиям» Возвращаемся к нашей процедуре, которая обрабатывает клик по кнопке btActionif doquerybox("Вы действительно катите очиcтить хистори?", 4) = 6 then txtHistory.Clear(); Form.lbMonitor.Caption(strMonitor); domessagebox("Истории - писец!!!"); endif; Следующим пунктом у нас идет шоу. Показывать тоже просто. Вот только одна байда, showtextstrNameFile = userdir() + "$$$.tmp"; txtHistory.Write(strNameFile); txtFile = createobject("Text"); txtFile.Open(strNameFile); txtFile.Show("Ну, типа и вся история"); fs.DeleteFile(strNameFile); Ну и последнее это научимся хранить историю. Так для балды, или порядку. Не знаю думать вам. strPath = fs.GetCurrentDirectory(); strFile = ""; if fs.SelectFile(1, strFile, strPath, "савим хистории", "Файло для хистории (*.hst)|*.hst", "*.hst") > 0 then txtHistory.Write(strPath + strFile); endif; Ну, вроде все. Удачи, вам в делах наших тяжких ;)) Санкт-Петербург, Декабрь 2005 года. |
Описание
| Рубрикатор
| Поиск
| ТелепатБот
| Захваченные статьи
| Установки
| Форум
|