Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2011, 12:22   #1
Leere
Новичок
Джуниор
 
Регистрация: 26.08.2011
Сообщений: 2
По умолчанию Работа с текстовыми окнами в Turbo Pascal

Здравствуйте. Возникла проблема с решением задачи на паскале.

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

Задача: реализовать использование в текстовом окне функций клавиш Home (установить курсор на первый непробельный символ в строке) и End (установить курсор на последний непробельный символ в строке).
При этом считывание текста непосредственно с текстового окна невозможно, текст (либо его характеристики в виде кол-ва пробелов/количества символов) необходимо запоминать.

В сообщении ниже приведен текст программы с реализованными Home и End, однако они перемещают курсор соответственно в начало и конец строки вообще, без учета введенного текста. (в отдельном сообщении, т.к. иначе сообщение слишком длинное)

Прошу помочь, т.к. у самой, видимо, мозгов решить эту задачу не хватает.
Примечание: программа запускается только при наличии модулей CRT и WIN, второй прикреплен в сообщении.
Вложения
Тип файла: rar WIN.rar (1.3 Кб, 10 просмотров)
Leere вне форума Ответить с цитированием
Старый 26.08.2011, 12:22   #2
Leere
Новичок
Джуниор
 
Регистрация: 26.08.2011
Сообщений: 2
По умолчанию

Код:
{ Turbo Windows }
{ Copyright (c) 1989,90 by Borland International, Inc. }

program WinDemo;
{ Turbo Pascal 6.0 example.
  This program demonstrates use of the WIN unit.
}

{$S-}

uses Crt, Win;

