powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как лучше запомнить текущие настройки DW ?
13 сообщений из 13, страница 1 из 1
Как лучше запомнить текущие настройки DW ?
    #32424322
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема такая : с одной программой работают разные пользователи.
У всех - свои предпочтения. Многие dw построены по типу grid , т.е. можно
менять порядок колонок , их ширину.
Как сохранить сделанные пользователем изменения в визуальном
представлении dw , чтобы потом их можно было "активировать"
при следующем запуске программы?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424388
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа того:
Код: plaintext
1.
2.
3.
4.
5.
6.
string s
//запоминаем
s = dw_1.Describe( "DataWindow.Syntax" )

//...восстанавливаем

dw_1.create(s)
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424419
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Список всех объектов - Describe("Datawindow.Objects")
У каждой колонки есть .X .Width и .Visible
Порядок можно определить отсортировав по .X
Или раскрутив DataWindow.Table.GridColumns в массив.
Применить параметры -
отключили отрисовку,
выставили всем .Visible=0
В нужном порядке выставляем каждой visible и выставляем ширину и делаем
SetPosition(column,'',True) /* это bringToFront на самом деле */

2 Марк: метод грубой силы не всегда подходит.
Что будет с этим сохраненным синтаксисом, если я добавляю, удаляю, перекрашиваю и т.п. колонки в dw???
Каждый раз при апгрейде выносить настройки пользователя?
Ну тогда это никакого смысла не имеет - у меня они и недели не пролежат ;-)

От инженеров Sybase насколько я помню Вы требовали гораздо более тщательного подхода к разработке ;-) ;-)
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424431
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за совет.
Я в раздумьях , ведь есть еще GetFullState/SetFullState.
Что лучше использовать : Datawindow.Syntax или вышеуказанные функции ?

И еще : может , можно напрямую "подменять" определения dw в pbd?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424461
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз намекаю:
как насчет несовместимости "сохраненного" синтаксиса и измененных версий DW? сомневаюсь что grid рисуется раз и навсегда и больше изменениям не подлежит.

PBD имхо - не вариант. Зачем придумывать себе приключения, когда можно обойтись стандартными Describe/Modify?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424477
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВовикЯ в раздумьях , ведь есть еще GetFullState/SetFullState.
Что лучше использовать : Datawindow.Syntax или вышеуказанные функции ?
Если просто сохранить/восстановить, то лучше вышеуказанные функции.
GuestЧто будет с этим сохраненным синтаксисом, если я добавляю, удаляю, перекрашиваю и т.п. колонки в dw???
Каждый раз при апгрейде выносить настройки пользователя?
Ну тогда это никакого смысла не имеет - у меня они и недели не пролежат ;-)
Что-то вы слишком часто меняете свои DataWindow. Удалять настройки все-же будет необходимо только у тех DataWindow, которые поменялись.
GuestОт инженеров Sybase насколько я помню Вы требовали гораздо более тщательного подхода к разработке ;-) ;-)
Я почему-то подумал, что спрашивают как быстрее запомнить, а не как лучше. А так, ваш метод более верный, и даже более того, именно его я и использую :) . А еще, при таком подходе, можно свойства прямо из программы менять, а не в DataWindow Painter'е (если написать немного кода). Полезно бывает.
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424482
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз спасибо.
Склоняюсь к варианту Describe/Modify.

Я только не совсем понял, Describe("Datawindow.Objects")
выдает все объекты со всеми их свойствами?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424496
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркА еще, при таком подходе, можно свойства прямо из программы менять, а не в DataWindow Painter'е (если написать немного кода). Полезно бывает.
А нельзя поподробнее , когда это может быть полезно?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424514
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВовикЯ только не совсем понял, Describe("Datawindow.Objects")
выдает все объекты со всеми их свойствами?
Нет, это только список наименований разделенный символом табуляции.
ВовикА нельзя поподробнее , когда это может быть полезно?
Ну, допустим, если кто-то хочет видеть зеленые заголовки, а кто-то синие.
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424541
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так все же вопрос : куда оптимальнее сохранять настойки
1) в отдельный файл на диске
2) в pbd
3) в базу
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424596
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТак все же вопрос : куда оптимальнее сохранять настойки
1) в отдельный файл на диске
2) в pbd
3) в базу
Я делалю так: сохраняю все в базу, но у меня имеется возможность загрузить/выгрузить эти настройки в файл (чтобы можно было передавать, при необходимости, между филиалами). Зато при сохранении в базу они никуда не денутся.
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32424750
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое размышление у меня возникло :
можно ли как-то сравнить определение dw в pbd и текущее состояние
dw у пользователя на экране , чтобы за один раз получить
Modify - строку , которую нужно сохранить в качестве настроек ?
...
Рейтинг: 0 / 0
Как лучше запомнить текущие настройки DW ?
    #32426602
Фотография Вовик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем выражаю огромную благодарность.
Вот , сделал работающий вариант ( с PFC ) . Настройки GRID сохраняются
в Ini-файл пользователя.

Функция сохранения настроек ( вызывается из Destructor )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
public function integer uf_save_grid_settings ();
int li_cnt,li_tot,li_rc
string ls_x,ls_width,ls_inifile,ls_value,ls_objects[],ls_rc
n_cst_string linv_string

// if grid style datawindow was not passed, then return
if this.object.datawindow.processing <>  "1 " then return - 1 
if ib_SaveLayout = false then return - 1 

