Вот посмотри данный пример. Думаю поймешь куда дальше копать ...
Код: Выделить всё
               PROGRAM
               MAP
               END
MaxID          EQUATE(9999)
TImagesList    QUEUE,TYPE
ImageID          LONG
ImageLevel       LONG
ImageFEQ         LONG
               END
ImagesArray    CLASS
ImagesList       &TImagesList
LastID           LONG
Construct        PROCEDURE
Destruct         PROCEDURE
Add              PROCEDURE(LONG FEQ),LONG,PROC
ToTop            PROCEDURE(LONG ID)
               END
Window WINDOW('ImagesArray class'),AT(,,231,97),FONT('MS Sans Serif',8,,FONT:regular),CENTER,GRAY,RESIZE
       IMAGE('1.gif'),AT(27,12),USE(?Image1)
       IMAGE('2.gif'),AT(24,30),USE(?Image2)
       IMAGE('3.gif'),AT(45,21),USE(?Image3)
       IMAGE('4.gif'),AT(39,36),USE(?Image4)
       BUTTON('1 вверх на одну позицию'),AT(108,18,98,14),USE(?Button1)
       BUTTON('2 вверх на одну позицию'),AT(108,33,98,14),USE(?Button2)
       BUTTON('3 вверх на одну позицию'),AT(108,48,98,14),USE(?Button3)
       BUTTON('4 вверх на одну позицию'),AT(108,63,98,14),USE(?Button4)
     END
IA             ImagesArray
  CODE
  OPEN(Window)
  Window{PROP:Buffer} = 1
  IA.Add(?Image1)
  IA.Add(?Image2)
  IA.Add(?Image3)
  IA.Add(?Image4)
  ACCEPT
    CASE ACCEPTED()
    OF ?Button1
      IA.ToTop(1)
    OF ?Button2
      IA.ToTop(2)
    OF ?Button3
      IA.ToTop(3)
    OF ?Button4
      IA.ToTop(4)
    END
  END
  CLOSE(Window)
ImagesArray.Construct     PROCEDURE
  CODE
  SELF.ImagesList &= NEW TImagesList
  SELF.LastID = 0
ImagesArray.Destruct      PROCEDURE
  CODE
  FREE(SELF.ImagesList)
  DISPOSE(SELF.ImagesList)
ImagesArray.Add           PROCEDURE(LONG FEQ)
  CODE
  SELF.LastID += 1
  SELF.ImagesList.ImageID    = SELF.LastID
  SELF.ImagesList.ImageLevel = FEQ
  SELF.ImagesList.ImageFEQ   = FEQ
  ADD(SELF.ImagesList)
  RETURN SELF.LastID
ImagesArray.ToTop         PROCEDURE(LONG ID)
ImageName1                STRING(255)
ImageName2                STRING(255)
ImageFEQ                  LONG
ImageLevel                LONG
ImageID1                  LONG
ImageID2                  LONG
Found                     BYTE
HighLevel                 LONG
  CODE
  SELF.ImagesList.ImageID = ID
  GET(SELF.ImagesList,SELF.ImagesList.ImageID)
  IF NOT ERRORCODE()
    ImageFEQ    = SELF.ImagesList.ImageFEQ
    ImageLevel  = SELF.ImagesList.ImageLevel
    ImageID1    = SELF.ImagesList.ImageID
    SELF.ImagesList.ImageID = MaxID
    PUT(SELF.ImagesList)
    GETPOSITION(ImageFEQ,X#,Y#,W#,H#)
    ImageName1 = ImageFEQ{PROP:Text}
    LOOP E# = 1 TO RECORDS(SELF.ImagesList)
    GET(SELF.ImagesList,E#)
      IF (ImageLevel+1) = SELF.ImagesList.ImageLevel
        Found = TRUE
        BREAK
      END
    END
    IF Found = TRUE
      GETPOSITION(SELF.ImagesList.ImageFEQ,X1#,Y1#,W1#,H1#)
      ImageName2 = SELF.ImagesList.ImageFEQ{PROP:Text}
      SETPOSITION(SELF.ImagesList.ImageFEQ,X#,Y#,W#,H#)
      SELF.ImagesList.ImageFEQ{PROP:Text} = ImageName1
      SETPOSITION(ImageFEQ,X1#,Y1#,W1#,H1#)
      ImageFEQ{PROP:Text} = ImageName2
      ImageID2 = SELF.ImagesList.ImageID
      SELF.ImagesList.ImageID = ImageID1
      PUT(SELF.ImagesList)
      SELF.ImagesList.ImageID = MaxID
      GET(SELF.ImagesList,SELF.ImagesList.ImageID)
      SELF.ImagesList.ImageID = ImageID2
      PUT(SELF.ImagesList)
    ELSE
      SELF.ImagesList.ImageID = MaxID
      GET(SELF.ImagesList,SELF.ImagesList.ImageID)
      SELF.ImagesList.ImageID = ImageID1
      PUT(SELF.ImagesList)
    END
  END