|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
Результаты опроса: Была полезна консоль в программа (в Memo или RichEdit) ? | |||
Да, это лучше чем стандартная консоль Windows | 1 | 14.29% | |
Да, была бы полезна для отладки, и вообще пригодится | 1 | 14.29% | |
Нет, лучше использовать стандартную консоль Windows | 0 | 0% | |
Нет, консоль вообще не нужна в приложениях | 5 | 71.43% | |
Голосовавшие: 7. Вы еще не голосовали в этом опросе |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Делаем консоль из Memo
Делаю проект, нужна консоль как в Notepad++ (левый рис.). В Total Commander то же есть консоль (правый рис.), но несколько не такая как нужна
На просторах Internet нашёл коспонент TConsoleIO (к сожалению ссылки на автора не было), который позволяет перенаправить вывод данных в Memo. Однако как в TMemo запретить правку всей области, кроме точки ввода (т.е. позиции где в консоли обычно мигает курсор и редактируется текст, например Цитата:
а курсивом редактируемая область {с условным курсором в конце}) ??? Пусть запрещена правка в TMemo и отслеживается нажатия клавиш и буфер обмена - если текст редактируется с указанной позиции, то отображать изменения в Memo, а если за ей пределами (выше, т.к. ниже редактируемой строки не должно ничего быть), то возможно только копирование в буфер обмена. При нажатии клавиш, если курсор не в области правки, ставится в конец области правки и введенный символ вводится уже туда, а если он уже там то просто вводится символ в позицию курсора. ВОПРОСЫ: Как определить позицию курсора в тексте? Как переместить курсор в произвольную позицию (существующею в тексте)? PS Пишу в Delphi 2010 |
#2
|
|||
|
|||
Позиция курсора храниться здесь :
Код:
TMemo.SelStart |
#3
|
|||
|
|||
flexterful спасибо, конечно
Но как позицию коретку получить в координатах [строка, позиция_в_строке] ? И как установить коретку в нужную позицию? Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ? |
#4
|
|||
|
|||
Есть API функция AllocConsole, которая создаст консоль, с которой потом можно работать.
Что касается Цитата:
|
#5
|
|||
|
|||
Уф... все же два дня поисков увенчались успехом - нашел, ура!
Кажется то что нужно, наконец, по крайней мере работает пока как надо (это оригинал кода Armorer): Код:
Procedure TfMain.ResetStatusPos; var X, Y : Integer; begin if CarPos <> -1 then// если нажали мышь и выделяем текст - то здесь начало выделяемого текста begin if ( Memo.SelStart + Memo.SelLength ) = CarPos // вычисляем в какую сторону выделяем then begin // строка - если выделяем в сторону начала текста Y := Memo.Perform( EM_LINEFROMCHAR, -1, -1 ); // колонка - если выделяем в сторону начала текста X := LoWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 ); end else begin // строка - если выделяем в сторону конца текста Y := Memo.CaretPos.Y; // колонка - если выделяем в сторону конца текста X := HiWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 ); end; end else begin Y := Memo.Perform( EM_LINEFROMCHAR, -1, -1 ); X := LoWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 ); end; inc(Y); inc(X); StatusBar.Panels[0].Text := IntToStr( Y ) + ':' + IntToStr( X ); end; procedure TfMain.MemoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Memo.SelLength = 0 then CarPos := -1; ResetStatusPos; end; procedure TfMain.MemoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin ResetStatusPos; end; procedure TfMain.MemoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin CarPos := Memo.SelStart; ResetStatusPos; end; procedure TfMain.MemoKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if not (ssShift in Shift) and (Memo.SelLength = 0) then CarPos := -1; ResetStatusPos; end; procedure TfMain.MemoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (CarPos = -1) and (ssShift in Shift) then CarPos := Memo.SelStart; ResetStatusPos; end; --------- Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ? |