![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
Результаты опроса: Была полезна консоль в программа (в Memo или RichEdit) ? | |||
Да, это лучше чем стандартная консоль Windows |
![]() ![]() ![]() |
1 | 14.29% |
Да, была бы полезна для отладки, и вообще пригодится |
![]() ![]() ![]() |
1 | 14.29% |
Нет, лучше использовать стандартную консоль Windows |
![]() ![]() ![]() |
0 | 0% |
Нет, консоль вообще не нужна в приложениях |
![]() ![]() ![]() |
5 | 71.43% |
Голосовавшие: 7. Вы еще не голосовали в этом опросе |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Делаю проект, нужна консоль как в 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; ![]() --------- Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ? |