Pascal - Редактирование текста в граф режиме

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
wKip
Сообщения: 3
Зарегистрирован: 24 май 2007, 19:53

24 май 2007, 20:32

Здравствуйте. Вопрос по Turbo Pascal'ю. Осуществил загрузку текста в динамическую память, вывел на экран, с возможностью прокрутки по стрелкам.
Собственно проблема вот в чем, надо поставить графический курсор на начало первой строки, далее - дальнейшее редактирование строки, т.е. сдвиг элементов строки при наборе символов с клавиатуры, передвижение по строке, на строку ниже/выше. Т.е. надо сделать редактирование данного текста в динамической памяти с возможностью дальнейшего сохранения.

Только разбираюсь со связанными списками, а надо очень срочно.....
Напишите, пожалуйста, что и как надо изменить в данном коде, чтобы осуществить хотя бы минимальное редактирование (остальное сам доделаю), подкиньте идеи.

Сделал выдержку из кода основной своей программы, (можно скопировать и откомпилить, работает загрузка текстового файла и прокрутка)

Код: Выделить всё

uses crt, graph;

type
   pLine = ^tLine;
   tLine = record
     PrevLine: pLine;
     NextLine: pLine;
     Line: string;
   end;

Procedure StartGraph;
var
drivervar, modevar, ErrCode: integer;
begin
drivervar:=Detect;
drivervar:=VGA;
Modevar:=VGAhi;
initGraph(DriverVar, ModeVar, 'c:\tp7\bin');
ErrCode:=GraphResult;
if ErrCode <> grOK then
 begin
 Writeln('Graphics error:', GraphErrorMsg(ErrCode));
 halt(1);
 end;
end;

procedure whatBtn(var Ch: char);
begin
  Ch:=ReadKey;
  if Ch = #0 then
    Ch:=ReadKey;
end;

procedure ViewScreen(pStr: pLine);
var
   i: byte; n:integer;
begin
  clrscr;   n:=10;
  gotoXY(10,n);
  for i:=1 to 25 do
   begin
     OutTextXY(10,n,pStr^.Line);
     if pStr^.NextLine = nil then break;
     pStr:=pStr^.NextLine;
     n:=n+10;
   end;
end;


procedure MoveUp(var pStr: pLine);
var
   pStrW: pLine;
begin
  if pStr^.PrevLine = nil then exit;
  pStr:=pStr^.PrevLine;
  ViewScreen(pStr);
end;

procedure MoveDown(var pStr: pLine);
begin
  if pStr^.NextLine = nil then exit;
  pStr:=pStr^.NextLine;
  ViewScreen(pStr);
end;


var
  filename: string;
  flags: boolean;
  Ch: Char;
  tfile: text;
  pStr, pStrW, pStrOne: pLine;

begin
StartGraph;
  filename:='text.txt';
  flags:=false;

  {$I-}
  Assign(tfile, filename);
  Reset(tfile);
  {$I+}
  if (IOResult <> 0) or (filename = '') then exit;
  new(pStr);
  pStrOne:=pStr;
  pStr^.PrevLine:=nil;
  while not Eof(tFile) do
   begin
     new(pStrW);
     pStr^.NextLine:=pStrW;
     Readln(tfile, pStr^.Line);
     pStrW^.PrevLine:=pStr;
     pStr:=pStrW;
   end;
  Close(tfile);
  pStr:=pStr^.PrevLine;
  pStr^.NextLine:=nil;
  Dispose(pStrW);
  pStr:=pStrOne;
  ViewScreen(pStr);
  repeat
    if keypressed then whatBtn(Ch);
    case Ch of
     'P','<': MoveDown(pStr);
     'H',';': MoveUp(pStr);
     #27: flags:=true;
    end;
    Ch:=#0;
  until flags;

  while pStr^.NextLine <> nil do
     pStr:=pStr^.NextLine;

  while pStr <> nil do
   begin
     pStrW:=pStr;
     pStr:=pStrW^.PrevLine;
     Dispose(pStrW);
   end;

end.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

25 май 2007, 10:23

а обязательно делать с динамическими списками? если нет - текст удобнее хранить в строке (строках), при редактировании очищать часть экрана и выводить строку туда.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
wKip
Сообщения: 3
Зарегистрирован: 24 май 2007, 19:53

25 май 2007, 19:33

Хыиуду, Мне надо хранить текст в динамической памяти... Сама загрузка текстового документа в динамическую память по строкам и его отображение у меня сделаны, сделал прокрутку..., а как редактировать строки в динамической памяти - не доходит....
Хотя видел что такое вполне можно реализовать, может подскажет кто, все уже перепробовал... .
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

28 май 2007, 08:57

&quot писал(а):а как редактировать строки в динамической памяти - не доходит....
Хотя видел что такое вполне можно реализовать, может подскажет кто, все уже перепробовал... .
Да также как с обычными строками:

Код: Выделить всё

Delete(pStr^.Line, 1, 1);
It's a long way to the top if you wanna rock'n'roll
wKip
Сообщения: 3
Зарегистрирован: 24 май 2007, 19:53

28 май 2007, 14:21

все реализовал, что хотел.... с этим вопросом - разобрался.
Ответить