Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichEdit Multi UNDO, Undo раздельно для разных окон RichEdit 
:(
    Опции темы
CHERRY
Дата 6.4.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


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

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



Модуль MultipleUndo реализует многократную отмену RichEdit.
Мой редактор основан на RichEdit. Окна с RichRdit создаются на PageControl по мере надобности.
Но с MultipleUndo отмена общая для всех окон. Как реализовать независимую отмену для каждого окна?
Код

{

MultipleUndo
Unit to add multiple undo to the standard Delphi RichEdit component
Version 1.00

Copyright (c) 2004-2006 Laurenz van Gaalen
http://www.laurenzvangaalen.nl/software/

Freeware
Tested with Delphi 6 Personal

}

unit MultipleUndo;

interface

uses
  Classes, ComCtrls, Messages, Dialogs;

function Initialize (UndoLevels : integer) : boolean;
function Clear : boolean;
function SaveToUndoBuffer (RichEdit : TRichEdit) : boolean;
function LoadFromUndoBuffer (RichEdit : TRichEdit ; Undo : boolean) :  boolean;

implementation

var
  Global_UndoBuffer            : array of TMemoryStream;
  Global_UndoLevels            : integer;
  Global_UndoIndex             : integer;
  Global_Undo                  : integer;
  Global_Redo                  : integer;
  Global_FirstVisibleLine      : array of integer;
  Global_SelStart              : array of integer;
  Global_SelLength             : array of integer;


function Initialize (UndoLevels : integer) : boolean;
var
  i : integer;
begin
  try
    Result := true;
    Global_UndoLevels := UndoLevels;
    Global_UndoIndex := 0;
    Global_Undo := 0;
    Global_Redo := 0;
    Setlength(Global_FirstVisibleLine, Global_UndoLevels);
    Setlength(Global_SelStart, Global_UndoLevels);
    Setlength(Global_SelLength, Global_UndoLevels);
    Setlength(Global_UndoBuffer, Global_UndoLevels);
    for i := 0 to Global_UndoLevels - 1 do
    begin
      Global_UndoBuffer[i] := TMemoryStream.Create;
    end;
  except;
    Result := false;
  end;
end;


function Clear : boolean;
var
  i : integer;
begin
  try
    Result := true;
    for i := 0 to Global_UndoLevels - 1 do
    begin
      Global_UndoBuffer[i].Free;
    end;
  except
    Result := false;
  end;
end;


function SaveToUndoBuffer (RichEdit : TRichEdit) : boolean;
begin
  try

    Result := true;

    //Reset buffer and save data
    Global_UndoBuffer[Global_UndoIndex].SetSize(0);
    Global_UndoBuffer[Global_UndoIndex].Position := 0;
    RichEdit.Lines.SaveToStream(Global_UndoBuffer[Global_UndoIndex]);

    //Store graphical information (cursor position etc.)
    Global_FirstVisibleLine[Global_UndoIndex] := RichEdit.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
    Global_SelStart[Global_UndoIndex] := RichEdit.SelStart;
    Global_SelLength[Global_UndoIndex] := RichEdit.SelLength;

    //Set or reset buffer index
    if Global_UndoIndex = Global_UndoLevels - 1 then
    begin
      Global_UndoIndex := 0;
    end
    else
    begin
      Global_UndoIndex := Global_UndoIndex + 1;
    end;

    //Reset Undo/Redo counters
    Global_Undo := 0;
    Global_Redo := 0;

  except
    Result := false;
  end;
end;


function LoadFromUndoBuffer (RichEdit : TRichEdit ; Undo : boolean) : boolean; //false = Redo mode
var
  BufferToLoad : integer;
begin
  try
    Result := true;

    if Undo = true then
    begin

      //First time this procedure is called in a possible sequence.
      if Global_Undo = 0 then
      begin
        MultipleUndo.SaveToUndoBuffer(RichEdit);
        Global_Undo := 1;
      end;

      //Last undo level reached
      if Global_Undo = Global_UndoLevels then
      begin
        exit;
      end;

      Richedit.Lines.BeginUpdate;
      Global_Undo := Global_Undo + 1;
      BufferToLoad := Global_UndoIndex - Global_Undo;
      if BufferToLoad < 0 then
      begin
        BufferToLoad := Global_UndoLevels + BufferToLoad;
      end;

    end
    else
    begin

      //First undo level reached
      if Global_Redo = Global_Undo -1 then
      begin
        Global_Undo := 1;
        Global_Redo := 0;
        exit;
      end;

      Richedit.Lines.BeginUpdate;
      Global_Redo := Global_Redo + 1;
      BufferToLoad := (Global_UndoIndex - Global_Undo) + Global_Redo;
      if BufferToLoad < 0 then
      begin
        BufferToLoad := Global_UndoLevels + BufferToLoad;
      end;

    end;

    //Load undo level from buffer
    Global_UndoBuffer[BufferToLoad].Position := 0;
    RichEdit.Lines.LoadFromStream(Global_UndoBuffer[BufferToLoad]);

    //Restore graphical information (cursor position etc.)
    with Richedit do
    begin
      Perform( em_linescroll, 0, Global_FirstVisibleLine[BufferToLoad] - perform( EM_GETFIRSTVISIBLELINE, 0, 0 ));
    end;
    RichEdit.SelStart := Global_SelStart[BufferToLoad];
    RichEdit.SelLength := Global_SelLength [BufferToLoad];

    Richedit.Lines.EndUpdate;

  except
    Result := false;    
    Richedit.Lines.EndUpdate;
  end;
end;

end.




--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Snowy
Дата 6.4.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Ответ прост - переделать, объеденить всё в класс. И для каждого рича делать отдельный инстанс этого класса.
PM MAIL   Вверх
CHERRY
Дата 6.4.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


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

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



Можно поподробней. 
Как это реально организовать?
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Snowy
Дата 6.4.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Весь код у тебя уже есть.
Создай новый класс.
То, что в var - размести в public
Там же процедуры, описанные в секции интерфейса.
Те, что не описаны в секции интерфейса - в private секцию.
Что ещё не понятно?
PM MAIL   Вверх
CHERRY
Дата 6.4.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


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

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



Никогда не создавал классов. А сейчас лезть в книжки нет возможности.
Если не сложно - нарисуй болванку.
И как потом этот класс создавать или вызывать?
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Snowy
Дата 6.4.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Если ты никогда их не создавал, то как ты собираешься его использовать?
Даже, если написать, то что ты с этим будешь делать?
Просто воткнуть, чтоб всё волшебным образом заработало - не получится.
Учи матчасть ;-)
Пока потерпишь мез мультиундо. Доберёшься до книжки и учить, учить, учить...
PM MAIL   Вверх
CHERRY
Дата 7.4.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


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

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



Я любитель. Свою первую прогу на Pascal я написал в 1987г.
Программирование - хобби. Если тебе в лом написать решение, так и скажи.
А учить меня жить не надо. Мне 47 лет.
Я думаю, что форум существует для получения решений.
А воспитательные и общеобразовательные функции не в вашей компетенции.
Жаль, что был вынужден объяснится. (-
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Snowy
Дата 7.4.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Если честно, то конечно лень.
Но раз пошла такая пляска, то могу себе позволить потратить 15 минут.
Прикрепляю к посту модуль и пример, переписанные под МультиРич.
Пример, собственно не изменился внешне.
Просто проверка, что по прежнему работает smile
Вообще надо бы было переделать это в компонент - рич с анду. Но лень smile

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  MultipleUndo.zip 3,22 Kb
PM MAIL   Вверх
CHERRY
Дата 7.4.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


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

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



Спасибо за понимание.  smile 
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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

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

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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