Вы на самом деле ничего не сохраняете и не восстанавливаете.
Вы просто сохраняете указатель во внутренний TPen
объект, которым владеет Canvas
. Когда вы затем назначаете новый объект TPen
свойству Canvas->Pen
, вы вообще не обмениваетесь объектами, вы просто копируете значения свойства из объекта newpen
в объект Canvas->Pen
- тот же самый объект, который oldpen
указывает на. Затем, когда вы пытаетесь «восстановить» oldpen
, вы просто копируете значения свойств из оригинала (модифицированного) TPen
обратно в себя, что не допускается.
Чтобы сделать то, что вы пытаетесь, вам нужно сделать копию объекта Canvas->Pen
, а затем скопировать его обратно, например:
TPen *OldPen = new TPen;
OldPen->Assign(Canvas->Pen);
Canvas->Pen->Color = clPurple;
Canvas->Pen->Width = 2;
// draw with the new pen...
Canvas->Pen->Assign(OldPen);
delete OldPen;
В качестве альтернативы используйте вместо встроенной в GDI функцию сохранения + восстановления вместо:
int oldstate = ::SaveDC(Canvas->Handle);
Canvas->Pen->Color = clPurple;
Canvas->Pen->Width = 2;
// draw with the new pen...
::RestoreDC(Canvas->Handle, oldstate);