Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Добавить запись об отменяемом действии в Memo   Найти похожие ветки 

 
Gero ©   (2006-10-18 15:55) [0]

Делаю изменения в тексте TMemo, но не вручную, а программно.
При этом в Undo такое редактирование не заносится, соответственно, при нажатии «отменить» ничегот не происходит.
Как занести?
Конечно, можно сэмулировать свое Undo, но хотелось бы штатно.


 
Сергей М. ©   (2006-10-18 15:58) [1]


> Делаю изменения в тексте TMemo, но не вручную, а программно


Позлравляю. Ты изобрел велосипед.


> при нажатии «отменить» ничегот не происходит


Значит у тебя ошибка в программе.


 
Gero ©   (2006-10-18 16:14) [2]

Для примера:

Делаю так:

Memo1.Text := Memo1.Text + "text";

Однако, при нажатии на Ctrl+Z предыдущий текст не восстанавливается, более того буфер undo вобще очищается. А хотелось бы чтобы эффект был таким же, как при вводе текста вручную.


 
Gero ©   (2006-10-18 16:15) [3]

> Значит у тебя ошибка в программе.

Не думаю, та же ситуация возникает в голом проекте.


 
Сергей М. ©   (2006-10-18 16:33) [4]

Значит бомби Борланд.


 
Gero ©   (2006-10-18 16:36) [5]

> [4] Сергей М. ©   (18.10.06 16:33)

Зачем? Хочешь сказать, что это баг и ненормальное поведение EDIT?


 
Jeer ©   (2006-10-18 16:39) [6]

Gero ©   (18.10.06 16:36) [5]

Вообще-то UNDO в любом продукте создается для отмены ручных действий пользователя.
Не факт, что даже если есть программный интерфейс к объекту, UNDO на это болжно быть рассчитано.
Что естественно.
Не сравнить ведь скорость ручных и автоматических операций.


 
Gero ©   (2006-10-18 16:43) [7]

> [6] Jeer ©   (18.10.06 16:39)

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


 
Сергей М. ©   (2006-10-18 16:44) [8]


> Gero ©   (18.10.06 16:36) [5]


Я хочу сказать, что если ты не согласен со вполне корректной логикой Борланд, то бомби его кляузами, мол, я программноь изменил текст Мемо, а ваш "undo" работает при этом не так как мне взбрендилось.


 
Ketmar ©   (2006-10-18 16:44) [9]

Gero, ну вбивай через SendInput(). криво, зато унда будет работать.

зыж в CDM вообще undo нет. и ничего. не плачу. %-)


 
Gero ©   (2006-10-18 16:46) [10]

> [8] Сергей М. ©   (18.10.06 16:44)

Я согласен с логикой Борланд.


 
default ©   (2006-10-18 16:53) [11]

в .NET посредством свойства Modified можно регулировать состояние буфера отката


 
Gero ©   (2006-10-18 17:00) [12]

> [9] Ketmar ©   (18.10.06 16:44)

Уж проще эмуляцию Undo сделать :)


 
Ketmar ©   (2006-10-18 17:00) [13]

оффтоп: так что ты там просил в "журнале"-то? реализацию чего?


 
VirEx ©   (2006-10-18 20:57) [14]


>  Gero ©   (18.10.06 15:55)

помоему undo в edit одноуровневое, тоесть лучше либо изобрести велосипед, либо оставить как есть


 
VirEx ©   (2006-10-18 21:06) [15]


> [2] Gero ©   (18.10.06 16:14)
> Для примера:
>
> Делаю так:
>
> Memo1.Text := Memo1.Text + "text";


procedure TCustomEdit.Undo;
begin
 SendMessage(Handle, WM_UNDO, 0, 0);
end;

если дельфи делает через мессажи, то и добавляй через их же, чтобы undo работал


 
Gero ©   (2006-10-18 21:14) [16]

> [14] VirEx ©   (18.10.06 20:57)

Конечно, одноуровневое, мне в этот один уровень и требуется как-то изменение занести.

> [15] VirEx ©   (18.10.06 21:06)

Ты знаешь сообщения, через которые можно добавлять, чтобы undo работал?


 
guav ©   (2006-10-18 21:26) [17]

> сообщения, через которые можно добавлять, чтобы undo работал

WM_CHAR ;-)


 
Gero ©   (2006-10-18 21:29) [18]

> [17] guav ©   (18.10.06 21:26)

Не очень-то это удобно, нужно признаться :)


 
VirEx ©   (2006-10-18 21:33) [19]


>  [16] Gero ©   (18.10.06 21:14)

попробовал:
procedure TForm1.Button2Click(Sender: TObject);
var
 buff:PChar;
begin
getmem(buff,255);
SendMessage(memo1.Handle,wm_gettext,255,integer(buff));//ïîëó÷àåì ñòðîêó èç ïîëÿ ââîäà
buff:=PChar(buff+"text");
Memo1.Perform(WM_SETTEXT,0,integer(buff));
end;
но undo не работает, значит делай через буфер обмена


 
guav ©   (2006-10-18 21:34) [20]

> [18] Gero ©   (18.10.06 21:29)

А кому сейчас легко :-)
Сам удивился, как сделан доступ к строкам через Lines - они выделяют строку и шлют EM_REPLACESEL, и ведь иначе и не придумаешь. Так что WM_CHAR тоже можно.


 
VirEx ©   (2006-10-18 21:40) [21]


>  [18] Gero ©   (18.10.06 21:29)
> > [17] guav ©   (18.10.06 21:26)
>
> Не очень-то это удобно, нужно признаться :)

а, ну так чего тут сложного то?
делаем так:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure addtext(text:string);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Undo;
end;

procedure TForm1.addtext(text:string);
var
 i:integer;
begin
 for i:=0 to length(text) do
   memo1.Perform(WM_CHAR,integer(text[i]),0)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
addtext("asd")
end;

end.


 
Gero ©   (2006-10-18 21:41) [22]

> [21] VirEx ©   (18.10.06 21:40)

Сложного ничего, просто выглядит это через одно место.


 
VirEx ©   (2006-10-18 21:43) [23]


> memo1.Perform(WM_CHAR,integer(text[i]),1)


 
guav ©   (2006-10-18 21:52) [24]

> [22] Gero ©   (18.10.06 21:41)

IMHO, ирректальный подход здесь - не пытаться встраивать в undo контролов undo-логику приложений, а наоборот - в undo-логику приложения встроены undo контролов.
Идея навеяна строкой
Multilevel undo
An extensible Undo architecture allows client to participate in application-wide Undo model.

отсюда http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp .



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.708 c
4-1150390635
PRT
2006-06-15 20:57
2006.11.05
Запустить приложение свернутым


2-1161266939
Incognito
2006-10-19 18:08
2006.11.05
Форма в правом нижнем углу


6-1150525928
grisme
2006-06-17 10:32
2006.11.05
Вопрос по WinSock


15-1160810236
dimonf
2006-10-14 11:17
2006.11.05
Прочитай и задумайся


1-1159276063
Lexer
2006-09-26 17:07
2006.11.05
Вызов MDI окна не меняя WindowState у родителя