Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизДобавить запись об отменяемом действии в 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.052 c