Форум » GUI » Вывод текста в окно » Ответить

Вывод текста в окно

AM: Товарищи! Прошу ответить на два простых (для того, кто знает) вопроса. 1. Как вывести в окно просто текст (превышающий размер окна), т.е. как организовать консольное окно в числе других, чтобы можно было в него выводить текст через ?? (или как-то иначе), а потом закрыть и забыть. Наверно, это совсем просто, но я не нашёл, как. 2. То же самое (видимо, это уже не консольное окно и не ??), но чтоб была возможность прокрутки вверх-вниз, и очень бы желательно с разными шрифтами. Редактирование не нужно. Заранее благодарен.

Ответов - 3

gfilatov: AM пишет: 2. То же самое (видимо, это уже не консольное окно и не ??), но чтоб была возможность прокрутки вверх-вниз, и очень бы желательно с разными шрифтами. Редактирование не нужно. #include "minigui.ch" #define WM_VSCROLL 0x0115 #define SB_VERT 1 #define SB_PAGEDOWN 3 function main set exact on _w=800 //init width _h=600 // init height DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH _w ; HEIGHT _h ; TITLE 'Console' ; MAIN ; NOMAXIMIZE NOSIZE ON KEY RETURN ACTION penter() @ 20,10 EDITBOX Edit_1 ; READONLY; WIDTH _w-30 ; HEIGHT _h-110; FONT 'Verdana' SIZE 11 ; VALUE "Hello, I am the console window ...." @ _h-80,10 TEXTBOX Text_2 ; VALUE '' ; FONT 'Verdana' SIZE 12 ; width _w-30; height 28 END WINDOW Form_1.Text_2.SetFocus Form_1.Center Form_1.Activate return nil *************************************** function penter() private a a=Form_1.Text_2.value if a="cls" Form_1.Edit_1.value :="" else tot=Form_1.Edit_1.value if alltrim(tot) <> "" tot=Form_1.Edit_1.value + chr(13)+chr(10) + a Form_1.Edit_1.value := tot else Form_1.Edit_1.value := a endif endif Form_1.Text_2.value :="" ShowRowCol() return nil ************************************* Procedure ShowRowCol local i, z := GetScrollRangeMax ( GetControlHandle("Edit_1","Form_1") , SB_VERT ) / 20 // code to show last lines for i:=1 to z SendMessage( GetControlHandle("Edit_1","Form_1") , WM_VSCROLL , SB_PAGEDOWN , 0 ) next Return

AM: Спасибо, Григорий, подсказка помогла. Только чисто через SendMessage() не годится, т.к. надо выводить сразу (пока что-то делается с БД), чтобы человек не скучал. Так что добавил SHOW и ещё кое-что переделал под свои нужды. И жаль, что нельзя выделять шрифтами и цветом. #define WM_VSCROLL 0x0115 #define SB_VERT 1 #define SB_PAGEDOWN 3 #define cr chr(13)+chr(10) function consol_init(zag) //создание консольного окна set exact on _w=800 //init width _h=600 // init height DEFINE WINDOW ConsolW AT 0,0 WIDTH _w HEIGHT _h; NOCAPTION NOSIZE TOPMOST BACKCOLOR BLUE //TITLE (zag) @ 30,3 EDITBOX Edit_1 READONLY WIDTH _w-7 HEIGHT _h-90; FONT 'Verdana' SIZE 11 NOHSCROLL FONTCOLOR WHITE BACKCOLOR BLACK @ _h-40,_w-110 BUTTON Button_Q CAPTION 'Закрыть' ; ACTION ConsolW.release END WINDOW ConsolW.Center ConsolW.show ConsolW.Button_Q.Enabled:=.f. if !empty(zag) DRAW TEXT IN WINDOW ConsolW AT 10,30 VALUE zag FONTCOLOR WHITE; BACKCOLOR BLUE BOLD endif return nil *************************************** function consol_out(text) //вывод в консольное окно private a a=text tot=ConsolW.Edit_1.value if alltrim(tot) <> "" tot=ConsolW.Edit_1.value+cr+a ConsolW.Edit_1.value:=tot else ConsolW.Edit_1.value:=a endif ShowRowCol() ConsolW.Show return nil ************************************* Procedure ShowRowCol local i,z:=GetScrollRangeMax(GetControlHandle("Edit_1","ConsolW"),SB_VERT)/20 // code to show last lines for i:=1 to z SendMessage(GetControlHandle("Edit_1","ConsolW"),WM_VSCROLL,SB_PAGEDOWN,0) next Return proc consol_end() //конец вывода в консольное окно (разрешение закрытия) ConsolW.Button_Q.Enabled:=.t. ConsolW.Activate return

AM: Всё-таки в том варианте сильно мелькает и даже тормозит при большом выводе. Вот несколько переработал, теперь лучше. Кнопка "Вывод" позволяет отключить вывод, если всё же слишком сильно мелькает, и опять включить, если надо. Правда, иногда медленно реагирует на включение. Может, кто подскажет, как дальше улучшить? #define cr chr(13)+chr(10) #define WM_VSCROLL 0x0115 #define SB_BOTTOM 7 function consol_init(zag) //создание консольного окна public tot:='' set exact on _w=800 //init width _h=600 // init height DEFINE WINDOW ConsolW AT 0,0 WIDTH _w HEIGHT _h; NOCAPTION NOSIZE TOPMOST BACKCOLOR BLUE TITLE (zag) @ 30,3 EDITBOX Edit_1 READONLY WIDTH _w-7 HEIGHT _h-90; FONT 'Courier' SIZE 11 NOHSCROLL FONTCOLOR WHITE BACKCOLOR BLACK @ _h-40,_w-220 CHECKBUTTON Button_S CAPTION 'Вывод' VALUE .t.; ON CHANGE (ConsolW.Edit_1.value:=tot,; SendMessage(GetControlHandle("Edit_1","ConsolW"),WM_VSCROLL,SB_BOTTOM,0),; DoMethod('ConsolW','Show')) @ _h-40,_w-110 BUTTON Button_Q CAPTION 'Закрыть' ; ACTION ConsolW.release END WINDOW ConsolW.Center ConsolW.show ConsolW.Button_Q.Enabled:=.f. if !empty(zag) DRAW TEXT IN WINDOW ConsolW AT 10,30 VALUE zag FONTCOLOR WHITE; BACKCOLOR BLUE BOLD endif return nil *************************************** function consol_out(text) //вывод в консольное окно memvar tot tot=if(empty(tot),text,tot+cr+text) if ConsolW.Button_S.value ConsolW.Edit_1.value:=tot endif ShowRowCol() return nil ************************************* Procedure ShowRowCol() static flag:=.f. if flag return endif flag=.t. SendMessage(GetControlHandle("Edit_1","ConsolW"),WM_VSCROLL,SB_BOTTOM,0) ConsolW.Show flag=.f. Return proc consol_end() //конец вывода в консольное окно (разрешение закрытия) ConsolW.Button_Q.Enabled:=.t. ConsolW.Button_Q.SetFocus ConsolW.Activate return




полная версия страницы