PureBasic - форум

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

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


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


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

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

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


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