Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация command history в консоли, а-ля command.com или shell в Linux 
:(
    Опции темы
snsh
Дата 27.12.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.12.2006

Репутация: нет
Всего: нет



Уважаемые форумчане!
Подскажите, может кто сталкивался с проблемой. Стоит задача создания консольного приложения. При этом предполагается довольно большой объем вводимых с клавиатуры данных, которые между собой будут довольно сильно похожи. Напрашивается вопрос - как можно это реализовать? В shell'ах Linux'а или в ДОС-окне нажатие стрелки вверх вызывает последнюю команду, еще раз вверх - предпоследнюю команду и т.д. При этом эти команды после такого вызова на экран можно редактировать (именно это мне и нужно). Как помещать в некий стек (будь то в виде массива или файла) введенные команды, я понимаю. Как потом мне не просто выводить последнюю команду, а иметь возможность ее редактировать? Т.е., строка команды из некоего стека должна не просто выводиться на экран, а типа как эмулировать клавиатурный ввод. В командных оболочках это называется, по-моему, command history.
PM MAIL   Вверх
VaiMR
Дата 15.1.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 25.11.2006

Репутация: нет
Всего: 2



Я думаю, можно попробовать вручную обрабатывать нажатия клавиш, т. е. нажали delete и, если можно, то удалили символ, аналогично по стрелочкам.
вот, например, так:

Код

repeat
 klav:=readkey;
 if (klav=#8)and(name<>'')
  then
   begin
    gotoxy(wherex-1,1);
    write(' ');
    delete(name,length(name),1);
    i:=i-1;
    gotoxy(wherex-1,1);
   end;
 if (((klav>#47)and(klav<#58))
     or
     ((klav>#64)and(klav<#91))
     or
     ((klav>#96)and(klav<#123))
     or
     ((klav>#64)and(klav<#91))
     or
     ((klav>#127)and(klav<#176))
     or
     ((klav>#223)and(klav<#240)))
     and(i<9)
  then
   begin
    name:=name+klav;
    write(klav);
    i:=i+1;
   end;
 until (klav=#13)or(klav=#27);

PM MAIL ICQ   Вверх
Ramzey
Дата 15.1.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



Вот, что-то захотелось сделать.
Немного нескладо, но работает.

Код


uses Crt;
type
  PSpis = ^TSpis; {двухсвязный список-кольцо}
  TSpis = record
            Line : string[80];
            Next : PSpis;
            Prev : PSpis;
          end;
VAR
  name    : string;
  CmdSpis : PSpis;
  Last    : PSpis;

function ReadLine : string;
const
  CharSet = [32..247];
var
  key   : char;
  count : byte;
  str   : string[80];
  i     : byte;
begin
  count:=0;
  str:='';
  i:=0;
  repeat
    key:=readkey;
    if key=#27 then
      begin
        str:='';
        break
      end;
    if key=#0 then
      begin
        key:=readkey;
        if (key='K')and(i<>0) then
          begin
            delete(str,i,1);
            dec(i);
            gotoxy(wherex-1,wherey);
            write(' ');
            gotoxy(wherex-1,wherey);
          end;
        if key='H' then
          begin
            delline;
            gotoxy(1,wherey);
            str:=Last^.Line;
            write(str);
            i:=Length(str);
            Last:=Last^.Prev
          end;
        if key='P' then
          begin
            delline;
            gotoxy(1,wherey);
            Last:=Last^.Next;
            str:=Last^.Line;
            write(str);
            i:=Length(str);
          end;

        continue
      end;
    if (key=#8)and(i<>0) then
      begin
        delete(str,i,1);
        dec(i);
        gotoxy(wherex-1,wherey);
        write(' ');
        gotoxy(wherex-1,wherey);
      end;
    if (byte(key) in CharSet)and(i<79) then
      begin
        str:=str+key;
        write(key);
        inc(i);
      end;
  until (key=#13);
  ReadLine:=str
end;

procedure AddLine(str : string);
var
  tmpSpis : PSpis;
begin
  new(tmpSpis);
  tmpSpis^.Line:=str;
  tmpSpis^.Prev:=Last;
  tmpSpis^.Next:=Last^.Next;
  Last^.Next:=tmpSpis;
  tmpSpis^.Next^.Prev:=tmpSpis;
  Last:=tmpSpis
end;

BEGIN
  new(CmdSpis);
  Last:=CmdSpis;
  CmdSpis^.Line:='';
  CmdSpis^.Next:=CmdSpis;
  CmdSpis^.Prev:=CmdSpis;
  repeat
    clrscr;
    name:=readline;
    if name <> '' then AddLine(Name);
  until name='exit';
END.


Это сообщение отредактировал(а) Ramzey - 15.1.2007, 20:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.