mtdu
Спасибо! а проц какой?
еще маленькое уточнение по ати - если выбрать мышью примитив он меняет цвет или становится пунктирным?
Модератор: Модераторы
{$IFNDEF LINUX}self.VertScrollBar.Tracking:=true;{$ENDIF}
Line:=ЛинияКоторуюПользовательТкнулМышкой;
UndoManager.StartUserCommand('Редактирование ткнутой линии'); //помещаем в стек маркер начала пользовательской команды с именем, чтоб пользователь потом видел что отменяет
Command:=UndoManager.CteateChangeCommand(Line.end); //тут ундоменеджер создает и помещает в стек микрокоманду изменения и запоминает начальное состояние изменяемого параметра, и адрес изменяемого параметра
Command.NewData.x:=новыйX;//
Command.NewData.y:=новыйY;//задаем новое положение, но не в линии а в команде, чтоб она его тоже запомнила
Command.NewData.z:=новыйZ;//
Command.Do;//или Comit, кароче применяем новое положение к линии
....
//аналогичным образом меняем начало линии или другие линии, короче "микрокоманд" между маркерами может быть много
....
UndoManager.EndUserCommand;//пихаем в стек маркер конца пользовательской команды
zub писал(а):Насколько понял FPCшными генериками подобное не реализовать, т.к. их нужно руками специализировать для нужных типов и в UndoManager.CteateChangeCommand(Line.end) нужно передавать еще один параметр (для распознавания типа).
TLine=object start,end:tvertex; end;
tvertex=record x,y,z:double;end;
- Код: Выделить всё
Command:=UndoManager.CteateChangeCommand(Line.end);
Command.NewData.x:=новыйX;
var newline: tline;
...
Command:=UndoManager.CteateChangeCommand(Line.end);
newline.x = новыйX;
Command.SetData(newline);
with UndoManager.CteateChangeCommand(Line.end) do
NewData.x:=новыйX;
zub писал(а):только вот какнибудь бы шаблонизировать CteateChangeCommand, чтобы получилась куча перегруженных функций создающих и возвращающих объекты разного типа.
with UndoStack.PushCreateTGChangeCommand(изменяемыйобъект)^ do //тут запоминается старое состояние
begin
изменяемыйобъект:=чтотоновое;
ComitFromObj; //тут запоминается новое состояние данных
end;
with UndoStack.PushCreateTGChangeCommand(изменяемыйобъект)^ do //тут запоминается старое состояние
begin
NewData:=чтотоновое;
Comit;//тут новое состояние из команды присваивается данным
end;
ВыбранаяПользователемПолилиния.TransformBy(matrix);
Вернуться в Разработки на нашем сайте
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14