ls_inifile = gnv_App.of_GetUserIniFile()
//создаем файл , если его не было
integer li_FileNum
li_FileNum = FileOpen(ls_inifile,LineMode!,Write!)
FileClose(li_FileNum)
//
// loop thru the objects on this datawindow.  For each column, text, and
// computed field, if it is visible, then save the x coordinate and width
// into the app ini file with the following settings:
//
//      section = dataobject
//      key = object name
//      value = x coordinate,width
//
ls_rc = this.Describe( "Datawindow.objects" )
li_tot = linv_string.of_parsetoarray(ls_rc, "~t" ,ls_objects)

FOR li_cnt =  1  to li_tot
  if this.Describe(ls_objects[li_cnt] +  ".visible" ) <>  "1 " then CONTINUE
  ls_rc = Lower(this.Describe(ls_objects[li_cnt] +  ".type" ))
  CHOOSE CASE ls_rc
    CASE  "column"  /*,"text"*/ , "compute" 
      ls_x = this.Describe(ls_objects[li_cnt] +  ".x" )
      ls_width = this.Describe(ls_objects[li_cnt] +  ".width" )
      ls_value = ls_x +  ","  + ls_width
		li_rc = &
SetProfileString(ls_inifile,this.dataobject,ls_objects[li_cnt],ls_value)
      if li_rc = - 1  then
        MessageBox( "SetProfileString" , "Could not save column"  + &
+  " information." ,Information!,Ok!)
      MessageBox( "dataobject" ,this.dataobject)
		MessageBox( "inifile" ,ls_inifile)
		MessageBox( "object" ,ls_objects[li_cnt])
		MessageBox( "inifile" ,ls_value)
        li_cnt = li_tot
      end if
   END CHOOSE
NEXT
return  1 

end function


Функция восстановления настроек ( вызывается из Constructor )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
public function integer uf_apply_grid_settings ();
int li_cnt,li_tot,li_pos,li_length
string ls_x,ls_width,ls_inifile,ls_value,ls_mod,ls_rc,ls_objects[]
string ls_obj,ls_invis
n_cst_inifile linv_ini
//для сортировки по x
datastore lds 
long ll_row , ll_rows , ll_cnt

ls_inifile = gnv_App.of_GetUserIniFile()

// if grid style datawindow was not passed, then return
if this.object.datawindow.processing <>  "1 " then return - 1 
if ib_SaveLayout = false then return - 1 

// get all the keys for the dataobject.  each key is the object name on the
// datawindow if the object is visible, then adjust the x coordinate and 
// width to the setting in the ini file
//
// the settings are stored in the app ini file with the following settings:
//
//      section = dataobject
//      key = column name
//      value = x coordinate,width
li_tot = linv_ini.of_GetKeys(ls_inifile,this.dataobject,ls_objects)
choose case li_tot
  case - 1 
    MessageBox( "GetKeys" , "File error. (-1 )",Information!,Ok!)
    return - 1 
  case - 2 
    //MessageBox( "GetKeys" , "INI file does not exist. (-2 )",Information!,Ok!)
    return - 1 
end choose

//создаем datastore: имя,x,w
lds = create datastore
lds.Create('release 5; datawindow() table(column=(type=' + & 
 'char(100) name=nm dbname="dummy1" ) column=(type=' + & 
  'number name=x dbname="dummy2" ) column=(type=' + & 
				'char(100) name=w dbname="dummy3" ))')

ls_mod =  ""
ls_invis = "  "
FOR li_cnt = 1  to li_tot
  ls_obj = ls_objects[li_cnt]
  if this.Describe(ls_obj + ".visible ") <> "  1  " then CONTINUE
  ls_value = ProfileString(ls_inifile,this.dataobject,ls_objects[li_cnt],"  ")
  
  // if no value found, do nothing
  if ls_value = "  " then CONTINUE
  li_pos = Pos(ls_value," , ")
  if li_pos <= 0  then CONTINUE
  ls_x = Left(ls_value,li_pos -  1 )
  li_length = Len(ls_value) - li_pos
  ls_width = Mid(ls_value,li_pos +  1 ,li_length)
  ls_invis = ls_invis + ls_obj + ".visible='0'  "
  ls_mod = ls_mod + ls_obj + " .x= " + ls_x + "   " + ls_obj &
+ " .width= " + ls_width + "   "

//запоминаем в datastore
ll_row = lds.InsertRow(0 )
lds.SetItem(ll_row,'nm',ls_obj)
lds.SetItem(ll_row,'x', Integer( ls_x ) )
lds.SetItem(ll_row,'w',ls_width)
NEXT

//скрываем все
ls_rc = this.Modify(ls_invis)

//сортируем lds по x
lds.SetSort("x A ")
lds.Sort()

//отображаем в нужном порядке и меняем ширину
ll_rows = lds.RowCount()
FOR ll_cnt = 1  to ll_rows
 ls_obj = lds.GetItemString(ll_cnt,'nm')
 ls_width = lds.GetItemString(ll_cnt,'w')
 ls_mod = ls_obj + ".visible='1'  "
 ls_mod = ls_mod + ls_obj + " .width= " + ls_width + "  "
 ls_rc = this.Modify(ls_mod)
 //SetPosition(ls_obj,'',True)
NEXT	

destroy lds

return  1 

end function
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как лучше запомнить текущие настройки DW ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]