При использовании 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.
Как оказалось - ключевое слово "на форму". В случае с текстовым документом всё проходит нормально.