Страница 1 из 1

Порядок размещения контролов image в окне

Добавлено: 18 Май 2007, 17:18
Илья Пащенко
Привет всем!

Среда - CEE 6.1/ABC. Вопрос такой.

В окне описано несколько (довольно много) контролов типа картинка. Т.е. в коде окна они описаны в определённой последовательности, у них, разумеется, есть use-переменные. Контролы могут перемещаться по окну (драг-н-дропом и программно через проперти).

Если контролы накладываются друг на друга, то порядок наложения всегда соответствует порядку описани контролов в коде окна. Т.е. контрол, описанный в коде ниже, на экране в окне будет выше, будет НА контроле, описанном раньше.

А мне надо не так, мне надо в соответствии с последовательностью перемещения. Т.е. если контрол перемещён последним в какое-то место окна, то он должен быть выше любых контролов, которые там уже есть, должен перекрывать их.

Подскажет кто-нибудь что-то на эту тему? PROP:Follows не помог. :?:

Re: Порядок размещения контролов image в окне

Добавлено: 21 Май 2007, 13:31
Yufil
Илья Пащенко писал(а):Привет всем!

Среда - CEE 6.1/ABC. Вопрос такой.

А мне надо не так, мне надо в соответствии с последовательностью перемещения. Т.е. если контрол перемещён последним в какое-то место окна, то он должен быть выше любых контролов, которые там уже есть, должен перекрывать их.

Подскажет кто-нибудь что-то на эту тему? PROP:Follows не помог. :?:
Я просто создавал новый контрол в самом конце списка.
Может быть, поможет команда Clone..

Добавлено: 21 Май 2007, 15:52
Илья Пащенко
Честно говоря, решение кажется неизячным. Контролов-картинок фиксированное число, создавать/убивать контролы только ради того, чтобы помещать один поверх другого, как-то не по нутру мне... :cry:

Добавлено: 22 Май 2007, 3:59
Admin
Вот посмотри данный пример. Думаю поймешь куда дальше копать ...

Код: Выделить всё

               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

Добавлено: 22 Май 2007, 9:08
Илья Пащенко
Ага. Пасиба. Помедитирую над ним.

Добавлено: 22 Май 2007, 10:47
Admin
Делал на коленке.
Можно оптимизировать.
Но главное что работает. :)

Добавлено: 22 Май 2007, 13:47
Yufil
Илья Пащенко писал(а):Честно говоря, решение кажется неизячным. Контролов-картинок фиксированное число, создавать/убивать контролы только ради того, чтобы помещать один поверх другого, как-то не по нутру мне... :cry:
Да ничего тут такого особенного и нет. Создаёшь и убиваешь, создаёшь и убиваешь.... Если надо, например, переупорядочить по горизонтали или переупорядочить по вертикали - другого пути нет

Добавлено: 22 Май 2007, 13:50
Yufil
Admin писал(а):Вот посмотри данный пример. Думаю поймешь куда дальше копать ...
Ну и нафиг. Создал новый контрол Create(0,Create:Image), клонировал в него свойства текущего, текущий срыл - несколько строк кода...