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

Помогите с Any параметрами.

Добавлено: 12 Январь 2010, 16:07
mih74
В общем, задача у меня была такая: Надо в Browse сделать List с переменным числом столбцов.
Почитал я Help, посмотрел приложенный пример и сделал такую программку:

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

  PROGRAM
  MAP
    Main
  END

Colon_NameQ   Queue, Type
NN              String(20)
              .

Que_Data      QUEUE, Type
R                 long
C                 Short
S                 String(20)
                .

StripedList   CLASS,TYPE
Init            PROCEDURE(WINDOW w, SIGNED feq)
Kill            Procedure()
VLBproc         PROCEDURE(LONG row, SHORT column),STRING,PRIVATE
Add_Q           PROCEDURE(LONG row, SHORT column, String Data)
Add_Qn          PROCEDURE(String Data)
                !Required first parameter is implicit in a CLASS method
Qn              &Colon_NameQ,PRIVATE
Q               &Que_Data,PRIVATE
ochanges        LONG,PRIVATE
Rows_Q          long,PRIVATE
              .

  CODE
  Main


StripedList.Init  PROCEDURE(WINDOW w, SIGNED feq)
  CODE

  Self.Q &= New(Que_Data)
  Self.Qn &= New(Colon_NameQ)

  Self.Rows_Q = 0
  SELF.ochanges = CHANGES(Self.Q)

 w $ feq{PROP:VLBval}  = ADDRESS(SELF)              !Это должно быть присвоено сперва
 w $ feq{PROP:VLBproc} = ADDRESS(SELF.VLBproc)      ! затем это

StripedList.Kill  Procedure()
  Code

  Clear(Self.Q)
  DISPOSE(Self.Q)

  Clear(Self.Qn)
  DISPOSE(Self.Qn)

StripedList.VLBproc PROCEDURE(LONG row, SHORT col)  !Подразумевается первый обязательный параметр

nchanges LONG
Any1     Any
Any2     Any

  CODE

  CASE row
  OF -1                    ! Сколько строк?
    RETURN SELF.Rows_Q
  OF -2                    ! Сколько колонок?
    RETURN Records(Self.Qn)  ! 1 данные, четыре поля цвета в <номинальной очереди>
  OF -3                    ! Это изменения
    nchanges = CHANGES(SELF.Q)
    IF nchanges <> SELF.ochanges THEN
      SELF.ochanges = nchanges
      RETURN 1
    ELSE
      RETURN 0
    .
  ELSE
!    Return 'R' & row & ' C' & col

    If row > SELF.Rows_Q
      Return ''
    .
    If col > RECORDS(SELF.Qn)
      Return ''
    .
    Any1 &= WHAT(Self.Q, 1)
    Any2 &= WHAT(Self.Q, 2)
    Any1 = row
    Any2 = col
    GET(SELF.Q, '+R,+C')

    RETURN What(SELF.Q, 3)
  .

StripedList.Add_Q Procedure(LONG row, SHORT column, String Data)
  Code

  Self.Q.R = row
  Self.Q.C = column
  Self.Q.S = Data
  Add(Self.Q, '+R,+C')
  Clear(Self.Q)
  If row > Self.Rows_Q
    Self.Rows_Q = row
  .

StripedList.Add_Qn Procedure(String Str)
  Code

  Self.Qn.NN = Str
  Add(Self.Qn)
  Clear(Self.Qn)

Main PROCEDURE
window WINDOW('Caption'),AT(,,279,103),STATUS,SYSTEM,GRAY,MAX,DOUBLE
       LIST,AT(5,3,271,98),USE(?List1),HVSCROLL,FORMAT('20L(2)|M')
     END
SL     StripedList
i      SIGNED
j      SIGNED
StrFormat String(1000)
KolStrok  Long(9)
KolStolbcov Short(7)

  CODE

  OPEN(window)
  SL.Init(window, ?list1)

  StrFormat = ''
  Loop i = 1 To KolStolbcov
    SL.Add_Qn('Name_' & i)
    StrFormat = Clip(StrFormat) & '35L(2)|~' & 'Name_' & i & '~C#' & i & '#'
  .

  ?List1{Prop:Format} = Clip(StrFormat)

  LOOP j = 1 TO KolStrok
    Loop i = 1 To KolStolbcov
      SL.Add_Q(j, i, 'Line ' & i & ' * ' & j)
    .
  .

  ACCEPT

  END

  SL.Kill()

 
