Идею понял. Про дженерики не прокомментирую. Имхо, лучше сначала сделать код для пары-тройки таких команд, а потом уже смотреть, можно ли убрать дублирование с помощью дженериков.
По поводу "передавать еще один параметр". Насколько я знаю, нормальными способами определить тип record'а и object'а нельзя, только через RTTI. Поэтому либо смотреть его, либо передавать информацию о типе. Либо, как бредовая идея в рамках мозгового штурма, изменить объекты/записи на классы, совместимые по API, т.к. классы будут хранить информацию о типе. Но это потребует значительных изменений в управлении памятью.
- Код: Выделить всё
Command:=UndoManager.CteateChangeCommand(Line.end);
Command.NewData.x:=новыйX;
Command создаётся в рантайме, поэтому к NewData мы можем обращаться только как к одному типу -- тому, который указан в базовом типе команды (точнее тому, который возвращает UndoManager.CteateChangeCommand). Поэтому, имхо, вышеуказанный код заработает только если:
* мы его напишем на динамическом языке -- питоне, луа, и т.д.
* мы свалим в один тип(NewData) все возможные поля -- просто в кучу, или в variant record.
Одно страшней другого
Как вариант, можно написать кучу перегруженных для всех примитивов Command.SetData(XXX). Что-то типа:
- Код: Выделить всё
var newline: tline;
...
Command:=UndoManager.CteateChangeCommand(Line.end);
newline.x = новыйX;
Command.SetData(newline);