При использовании ABF столкнулся с багом:
Создаю форму. Бросаю ABF-объект. Задаю в свойствахпуть к картинке. Пытаюсь сохранить - получаю тряп:
Код:
TRAP 21 (precondition violated)
Stores.Join [00003067H]
.d0 Stores.Domain NIL
.d1 Stores.Domain NIL
.s0 Stores.Store [019597C0H]
.s1 Stores.Store NIL
AbfProperties.SaveList [00000614H]
.aliens AbfProperties.Alien NIL
.list Properties.Property [01959340H]
.s AbfProperties.Store [019597C0H]
.sa Stores.Alien NIL
.wr Stores.Writer fields
AbfMedia.StdView.Externalize [00001B58H]
.msg Properties.PollMsg fields
.props Properties.Property NIL
.rd Files.Reader NIL
.v AbfMedia.StdView [018C3FD0H]
.wr Stores.Writer fields
Stores.Writer.WriteStore [00002C5DH]
.pos INTEGER 382
.pos1 INTEGER 433
.pos2 INTEGER 441
.save Stores.WriterState fields
.t POINTER [647C06B4H]
.wr Stores.Writer fields
.x Stores.Store [018C3FD0H]
Views.WriteView [00001117H]
.a Views.TrapAlien NIL
.av Views.View [018BCD70H]
.op INTEGER 3
.v Views.View [018C3FD0H]
.wr Stores.Writer fields
FormModels.StdModel.Externalize [000002E0H]
.c FormModels.StdContext [01AD0DE0H]
.f FormModels.StdModel [01AA3EC0H]
.wr Stores.Writer fields
Stores.Writer.WriteStore [00002C5DH]
.pos INTEGER 307
.pos1 INTEGER 364
.pos2 INTEGER 372
.save Stores.WriterState fields
.t POINTER [645401B8H]
.wr Stores.Writer fields
.x Stores.Store [01AA3EC0H]
Containers.View.Externalize [000002FAH]
.v Containers.View [018BCD70H]
.wr Stores.Writer fields
Stores.Writer.WriteStore [00002C5DH]
.pos INTEGER 239
.pos1 INTEGER 292
.pos2 INTEGER 300
.save Stores.WriterState fields
.t POINTER [64560164H]
.wr Stores.Writer fields
.x Stores.Store [018BCD70H]
Views.WriteView [00001117H]
.a Views.TrapAlien NIL
.av Views.View NIL
.op INTEGER 3
.v Views.View [018BCD70H]
.wr Stores.Writer fields
Documents.Model.Externalize [00000CCAH]
.m Documents.Model [018B3EE0H]
.wr Stores.Writer fields
Stores.Writer.WriteStore [00002C5DH]
.pos INTEGER 134
.pos1 INTEGER 222
.pos2 INTEGER 230
.save Stores.WriterState fields
.t POINTER [625D03F0H]
.wr Stores.Writer fields
.x Stores.Store [018B3EE0H]
Containers.View.Externalize [000002FAH]
.v Containers.View [018B3F20H]
.wr Stores.Writer fields
Stores.Writer.WriteStore [00002C5DH]
.pos INTEGER 4
.pos1 INTEGER 119
.pos2 INTEGER 127
.save Stores.WriterState fields
.t POINTER [625D01E4H]
.wr Stores.Writer fields
.x Stores.Store [018B3F20H]
Documents.ExportDocument [0000370EH]
.f Files.File [019577D0H]
.s Stores.Store [018BCD70H]
.v Views.View [018B3F20H]
.w Stores.Writer fields
Converters.Export [0000042FH]
.conv Converters.Converter [01999D10H]
.file Files.File [019577D0H]
.loc Files.Locator [019575B0H]
.name Files.Name "untitled.odc" ...
.ok BOOLEAN TRUE
.res INTEGER 642
.s Stores.Store [018BCD70H]
.val Converters.ExpVal fields
HostCmds.SaveWindow [00000434H]
.conv Converters.Converter [01999D10H]
.i INTEGER 1643249680
.loc Files.Locator [019575B0H]
.name Files.Name "untitled.odc" ...
.rename BOOLEAN TRUE
.stat BOOLEAN FALSE
.title Views.Title 1X ...
.v Views.View [018BCD70H]
.w Windows.Window [018BD840H]
HostCmds.Save [000005A7H]
.w Windows.Window [018BD840H]
При дальнейших попытках обнаружил, что если объект положить уже после, например, кнопки, то сохранение проходит нормально. В итоге получилось, что сохранение глючит только тогда, когда ABF-объекта первый на форме. По тряпу локализовал подозрительное место модуля AbfProperties:
Код:
PROCEDURE SaveList* (VAR wr: Stores.Writer; list: Properties.Property; aliens: Alien);
VAR s: Store;
sa: Stores.Alien;
BEGIN
WHILE list # NIL DO
NEW(s);
s.prop := list;
Meta.GetItem(s.prop, s.item);
GetProcs(s.item, s.procs);
IF (s.procs.int # NIL) & (s.procs.ext # NIL) & (s.procs.dir # NIL) THEN
Stores.Join(s, wr.writtenStore); (** ВОТ здесь, wr.writtenStore = NIL всегда, когда проявляется ошибка **)
wr.WriteStore(s)
END;
list := list.next
END;
WHILE aliens # NIL DO
sa := Stores.CopyOf(aliens.store)(Stores.Alien);
Stores.Join(sa, wr.writtenStore);
wr.WriteStore(sa);
aliens := aliens.next
END;
wr.WriteStore(NIL)
END SaveList;
Я не силён в Stores пока (пока). Прошу помощи.
UPD.
Как оказалось - ключевое слово "на форму". В случае с текстовым документом всё проходит нормально.