Вроде бы работает. НО у меня здесь ЯВНО прописаны тип и размер параметров String(20). Что не очень хорошо :-(

Решил я их поменять на Any:

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

  PROGRAM
  MAP
    Main
  END

Colon_NameQ   Queue, Type
NN              Any
              .

Que_Data      QUEUE, Type
R                 long
C                 Short
S                 Any
                .

StripedList   CLASS,TYPE
Init            PROCEDURE(WINDOW w, SIGNED feq)
Kill            Procedure()
VLBproc         PROCEDURE(LONG row, SHORT column),STRING,PRIVATE
Add_Q           PROCEDURE(LONG row, SHORT column, Any Data)
Add_Qn          PROCEDURE(Any Data)
                !Required first parameter is implicit in a CLASS method
Qn              &Colon_NameQ,PRIVATE
Q               &Que_Data,PRIVATE
ochanges        LONG,PRIVATE
Rows_Q          long,PRIVATE
              .

  CODE
  Main


StripedList.Init  PROCEDURE(WINDOW w, SIGNED feq)
  CODE

  Self.Q &= New(Que_Data)
  Self.Qn &= New(Colon_NameQ)

  Self.Rows_Q = 0
  SELF.ochanges = CHANGES(Self.Q)

 w $ feq{PROP:VLBval}  = ADDRESS(SELF)              !Это должно быть присвоено сперва
 w $ feq{PROP:VLBproc} = ADDRESS(SELF.VLBproc)      ! затем это

StripedList.Kill  Procedure()
  Code

  Clear(Self.Q)
  DISPOSE(Self.Q)

  Clear(Self.Qn)
  DISPOSE(Self.Qn)

StripedList.VLBproc PROCEDURE(LONG row, SHORT col)  !Подразумевается первый обязательный параметр

nchanges LONG
Any1     Any
Any2     Any
Any3     Any
Str      String(20)

  CODE

  CASE row
  OF -1                    ! Сколько строк?
    RETURN SELF.Rows_Q
  OF -2                    ! Сколько колонок?
    RETURN Records(Self.Qn)  ! 1 данные, четыре поля цвета в <номинальной очереди>
  OF -3                    ! Это изменения
    nchanges = CHANGES(SELF.Q)
    IF nchanges <> SELF.ochanges THEN
      SELF.ochanges = nchanges
      RETURN 1
    ELSE
      RETURN 0
    .
  ELSE
!    Return 'R' & row & ' C' & col

    If row > SELF.Rows_Q
      Return ''
    .
    If col > RECORDS(SELF.Qn)
      Return ''
    .
    Any1 &= WHAT(Self.Q, 1)
    Any2 &= WHAT(Self.Q, 2)
    Any1 = row
    Any2 = col
    GET(SELF.Q, '+R,+C')

    Any3 &= What(SELF.Q, 3)
    Str = Any3
    RETURN Str
  .

StripedList.Add_Q Procedure(LONG row, SHORT column, Any Data)
  Code

  Self.Q.R = row
  Self.Q.C = column
  Self.Q.S = Data
  Add(Self.Q, '+R,+C')
  Clear(Self.Q)
  If row > Self.Rows_Q
    Self.Rows_Q = row
  .

StripedList.Add_Qn Procedure(Any Str)
  Code

  Self.Qn.NN = Str
  Add(Self.Qn)
  Clear(Self.Qn)

Main PROCEDURE
window WINDOW('Caption'),AT(,,279,103),STATUS,SYSTEM,GRAY,MAX,DOUBLE
       LIST,AT(5,3,271,98),USE(?List1),HVSCROLL,FORMAT('20L(2)|M')
     END
SL     StripedList
i      SIGNED
j      SIGNED
StrFormat String(1000)
KolStrok  Long(9)
KolStolbcov Short(7)

  CODE

  OPEN(window)
  SL.Init(window, ?list1)

  StrFormat = ''
  Loop i = 1 To KolStolbcov
    SL.Add_Qn('Name_' & i)
    StrFormat = Clip(StrFormat) & '35L(2)|~' & 'Name_' & i & '~C#' & i & '#'
  .

  ?List1{Prop:Format} = Clip(StrFormat)

  LOOP j = 1 TO KolStrok
    Loop i = 1 To KolStolbcov
      SL.Add_Q(j, i, 'Line ' & i & ' * ' & j)
    .
  .

  ACCEPT

  END

  SL.Kill()
И тут мне вышел полный облом :-(

Как НАДО это сделать ?

Re: Помогите с Any параметрами.

Добавлено: 13 Январь 2010, 7:22
StillZero
сильно не разбирался...
взял первый код, поменял в нем на ANY, и поменял строку RETURN What(SELF.Q, 3) на RETURN SELF.Q.S

или, что скорее всего тоже...вот это

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

    Any3 &= What(SELF.Q, 3)
    Str = Any3
    RETURN Str
надо поменять на RETURN SELF.Q.S

Re: Помогите с Any параметрами.

Добавлено: 13 Январь 2010, 8:52
mih74
StillZero писал(а):сильно не разбирался...
взял первый код, поменял в нем на ANY, и поменял строку RETURN What(SELF.Q, 3) на RETURN SELF.Q.S
Yes !!! Заработало !

СПАСИБО !!!!