![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;![]() --------- Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ? |