Такой вот набросок гаджета типа 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)