const

  CClose  = ^C;
  CRight  = ^D;
  CUp     = ^E;
  CEnter  = ^M;
  CInsLin = ^N;
  COpen   = ^O;
  CRandom = ^R;
  CLeft   = ^S;
  CDown   = ^X;
  CDelLin = ^Y;
  CExit   = ^[;
  CHome   = ^H;
  CEnd    = ^K;
type

  TitleStrPtr = ^TitleStr;

  WinRecPtr = ^WinRec;
  WinRec = record
    Next: WinRecPtr;
    State: WinState;
    Title: TitleStrPtr;
    TitleAttr, FrameAttr: Byte;
    Buffer: Pointer;
  end;

var
  TopWindow: WinRecPtr;
  WindowCount: Integer;
  Done: Boolean;
  Ch: Char;
  str1: string;

procedure Home;
begin
  GotoXY(1,WhereY);
end;

procedure EEnd;
Var
  X: word;
begin
  X:=Lo(WindMax)-Lo(WindMin)+1;
  GotoXY(X,WhereY);
end;

procedure ActiveWindow(Active: Boolean);
begin
  if TopWindow <> nil then
  begin
    UnFrameWin;
    with TopWindow^ do
      if Active then
        FrameWin(Title^, DoubleFrame, TitleAttr, FrameAttr)
      else
        FrameWin(Title^, SingleFrame, FrameAttr, FrameAttr);
  end;
end;

procedure OpenWindow(X1, Y1, X2, Y2: Byte; T: TitleStr;
  TAttr, FAttr: Byte);
var
  W: WinRecPtr;
begin
  ActiveWindow(False);
  New(W);
  with W^ do
  begin
    Next := TopWindow;
    SaveWin(State);
    GetMem(Title, Length(T) + 1);
    Title^ := T;
    TitleAttr := TAttr;
    FrameAttr := FAttr;
    Window(X1, Y1, X2, Y2);
    GetMem(Buffer, WinSize);
    ReadWin(Buffer^);
    FrameWin(T, DoubleFrame, TAttr, FAttr);
  end;
  TopWindow := W;
  Inc(WindowCount);
end;

procedure CloseWindow;
var
  W: WinRecPtr;
begin
  if TopWindow <> nil then
  begin
    W := TopWindow;
    with W^ do
    begin
      UnFrameWin;
      WriteWin(Buffer^);
      FreeMem(Buffer, WinSize);
      FreeMem(Title, Length(Title^) + 1);
      RestoreWin(State);
      TopWindow := Next;
    end;
    Dispose(W);
    ActiveWindow(True);
    Dec(WindowCount);
  end;
end;

procedure Initialize;
begin
  CheckBreak := False;
  if (LastMode <> CO80) and (LastMode <> BW80) and
    (LastMode <> Mono) then TextMode(CO80);
  TextAttr := Black + LightGray * 16;
  Window(1, 2, 80, 24);
  FillWin(#178, LightGray + Black * 16);
  Window(1, 1, 80, 25);
  GotoXY(1, 1);
  Write(' Turbo Pascal 6.0 Window Demo');
  ClrEol;
  GotoXY(1, 25);
  Write('Ins-InsLine Del-DelLine Alt-O-Open' +
    ' Alt-C-Close Alt-R-Random Home End Esc-Exit');
  ClrEol;
  Randomize;
  TopWindow := nil;
  WindowCount := 0;
end;

procedure CreateWindow;
var
  X, Y, W, H: Integer;
  S: string[15];
  Color: Byte;
begin
  W := Random(50) + 10;
  H := Random(15) + 5;
  X := Random(80 - W) + 1;
  Y := Random(23 - H) + 2;
  Str(WindowCount + 1, S);
  if LastMode <> CO80 then
    Color := Black else Color := WindowCount mod 6 + 1;
  OpenWindow(X, Y, X + W - 1, Y + H - 1, ' Window ' + S + ' ',
    Color + LightGray * 16, LightGray + Color * 16);
  TextAttr := LightGray;
  ClrScr;
end;

procedure RandomText;
begin
  repeat
    Write(Chr(Random(95) + 32));
  until KeyPressed;
end;

function ReadChar: Char;
var
  Ch: Char;
begin
  Ch := ReadKey;
  if Ch = #0 then
    case ReadKey of
      #19: Ch := CRandom;   { Alt-R }
      #24: Ch := COpen;     { Alt-O }
      #45: Ch := CExit;     { Alt-X }
      #46: Ch := CClose;    { Alt-C }
      #72: Ch := CUp;       { Up }
      #75: Ch := CLeft;     { Left }
      #77: Ch := CRight;    { Right }
      #80: Ch := CDown;     { Down }
      #82: Ch := CInsLin;   { Ins }
      #83: Ch := CDelLin;   { Del }
      #71: Ch := CHome;     { Home }
      #79: Ch := CEnd;     { End }
    end;
  ReadChar := Ch;
end;

procedure Beep;
begin
  Sound(500); Delay(25); NoSound;
end;

begin
  Initialize;
  Done := False;
  repeat
    Ch := ReadChar;
    if WindowCount = 0 then
      if (Ch <> COpen) and (Ch <> CExit) then Ch := #0;
    case Ch of
      #32..#255: Write(Ch);
      COpen: CreateWindow;
      CClose: CloseWindow;
      CUp: GotoXY(WhereX, WhereY - 1);
      CLeft: GotoXY(WhereX - 1, WhereY);
      CRight: GotoXY(WhereX + 1, WhereY);
      CDown: GotoXY(WhereX, WhereY + 1);
      CRandom: RandomText;
      CInsLin: InsLine;
      CDelLin: DelLine;
      CEnter: WriteLn;
      CExit: Done := True;
      CHome: Home;
      CEnd: EEnd;
    else
      Beep;
    end;
  until Done;
  Window(1, 1, 80, 25);
  NormVideo;
  ClrScr;
end.
Leere вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с текстовыми файлами Pascal decantnik Помощь студентам 2 05.03.2011 16:49
Работа с текстовыми файлами.Pascal valis Помощь студентам 5 29.03.2010 17:59
Работа с текстовыми файлами в ЯП Turbo Pascal JayDe23 Паскаль, Turbo Pascal, PascalABC.NET 0 04.06.2009 19:50
Pascal работа с текстовыми файлами Andrey89 Помощь студентам 3 25.12.2007 19:21