Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать полноценный Undo 
:(
    Опции темы
SerK
Дата 27.1.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пишу свой небольшой редактор вебстраниц.
Столкнулся с проблемой возврата действий.
Использую РичЕдит, который имеет только один возврат.
Честно говоря, не такое это простое дело, неделю бьюсь над этим вопросом, уже мозги кипят.

Может кто уже реализовал механизм возврата?



--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
mrbrooks
Дата 27.1.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



SerK, очень давно реализовывал это через класс TClipboard. Если найду исходник - скину, хотя собственно ничего мудреного нет. Создаем массив TClipboard и работаем  smile 
PM MAIL   Вверх
me21
Дата 27.1.2009, 15:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно сделать иерархию своих классов TAction с методами Do/Undo, и держать их массив/список. Когда пользователь что-то делает в программе, создавать очередной объект нужного класса и добавлять в список.
PM MAIL   Вверх
baldina
Дата 27.1.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Самый простой (но не очень эффективный) путь - использовать список, хранящий версии документа.
Неэффективность заключается в хранении документа целиком. Однако в реальных случаях работает достаточно хорошо. Следующий шаг - измельчение хранимого, по типу предлагаемого me21.
PM MAIL   Вверх
mrbrooks
Дата 27.1.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



а чем вам TClipboard не нравится?
PM MAIL   Вверх
586
Дата 27.1.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(SerK @  27.1.2009,  14:02 Найти цитируемый пост)
Использую РичЕдит, который имеет только один возврат.

RichEdit версии 2 может поддерживать сообщение EM_SETUNDOLIMIT. Что проще - прикрутить WinAPI-шный RichEdit v2 или изобретать велосипед?
В Интернете наверняка есть компоненты, использующие RichEdit v2.
PM   Вверх
mrbrooks
Дата 27.1.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Кстати благодаря 586 заглянул в хелп к CG 2009, где сказано что
Цитата

TRichEdit supports Rich Edit 2.0. 

собственно дело выходит фактически решенное  smile 
PM MAIL   Вверх
586
Дата 27.1.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



В bcb6 код...
Код
SendMessage(RichEdit1->Handle, EM_SETUNDOLIMIT, 50, 0);

... не работает.
PM   Вверх
mrbrooks
Дата 28.1.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Код

SendMessage(RichEdit1->Handle, EM_SETUNDOLIMIT, 50, 0);

хм. в 2009 кстати тоже не работает. хоть ф-я и возвращает 50.

PM MAIL   Вверх
mrbrooks
Дата 28.1.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



SerK,  глянь такой результат подойдет

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  RichEdit.rar 294,50 Kb
PM MAIL   Вверх
SerK
Дата 30.1.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mrbrooks

Спасибо за ответ, скачал Ваш архив, приду домой попробую, потом сообщу результат.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
taiven
Дата 31.1.2009, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



полазил по дельфийским форумам, вообщем вот так можно сделать:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//************************************************
class MyRichEdit : public TRichEdit
{
   public:
   __fastcall MyRichEdit(TComponent *Owner) : TRichEdit(Owner){}
   void __fastcall CreateParams(TCreateParams& Params)
   {
      TRichEdit::CreateParams(Params);
      CreateSubClass(Params, "RichEdit20A");
   }
};
//************************************************

MyRichEdit *RichEdit;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
   RichEdit = new MyRichEdit(this);
   RichEdit->Parent = this;
   RichEdit->Height = 300;
   RichEdit->Width = 300;
   RichEdit->Left = 0;
   RichEdit->Top = 0;
   RichEdit->Visible = true;
   RichEdit->Enabled = true;
   RichEdit->Align = alClient;
}


но в это случае перестают работать некоторые методы RichEdita smile 
RichEdit->Lines->Append("string"); например не работает...

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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