PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Самодельный гаджет


Самодельный гаджет

Сообщений 1 страница 11 из 11

1

Такой вот набросок гаджета типа ListIcon в силу своих умений.
Исходил из того, что это будет работать в связке с базой данных.
Хотелось бы замечаний, поправок, советов. И вообще, той ли дорогой иду или лисапед изобретаю?

Код:
Global m=-25, t, Dim id(0)

Procedure draw()
  CreateImage(1, 498, 26, 24, $FEFEFE)
  StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(-1, 0, 201, 26, $CCCCCC)
    Box(199, 0, 199, 26, $CCCCCC)
    Box(298, 0, 201, 26, $CCCCCC)
    Box(21, 6, 14, 14, $202020)
  StopDrawing()
EndProcedure

Procedure sel(y)
  DrawingMode(#PB_2DDrawing_XOr)
  Box(1, m+1, 496, 24, $001638)
  Box(21, m+6, 14, 14, $001638)
  Box(1, y+1, 496, 24, $001638)
  Box(21, y+6, 14, 14, $001638)
EndProcedure

Procedure met(y)
  p=Point(24, y)
  If p=16711422
    Box(24, y, 8, 8, $606060)
  ElseIf p=6316128
    Box(24, y, 8, 8, $FEFEFE) 
  EndIf
EndProcedure

Procedure met2(y,it)
  p=Point(8, y)
  If p=16711422
    Box(8, y, 8, 8, $606060)
    For k=it+1 To -id(it)+it
      Box(24, k*25+9, 8, 8, $606060)
    Next  
  ElseIf p=6316128
    Box(8, y, 8, 8, $FEFEFE)
    For k=it+1 To -id(it)+it
      Box(24, k*25+9, 8, 8, $FEFEFE)
    Next
  EndIf
EndProcedure

Procedure razm()
  SetGadgetAttribute(0, #PB_ScrollArea_InnerHeight, 28+t*25)
  SetGadgetAttribute(0, #PB_ScrollArea_InnerWidth, 481)
  ResizeGadget(1, #PB_Ignore, #PB_Ignore, #PB_Ignore, 28+t*25)
EndProcedure

Procedure group(txt.s)
  Box(5, 6+t*25, 14, 14, $202020)
  Box(6, 7+t*25, 12, 12, $FEFEFE)
  DrawText(24, 4+t*25, txt, $CC0000, $FFFFFF)
  t+1
EndProcedure  

Procedure item(s1.s,s2.s,s3.s,s4.s)
  DrawImage(ImageID(1), 0, t*25)
  DrawText(41, 4+t*25, s1)
  DrawText(206, 4+t*25, s2)
  DrawText(305, 4+t*25, s3)
  DrawText(404, 4+t*25, s4)
  t+1
EndProcedure

LoadFont(0, "Tahoma", 12)
SetGadgetFont(#PB_Default, FontID(0))
OpenWindow(0, 0, 0, 520, 374, "", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
TextGadget(10, 10, 10, 201, 25, " Нулевой столбец", #WS_BORDER)
TextGadget(11, 210, 10, 100, 25, " Первый", #WS_BORDER)
TextGadget(12, 308, 10, 101, 25, " Второй", #WS_BORDER)
TextGadget(13, 407, 10, 103, 25, " Третий", #WS_BORDER)
ScrollAreaGadget(0, 10, 34, 500, 330, 498, 326, 20, #PB_ScrollArea_Flat)
SetGadgetColor(0, #PB_Gadget_BackColor, #White)
CanvasGadget(1, 0, 0, 499, 326)
draw()

; Демонстрация
; Запрос к базе на кол-во неких групп и кол-во записей в них
; Допустим кол-во групп - 3 шт.
kg1=5 ; Кол-во записей в 1-й группе
kg2=3 ; Кол-во во 2-й
kg3=7 ; В 3-й
t=2+kg1+kg2+kg3 ; Общее кол-во задействованных строк гаджета (отсчет с нуля)
Dim id(t)     ; Массив для хранения id записи из базы данных (для связи с ней и пр.)
If t>12 : razm() : EndIf ; Изменить размер гаджета (чтобы влезло)
t=0
; Имитация заполнения
StartDrawing(CanvasOutput(1))
  DrawingFont(FontID(0))
  BackColor($FEFEFE) : FrontColor($000000)
  id(t)=-kg1 ; Кол-во записей в группе
  group("Группа номер один")
  For k=1 To kg1
    id(t)=t ; Просто имитация реального id
    item("Строка "+k,"Test "+k,Str(Random(1000,50)),Str(Random(1000,50)))
  Next
  id(t)=-kg2 : group("Группа номер два")
  For k=1 To kg2
    id(t)=t : item("Строка "+k,Str(Random(1000,50)),"Test "+k,Str(Random(1000,50)))
  Next
  id(t)=-kg3 : group("Группа номер три")
  For k=1 To kg3
    id(t)=t : item("Строка "+k,Str(Random(1000,50)),Str(Random(1000,50)),"Test "+k)
  Next
StopDrawing()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              x=GetGadgetAttribute(1, #PB_Canvas_MouseX)
              y=GetGadgetAttribute(1, #PB_Canvas_MouseY)/25
              yd=y*25
              If y<t
                StartDrawing(CanvasOutput(1))
                If id(y)>0 And (x>35 Or x<20)
                  sel(yd) : m=yd
                ElseIf x<35 And x>20
                  met(yd+9)
                ElseIf id(y)<0 And x<19
                  met2(yd+9,y)
                EndIf
                StopDrawing()
              EndIf
            Case #PB_EventType_MouseWheel
              vv=GetGadgetAttribute(0, #PB_ScrollArea_Y)-GetGadgetAttribute(1, #PB_Canvas_WheelDelta)*40
              SetGadgetAttribute(0, #PB_ScrollArea_Y, vv)
          EndSelect
      EndSelect   
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

Отредактировано Andruk (12.04.2025 12:43:59)

+1

2

Если данных будет много, то размер канваса по вертикали окажется слишком большим.
Нужно вместо ScrollAreaGadget программно прокручивать содержимое канваса.

0

3

Пётр написал(а):

Если данных будет много, то размер канваса по вертикали окажется слишком большим.

А "много" - это сколько? По моим прикидкам за одну порцию строк будет максимум 400 шт. Это как-то повлияет на прокрутку?

Вот сейчас проверил на 1000 строк - вроде нормально все...
В планах нет выводить всю базу целиком - только  выборочно по определенным критериям.

Отредактировано Andruk (12.04.2025 16:13:31)

0

4

Andruk написал(а):

Вот сейчас проверил на 1000 строк - вроде нормально все...

Попробуйте с 1300 строк.

0

5

Мда... А это связано с ограничением ScrollArea или канваса?
Да и памяти 48мб отожрало сразу...
Короче, фигня этот самодельный гаджет.

Спасибо, что уделили внимание.

Отредактировано Andruk (12.04.2025 16:55:54)

0

6

Andruk написал(а):

Короче, фигня этот самодельный гаджет.

Нет это не так.
Не нужно использовать ScrollAreaGadget, а размер канваса должен быть как сейчас у ScrollAreaGadget. Прокрутку выполнять программно высчитывая смешение при рисовании.

0

7

Спасибо, буду пробовать соображать.
Мозг как-то неважно ворочается. Есть ли тут молодежь - ребята, не ведите разгульный образ жизни - в старости пожалеете...

0

8

Расшевелю мозг - можно ли редактировать текст ячеек двойным кликом?

0

9

Можно посмотреть примеры других самодельных гаджетов чтобы было понимание как сделать прокрутку https://www.purebasic.fr/english/viewto … mp;t=71123

egons написал(а):

можно ли редактировать текст ячеек двойным кликом?

Ничего не мешает это написать. Какие возможности вложим, такие и будут.

0

10

Пётр написал(а):

чтобы было понимание как сделать прокрутку

Много неизведанного для меня. Буду изучать. (Печальный вздох)

Отредактировано Andruk (12.04.2025 23:03:52)

0

11

Решил вернуться к теме. Вот наваял как смог.
С самодельным скроллбаром возюкаться не стал - прилепил стандартный.

Код:
Global m, mt, kt, t2, Dim st.s(0), Dim id(0), Dim vd(0)

Procedure draw()  ;Рисунок сетки
  StartDrawing(CanvasOutput(1))
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(-1,0,500,51,$CCCCCC):Line(0,25,497,1,$CCCCCC)
  Box(199,25,100,26,$CCCCCC):Line(397,25,1,25,$CCCCCC)
  Box(5,6,14,14,$202020):Box(21,31,14,14,$202020)
  GrabDrawingImage(1,0,0,498,26):GrabDrawingImage(2,0,25,498,26)
  StopDrawing()
EndProcedure

Procedure sel(y)   ;Выбор строки
  DrawingMode(#PB_2DDrawing_XOr)
  Box(1, y*25+1, 496, 24, $001638)
  Box(21, y*25+6, 14, 14, $001638)
  DrawingMode(#PB_2DDrawing_Transparent)
EndProcedure

Procedure group(ty,ts)   ;Вывод группы
  DrawImage(ImageID(1), 0, ty*25)
  DrawText(24, 4+ty*25, st(ts), $CC0000)
EndProcedure

Procedure item(ty,ts)   ;Вывод строки
  DrawImage(ImageID(2), 0, ty*25)
  DrawText(41, 4+ty*25,StringField(st(ts),1,"|"))
  DrawText(206,4+ty*25,StringField(st(ts),2,"|"))
  DrawText(305,4+ty*25,StringField(st(ts),3,"|"))
  DrawText(404,4+ty*25,StringField(st(ts),4,"|"))
EndProcedure

Procedure scrol(d,h)   ;Скроллинг
  If (d=-1 And mt+12<kt) Or (d=1 And mt>0)
    StartDrawing(CanvasOutput(1)):DrawingFont(FontID(0))
    DrawingMode(#PB_2DDrawing_Transparent):FrontColor(0)
    f=Bool(d=-1)
    While k<h
      mt-d : m+d : ts=mt+12*f
      GrabDrawingImage(3, 0, f*25, 498, 300)
      DrawImage(ImageID(3), 0, 25-f*25)
      If id(ts)<0
        group(f*12,ts)
        If vd(ts):Box(8, (f*12)*25+9, 8, 8, $5F5F5F):EndIf
      Else
        item(f*12,ts)
        If vd(ts):Box(24, (f*12)*25+9, 8, 8, $5F5F5F):EndIf
        If id(ts)=1 : sel(f*12) : EndIf
      EndIf
      k+1
      If mt=kt-12 Or mt=0 : k=h : EndIf
    Wend
    StopDrawing()
  EndIf
EndProcedure

Procedure met(p,y)    ;Метка
  StartDrawing(CanvasOutput(1))
  c=vd(y)*160+95 : vd(y)=1-vd(y)
  Box(24-16*p, (y-mt)*25+9, 8, 8, RGB(c,c,c))
  If p
    For k=1 To -id(y)
      Box(24, (y-mt+k)*25+9, 8, 8, RGB(c,c,c))
      vd(y+k)=vd(y)
    Next
  EndIf
  StopDrawing() 
EndProcedure

Procedure demobaza()   ;Грубая имитация базы данных (ради примера)
  Dim kg(4):kg(1)=5:kg(2)=3:kg(3)=7:kg(4)=50   ;Кол-во строк в группах
  kt=kg(1)+kg(2)+kg(3)+kg(4)+3    ;Сумма всех строк и групп минус один)
  SetGadgetAttribute(20,#PB_ScrollBar_Maximum, kt)
  Dim st(kt):Dim id(kt):Dim vd(kt):mt=0
  For i=1 To 4
  st(s)="Группа номер "+i:id(s)=-kg(i):s+1
    For k=1 To kg(i)
      st(s)="Строка "+k+"|Test "+s+"|"+Chr(9733)+" "+k+"-hi|"+Random(1000,50)
      s+1
    Next
  Next
  StartDrawing(CanvasOutput(1)):DrawingFont(FontID(0))
  DrawingMode(#PB_2DDrawing_Transparent):FrontColor(0)
  If kt>12:k=12:Else:k=kt:HideGadget(20,1):EndIf
  For s=0 To k   ;Стартовый вывод
    If id(s)<0:group(s,s):Else:item(s,s):EndIf   
  Next
  StopDrawing()
EndProcedure

Procedure BindScroll()  ;Управление скроллбаром
  t=GetGadgetState(20)
  scrol(Sign(t2-t),Abs(t-t2))
  t2=t
EndProcedure

LoadFont(0,"Tahoma",12):SetGadgetFont(#PB_Default,FontID(0))
OpenWindow(0, 0, 0, 520, 374, "", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
FrameGadget(10, 10, 35, 500, 325, "", #PB_Frame_Flat)
TextGadget(11, 10, 10, 201, 25, " Нулевой столбец", #WS_BORDER)
TextGadget(12, 210, 10, 100, 25, " Первый", #WS_BORDER)
TextGadget(13, 308, 10, 101, 25, " Второй", #WS_BORDER)
TextGadget(14, 407, 10, 103, 25, " Третий", #WS_BORDER)
CanvasGadget(1, 11, 34, 498, 325, #PB_Canvas_Container)
ScrollBarGadget(20, 482, 0, 16, 325 , 0, 13, 13, #PB_ScrollBar_Vertical)
CloseGadgetList()

draw() : demobaza()
BindGadgetEvent(20, @ BindScroll())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              x=GetGadgetAttribute(1, #PB_Canvas_MouseX)/19
              y=GetGadgetAttribute(1, #PB_Canvas_MouseY)/25
              ym=y+mt
              If id(ym)=0 And x<>1
                StartDrawing(CanvasOutput(1))  ;Выбор строки
                sel(y) : id(ym)=1
                If id(m+mt)=1 : sel(m) : id(m+mt)=0 : EndIf
                m=y
                StopDrawing()
              EndIf
              If id(ym)>=0 And x=1   ;Метка строк
                met(0,ym)
              ElseIf id(ym)<0 And x=0  ;Метка групп
                met(1,ym)
              EndIf
            Case #PB_EventType_MouseWheel
              d=GetGadgetAttribute(1, #PB_Canvas_WheelDelta)
              scrol(d,3)    ;d-направление, 3-шаг скрола для мыши
              SetGadgetState(20, mt):t2=mt
          EndSelect
      EndSelect
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

Незначительная поправка.
И еще одна.

Отредактировано Andruk (24.04.2025 14:08:02)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Самодельный гаджет