Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1161328654
Автоматчик
2006-10-20 11:17
2006.11.05
Помогите написать проаграмму для стрелки барометра.


3-1157531506
July
2006-09-06 12:31
2006.11.05
копирование blob


8-1143548552
Nik2006
2006-03-28 16:22
2006.11.05
DSPack


2-1161184107
Tbegin
2006-10-18 19:08
2006.11.05
моя первая прога


15-1160645496
TohaNik
2006-10-12 13:31
2006.11.05
Как определить нигерийскую фамилию:) или продолжение будет...?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский