Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Результаты опроса: Была полезна консоль в программа (в Memo или RichEdit) ?
Да, это лучше чем стандартная консоль Windows 1 14.29%
Да, была бы полезна для отладки, и вообще пригодится 1 14.29%
Нет, лучше использовать стандартную консоль Windows 0 0%
Нет, консоль вообще не нужна в приложениях 5 71.43%
Голосовавшие: 7. Вы еще не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.05.2011, 15:09
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
Вопрос Делаем консоль из Memo

Делаю проект, нужна консоль как в Notepad++ (левый рис.). В Total Commander то же есть консоль (правый рис.), но несколько не такая как нужна


На просторах Internet нашёл коспонент TConsoleIO (к сожалению ссылки на автора не было), который позволяет перенаправить вывод данных в Memo.

Однако как в TMemo запретить правку всей области, кроме точки ввода (т.е. позиции где в консоли обычно мигает курсор и редактируется текст, например
Цитата:
D:\Dir1\Dir2\Dir3\>dir
Том в устройстве D имеет метку DATA
Серийный номер тома: 54FD-E549

Содержимое папкиD:\Dir1\Dir2\Dir3

24.05.2011 22:52 <DIR> .
24.05.2011 22:52 <DIR> ..
23.05.2011 17:12 <DIR> Dir4
05.02.2011 21:35 4*082*176 ProgSamles.exe
D:\Dir1\Dir2\Dir3\>
ProgSamles.exe|
где жирным не редактируемая часть,
а курсивом редактируемая область {с условным курсором в конце}
) ???

Пусть запрещена правка в TMemo и отслеживается нажатия клавиш и буфер обмена - если текст редактируется с указанной позиции, то отображать изменения в Memo, а если за ей пределами (выше, т.к. ниже редактируемой строки не должно ничего быть), то возможно только копирование в буфер обмена. При нажатии клавиш, если курсор не в области правки, ставится в конец области правки и введенный символ вводится уже туда, а если он уже там то просто вводится символ в позицию курсора.


ВОПРОСЫ:
Как определить позицию курсора в тексте?
Как переместить курсор в произвольную позицию (существующею в тексте)?

PS Пишу в Delphi 2010
Вложения
Тип файла: zip ConsoleIO.zip (8.0 Кбайт, 48 просмотров)
Тип файла: zip ColnsoleIOexample.zip (232.4 Кбайт, 32 просмотров)
Ответить с цитированием
  #2  
Старый 24.05.2011, 16:48
flexterful flexterful вне форума
Прохожий
 
Регистрация: 24.03.2011
Сообщения: 9
Репутация: 10
По умолчанию

Позиция курсора храниться здесь :
Код:
TMemo.SelStart
Ответить с цитированием
  #3  
Старый 24.05.2011, 18:39
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
По умолчанию

flexterful спасибо, конечно
Но как позицию коретку получить в координатах [строка, позиция_в_строке] ?
И как установить коретку в нужную позицию?

Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ?
Ответить с цитированием
  #4  
Старый 24.05.2011, 19:38
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Есть API функция AllocConsole, которая создаст консоль, с которой потом можно работать.
Что касается
Цитата:
Но как позицию коретку получить в координатах [строка, позиция_в_строке] ?
То я сомневаюсь, что это вообще возможно - компонент хранить номер символа, после которого стоит курсор. В принципе, можно вычислить сколько символов в строке, но это похоже на мазохизм
Ответить с цитированием
  #5  
Старый 24.05.2011, 20:06
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
Радость

Уф... все же два дня поисков увенчались успехом - нашел, ура!

Кажется то что нужно, наконец, по крайней мере работает пока как надо (это оригинал кода 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;
Теперь осталось разобраться с буфером обмена, но тут не знаю с какой стороны подступиться

---------
Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter