Помощь - Поиск - Пользователи - Календарь
Полная версия: консольный текстовый редактор
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
kr3v3tkus
Подскажите как реализовать функции редактирования текста в консоли?
Код

          AssignFile (F, s);
          Reset(F);

          while not EOF(F) do
          begin
            Readln (F, s);
            MyWriteln(s);
          end;

можно вообще их реализовать при таком вводе?
зы пробовал делать пару процедур по мануалам - не работают sad.gif чиво они так? sad.gif
Код

procedure GotoXY(X, Y: Word);
begin
  Coord.X := X;
  Coord.Y := Y;
  SetConsoleCursorPosition(ConHandle, Coord);
end;

procedure ClrScr;
begin
  Coord.X := 0;
  Coord.Y := 0;
  FillConsoleOutputCharacter(ConHandle, ' ', MaxX * MaxY, Coord, NOAW);
  GotoXY(0, 0);
end;

ззы или плз киньте линки на литературу >__>
volvo
В DRKB просмотри реализацию модуля "CRT для консольного приложения", там вполне рабочая версия...
kr3v3tkus
там большой модуль Т__Т а нет попроще реализации без всяких прятаний курсоров и прочих украшени? (;__; ) чтоб можно было потом объяснить человеку, чтобы он попытался обяснить преподу? rolleyes.gif

зы мб я олух, но не компилируеца он >__> я не знаю почему - но у него неопределены KeyEvent и много чего ещё + гдето ошибка в синтаксисе...
[Error] CRT32.pas(513): Undeclared identifier: 'KeyEvent'
[Error] CRT32.pas(525): Undeclared identifier: 'MouseEvent'
[Error] CRT32.pas(527): Undeclared identifier: 'dwMousePosition'
[Error] CRT32.pas(527): Missing operator or semicolon
[Error] CRT32.pas(527): Missing operator or semicolon
ну и тд
kr3v3tkus
никто ничё не подскажет? :'( надеввду боше нету ни на кого(((
мб можно сделать так чтобы это была... ммм... псевдоконсоль штоли? чтоб все операции производились например в каком либо мемо с другого юнита, но всё задавалось через консоль? ;[ мну в отчаянии T__T
volvo
Цитата
зы мб я олух, но не компилируеца он
blink.gif Ты DRKB какой версии используешь? Если 3.0, то за исключением пропущенного символа "{" в самом начале, и "=" при определении константы Brown, модуль CRT32 компилируется прекрасно... Кстати, какая версия Дельфи?
kr3v3tkus
drkb 2.3 ... ты знаеш, я находил юнит в нете, точно такой же, } и = я то исправлял, но всё равно не хочет, но блин там нету мануала sad.gif ток пару каментов... ну ладно с компиляцией разберусь, но можеш тогда показать на примере его использования программу как отловить выделенный текст и например скопировать его пзялста unsure.gif ?
забыл - дельфя седьмые

ща позырел - в InputRec нету метода(или как?) InputRec{$IfDef NEW_STYLES}.Event.KeyEvent, а есть InputRec{$IfDef NEW_STYLES}.Event.keybd_event

...чёт я не того... походу это и есть добавление... чеж он ругаеца тада(((

-__- блин это походу изза этих штук {$IfDef NEW_STYLES}... а что это ваще? не коментарии же?..
volvo
Погоди... Тебе надо полноэкранное консольное приложение, или достаточно будет не полноэкранного? Если второе - то вот тут: http://www.silicontaiga.ru/home.asp?artId=5757
разжевано до неприличия, как работать с консолью, как отлавливать клавиши, события мыши и т.п. Посмотри, по-моему достаточно просто можно собрать из всего, что там написано, программу с нужной функциональностью. Если не будет получаться - говори, попробуем помочь...

Добавлено через 11 мин.
Цитата
а что это ваще? не коментарии же?..
Нет... Не комментарии... Это директивы компиляции. То есть, если у тебя определен символ компиляции VER130 или VER140 (то есть, версия Object Pascal-компилятора 13.0 или 14.0), то будет определен и символ NEW_STYLES... А уже если определен NEW_STYLES, то строка типа:
(InputRec{$IfDef NEW_STYLES}.Event{$EndIf}.KeyEvent.bKeyDown) then ...


будет восприниматься компилятором, как
(InputRec.Event.KeyEvent.bKeyDown) then ...
, если же NEW_STYLES не определено (может, компилятор старше чем D6, может, наоборот, новый, в котором версия Object Pascal больше чем 14.0), тогда обращение будет БЕЗ поля Event (символ компиляции отсутствует - то, что находится между $IFDEF/$ENDIF выбрасывается):
(InputRec.KeyEvent.bKeyDown) then ...


Для этого я и спрашивал, какая у тебя версия Дельфи... Насчет семерки не знаю, у меня D6, все компилируется...
kr3v3tkus
о большое пасиб, а то я не мог найти такого мануала подробного, позырю завтра, если что отпишусь smile.gif... а нащёт полноэкранного и не полноэкранного... если честно я довольно абстрактно представляю что это >__> полноэкранный - типа дос сессии без графики и всяких плюшек, а не полноэкранный - с поддержкой api итд? Ну в любом случае я склоняюсь к тому, что неполноэкранный, задача была поставлена просто как "консольный текстовый редактор", учитывая то, что кроме блокнотика и хелло ворлд мы ничего не делали и нам ничего не объясняли, я думаю всёже неполноэкранный >__>

Добавлено через 1 мин.
ааа smile.gif понятна smile.gif да, наверно это изза 7 sad.gif
kr3v3tkus
пардон конечено, но я опять с тупыми вопросами -_- сел тут решил накидать основу по примеру, ничерта не получаецца(
Код

program Consolepr;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  Windows, SysUtils;


Type PBuffer= ^TBuffer;
     TBUffer= packed array [0..16384] of TCharInfo;


var Buffer: PBuffer;
      InpHnd: Cardinal;
{----------PROCEDUREs----------}
procedure Input;
var
a: Char;
IR: INPUT_RECORD;
C: _Coord;
InpHnd, OutHnd, Wr: Cardinal;
begin
repeat
WaitForSingleObjectEx(InpHnd,INFINITE,false);  // ждем события
ReadConsoleInput(InpHnd,IR,1,Wr);  // берем запись в переменную IR
case IR.EventType of // анализируем тип события
KEY_EVENT:  // от клавиатуры:
begin
   if IR.Event.KeyEvent.bKeyDown then  // если клавиша нажата
   begin
     a:=IR.Event.KeyEvent.AsciiChar;  // взять символ в переменную "а"
     if a>#0 then  // если буквенная клавиша:
     begin
       WriteConsoleOutputCharacter(OutHnd,@a,1,C,Wr);  // вывести букву на экран
       Inc(C.X);  // сместиться вправо
     end
     else  // если служебная:
     case IR.Event.KeyEvent.wVirtualKeyCode of  // проверяем код виртуальной клавиши
     VK_UP:
     if (IR.Event.KeyEvent.dwControlKeyState and SHIFT_PRESSED <> 0)
       then {!!!}  // если Shift+Вверх, то делаем что-то
     end;
   end;
end;
end;
until IR.Event.KeyEvent.wVirtualKeyCode = VK_F10;  // выход по нажатию F10
end;

procedure Output;
var
co: _COORD;
Hnd, Wr: Cardinal;
begin
Hnd:=GetStdHandle(STD_INPUT_HANDLE);
co.X:=0;
co.Y:=0;
SetConsoleCursorPosition(Hnd,co);
WriteConsoleOutputAttribute(Hnd,Buffer,10,co,Wr);
end;



{----------/PROCEDUREs----------}

{body}
begin

inpHnd:=GetStdHandle(STD_INPUT_HANDLE);
SetConsoleMode(inpHnd,ENABLE_PROCESSED_INPUT);

Input;

Output;

readln;

end.

1 Никак не могу разобраться с переменными - какую в какую процедуру передавать и надо ли вообще...
2 Каким типом лучше описать буфер?
volvo
Вот начало программы:
Нажмите для просмотра прикрепленного файла

Пока она умеет только запускать консольное окно, печатать текст (причем даже на Enter реагирует неправильно, надо научить ее этому), и выделять текст мышью с зажатой левой кнопкой... Копирование текста в Clipboard тоже надо добавить... Но разбираться будет проще, чем не имея ничего...
kr3v3tkus
Цитата
Но разбираться будет проще, чем не имея ничего...

согласен smile.gif) пасиб большое щаз бум препарировать :P
kr3v3tkus
небольшой вопросик - почему vk_Return не хочет выполняться? на любую другую кнопку цепляется, а сюда нет(
kr3v3tkus
разобрался ток с созданием сохранением загрузкой и файла, а копировать итд не приложу ума как... вольво а можеш написать как это выглядит в теории? а я посижу попробую сделать программно...
зы сори за пунктуацию, кпк логает Т__Т
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.