purebasic.info

PureBasic forum
Текущее время: Сб янв 20, 2018 11:48 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: Пн апр 03, 2017 2:38 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Приветствую всех.
Возможно ли сделать так, чтобы ячейки ListIconGadget заполнялись пользователем (ввод данных почти как в Excel)?

PS. Мне это для SpiderBasic вообще нужно.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 03, 2017 1:59 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
проще свой гаджет создать, чем лезть в выньапи.

Из текстгаджета создавай табличный стиль 8)

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 03, 2017 2:19 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
m0t0d0r писал(а):
проще свой гаджет создать, чем лезть в выньапи.
22vlad писал(а):
Мне это для SpiderBasic вообще нужно.
Там нет WinAPI... Вместо него JS и HTML.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 04, 2017 4:55 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
Пётр писал(а):
Там нет WinAPI... Вместо него JS и HTML.

Тогда всё те же текстовые поля в таблице, таблица сама всё равномерно располагать будет.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср апр 05, 2017 12:34 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
ListIconGadget был бы очень удобен для ввода табличных данных. Сооружать огород из большого числа StringGadget или лезть в HTML\JS не хотелось бы. :?

Тут нашел немного информации об этом:
http://forums.spiderbasic.com/viewtopic ... IconGadget


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср апр 05, 2017 5:51 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
Вчера в примерах нашёл аж четыре разные версии редактирования гаджета, все попробовал, все работают.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 10, 2017 10:57 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Можно ссылку на эти примеры?
Чего-то не получается найти рабочий пример.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 11, 2017 6:12 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
; German forum: http://www.purebasic.fr/german/archive/ ... highlight=
; Author: Lars (updated for PB 4.00 by Andre)
; Date: 07. February 2004
; OS: Windows
; Demo: Yes

; редактирует поля

If OpenWindow(0, 312, 113, 317, 216, "Realtime editing of ListIcon items", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
; If CreateGadgetList(WindowID(0))
ListIconGadget(0, 20, 20, 140, 180, "", 140,#PB_ListIcon_AlwaysShowSelection)
AddGadgetItem(0,-1,"Eintrag 1")
AddGadgetItem(0,-1,"Eintrag 2")
AddGadgetItem(0,-1,"Eintrag 3")
StringGadget(1, 170, 20, 120, 20, "")
; EndIf
EndIf

Repeat
EventID.l=WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case 0
If EventType() = #PB_EventType_LeftClick
SetGadgetText(1,GetGadgetItemText(0,GetGadgetState(0),0))
EndIf
While WindowEvent(): Wend
Case 1
SetGadgetItemText(0,GetGadgetState(0),GetGadgetText(1),0)
While WindowEvent(): Wend
EndSelect
EndSelect
Until EventID=#PB_Event_CloseWindow
CloseWindow(0)

; IDE Options = PureBasic 5.60 (Windows - x86)
; CursorPosition = 6
; Folding = --
; EnableXP
; DisableDebugger

; English forum:
; Author: El Choni (updated for PB3.92+ by Andre, updated for PB4.00 by blbltheworm)
; Date: 09. May 2003
; OS: Windows
; Demo: No


; редактирует ListIconGadget


Procedure LoWord(value)
ProcedureReturn value & $FFFF
EndProcedure

Procedure HiWord(value)
ProcedureReturn value >> 16 & $FFFF
EndProcedure

#NM_CUSTOMDRAW = #NM_FIRST-12

#CDDS_ITEM = $10000
#CDDS_SUBITEM = $20000
#CDDS_PREPAINT = $1
#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT
#CDRF_DODEFAULT = $0
#CDRF_NEWFONT = $2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYSUBITEMDRAW = $20

#LVM_SUBITEMHITTEST = #LVM_FIRST+57
#LVM_GETSUBITEMRECT = #LVM_FIRST+56

Global ListGadget, OldLViewProc, OldEditProc, hEdit, rct.RECT, CellSelectOn, CurItem, CurSubItem, CurSelItem, CurSelSubItem

Declare EditProc(hwnd, uMsg, wParam, lParam)
Declare LViewProc(hwnd, uMsg, wParam, lParam)
Declare WndProc(hwnd, uMsg, wParam, lParam)
Declare KillFocus()
Declare DrawRectangle(hwnd, *rc.RECT)

#CCM_SETVERSION = #CCM_FIRST+7

Global FontReg, FontBold
FontReg = LoadFont(1, "Tahoma", 9)
FontBold = LoadFont(2, "Tahoma", 9, #PB_Font_Bold)

If OpenWindow(0, 0, 0, 400, 260, "Color List View Rows", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)=0:End:EndIf
;If CreateGadgetList(WindowID(0))=0:End:EndIf

ListGadget = ListIconGadget(1, 10, 10, 380, 240, "", 70, #PB_ListIcon_GridLines|#LVS_NOSORTHEADER)

SendMessage_(ListGadget, #CCM_SETVERSION, 5, 0)

AddGadgetColumn(1, 1, "Sun", 35)
AddGadgetColumn(1, 2, "Mon", 35)
AddGadgetColumn(1, 3, "Tue", 35)
AddGadgetColumn(1, 4, "Wed", 35)
AddGadgetColumn(1, 5, "Thu", 35)
AddGadgetColumn(1, 6, "Fri", 35)
AddGadgetColumn(1, 7, "Sat", 35)

For i=18 To 34
hour12 = i
If hour12>25
hour12-24
Hour$ = " pm"
Else
Hour$ = " am"
EndIf
If hour12&1
Hour$=Str(hour12/2)+":30"+Hour$;LSet(Str(hour12/2)+":30"+Hour$, 9, " ")
Else
Hour$=Str(hour12/2)+":00"+Hour$;LSet(Str(hour12/2)+":00"+Hour$, 9, " ")
EndIf
AddGadgetItem(1, -1, Hour$+Chr(10)+Str(hour12/2)+"1"+Chr(10)+Str(hour12/2)+"2"+Chr(10)+Str(hour12/2)+"3"+Chr(10)+Str(hour12/2)+"4"+Chr(10)+Str(hour12/2)+"5"+Chr(10)+Str(hour12/2)+"6"+Chr(10)+Str(hour12/2)+"7")
Next i

SendMessage_(ListGadget, #LVM_SETBKCOLOR, 0, RGB(255, 255, 223))

;CreateGadgetList(ListGadget)
OldLViewProc = SetWindowLong_(ListGadget, #GWL_WNDPROC, @LViewProc())
SetWindowCallback(@WndProc())

For i=0 To 7
SendMessage_(ListGadget, #LVM_SETCOLUMNWIDTH, i, #LVSCW_AUTOSIZE_USEHEADER)
Next i

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

End

Procedure KillFocus()
If hEdit
SetGadgetItemText(1, CurItem, GetGadgetText(2), CurSubItem)
FreeGadget(2)
hEdit = 0
EndIf
EndProcedure

Procedure DrawRectangle(hwnd, *rc.RECT)
hDC = GetDC_(hwnd)
OldPen = SelectObject_(hDC, GetStockObject_(#BLACK_PEN))
OldBrush = SelectObject_(hDC, GetStockObject_(#NULL_BRUSH))
Rectangle_(hDC, *rc\left, *rc\top, *rc\right, *rc\bottom)
SelectObject_(hDC, OldBrush)
SelectObject_(hDC, OldPen)
ReleaseDC_(hwnd, hDC)
EndProcedure

Procedure EditProc(hwnd, uMsg, wParam, lParam)
result = 0
Select uMsg
Case #WM_KEYDOWN
result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam)
If wParam=#VK_RETURN
KillFocus()
EndIf
Default
result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure

Procedure LViewProc(hwnd, uMsg, wParam, lParam)
result = 0
Select uMsg
Case #WM_LBUTTONDBLCLK
If hwnd<>hEdit
KillFocus()
pInfo.LVHITTESTINFO
pInfo\pt\x = LoWord(lParam)
pInfo\pt\y = HiWord(lParam)
SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo)
rc.RECT
rc\top = pInfo\iSubItem
rc\left = #LVIR_BOUNDS
SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc)
If hEdit=0
UseGadgetList(hwnd)
CurItem = pInfo\iItem
CurSubItem = pInfo\iSubItem
Text$ = GetGadgetItemText(1, CurItem, CurSubItem)
If CurSubItem=0
rc\right = rc\left+SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0)
EndIf
hEdit = StringGadget(2, rc\left+1, rc\top, rc\right-rc\left-1, rc\bottom-rc\top-1, Text$, #PB_String_BorderLess)
If CurSubItem=0
SendMessage_(hEdit, #WM_SETFONT, FontBold, #True)
Else
SendMessage_(hEdit, #WM_SETFONT, FontReg, #True)
EndIf
OldEditProc = SetWindowLong_(hEdit, #GWL_WNDPROC, @EditProc())
SetFocus_(hEdit)
EndIf
Else
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
EndIf
Case #WM_LBUTTONDOWN
If hwnd<>hEdit
KillFocus()
pInfo.LVHITTESTINFO
pInfo\pt\x = LoWord(lParam)
pInfo\pt\y = HiWord(lParam)
SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo)
rc.RECT
rc\top = pInfo\iSubItem
rc\left = #LVIR_BOUNDS
SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc)
rc\left+1
rc\bottom-1
If CellSelectOn
InvalidateRect_(hwnd, rct, #True)
EndIf
CellSelectOn = 1
CurSelItem = pInfo\iItem
CurSelSubItem = pInfo\iSubItem
If CurSelSubItem=0
rc\right = rc\left+SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0)
EndIf
DrawRectangle(hwnd, rc)
CopyMemory(rc, rct, SizeOf(RECT))
Else
SetFocus_(hEdit)
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
EndIf
Case #WM_CTLCOLOREDIT
If GetFocus_()=lParam
SetBkMode_(wParam, #TRANSPARENT)
If CurItem&1=0
TextBkColor = RGB(255, 255, 223)
If CurSubItem=3
TextColor = RGB(255, 0, 0)
EndIf
Else
TextBkColor = RGB(208, 208, 176)
If CurSubItem=3
TextColor = RGB(0, 0, 255)
EndIf
EndIf
SetTextColor_(wParam, TextColor)
result = CreateSolidBrush_(TextBkColor)
Else
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
EndIf
Case #WM_VSCROLL
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
rc.RECT
TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
If CellSelectOn
rc\top = CurSelSubItem
rc\left = #LVIR_BOUNDS
SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc)
rct\top = rc\top
rct\bottom = rc\bottom-1
If TopVisibleItem<=CurSelItem
DrawRectangle(hwnd, rct)
EndIf
EndIf
If hEdit
If TopVisibleItem<=CurItem
ResizeGadget(2,#PB_Ignore, rc\top,#PB_Ignore,#PB_Ignore)
HideGadget(2, #False)
RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE)
Else
HideGadget(2, #True)
EndIf
SetFocus_(hEdit)
EndIf
Case #WM_HSCROLL
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
rc.RECT
TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
If CellSelectOn
rc\top = CurSelSubItem
rc\left = #LVIR_BOUNDS
SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc)
rct\left = rc\left+1
rct\right = rc\right
If TopVisibleItem<=CurSelItem
DrawRectangle(hwnd, rct)
EndIf
EndIf
If hEdit
If TopVisibleItem<=CurItem
ResizeGadget(2, rc\left,#PB_Ignore,#PB_Ignore,#PB_Ignore)
HideGadget(2, #False)
RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE)
Else
HideGadget(2, #True)
EndIf
SetFocus_(hEdit)
EndIf
Default
result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure

Procedure WndProc(hwnd, uMsg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_NOTIFY
*pnmh.NMHDR = lParam
Select *pnmh\code
Case #NM_CUSTOMDRAW
*LVCDHeader.NMLVCUSTOMDRAW = lParam
If *LVCDHeader\nmcd\hdr\hWndFrom=ListGadget
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
result = #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
result = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_SUBITEMPREPAINT
Row = *LVCDHeader\nmcd\dwItemSpec
Col = *LVCDHeader\iSubItem
If Col=0
SelectObject_(*LVCDHeader\nmcd\hDC, FontBold)
Else
SelectObject_(*LVCDHeader\nmcd\hDC, FontReg)
EndIf
If Row&1=0
*LVCDHeader\clrTextBk = RGB(255, 255, 223)
If Col=3
*LVCDHeader\clrText = RGB(255, 0, 0)
Else
*LVCDHeader\clrText = RGB(0, 0, 0)
EndIf
Else
*LVCDHeader\clrTextBk = RGB(208, 208, 176)
If Col=3
*LVCDHeader\clrText = RGB(0, 0, 255)
Else
*LVCDHeader\clrText = RGB(0, 0, 0)
EndIf
EndIf
result = #CDRF_NEWFONT
EndSelect
EndIf
EndSelect
EndSelect
ProcedureReturn result
EndProcedure


; IDE Options = PureBasic 5.60 (Windows - x86)
; CursorPosition = 9
; Folding = --------

Global editcontrol, edititem

colinfo.LV_COLUMN
colinfo\mask = #LVCF_TEXT|#LVCF_WIDTH|#LVCF_FMT
colinfo\fmt = #LVCFMT_LEFT
colinfo\cx = 195
colinfo\pszText = @"Column Header"

hwnd = OpenWindow(0,0,0,320,300, "Listview API Demo",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

Global lv=CreateWindowEx_(#WS_EX_CLIENTEDGE, "SysListView32", "MyListView", #LVS_EDITLABELS | #LVS_REPORT | #WS_CHILD | #WS_VISIBLE | #WS_HSCROLL | #WS_VSCROLL , 60,50,200,200,hwnd,0,GetModuleHandle_(0),0)
SendMessage_(lv, #LVM_INSERTCOLUMN, 0, @colinfo)

line.LV_ITEM
line\Mask = #LVIF_TEXT
For i=1 To 10
linetxt.s = "Line "+Str(i)
line\iitem = i
line\pszText = @linetxt
SendMessage_(lv, #LVM_INSERTITEM, 0, @line)
Next

Repeat
EventID=WaitWindowEvent()
Select EventID
Case #WM_LBUTTONDBLCLK
lvi.lvhittestinfo
GetCursorPos_(@lvi\pt)
GetWindowRect_(lv,@lvpos.rect)
lvi\pt\x-lvpos\left
lvi\pt\y-lvpos\top
SendMessage_(lv, #LVM_HITTEST, 0, @lvi)
edititem = lvi\iitem
editcontrol = SendMessage_(lv,#LVM_EDITLABEL,edititem,0)
Case #WM_KEYUP
If editcontrol
If EventwParam()<>#VK_RETURN
editstring.s=Space(255)
PokeW(@editstring, 255)
SendMessage_(editcontrol,#EM_GETLINE,0,@editstring)
Else
editcontrol = 0
line.LV_ITEM
line\Mask = #LVIF_TEXT
line\pszText = @editstring
SendMessage_(lv, #LVM_SETITEMTEXT, edititem, @line)
EndIf
EndIf
EndSelect
Until EventID=#PB_Event_CloseWindow

End


; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 19
; FirstLine = 13
; EnableXP

;'Edit ListIcon'.
;-----------------
; Stephen Rodriguez.
; Created with Purebasic 4.02 for Windows (date: May 2007).
; Maintained with PB 4.2.

; Platforms: Windows (tested on XP and Vista 32-bit).

; Licence: DAYLike
; (Do As You Like with it! - No Warranties!)
; A credit to myself, whilst nice, is not absolutely necessary.

;*******************************************************************************************

;NOTES.
;------
; 1) Register a listicon gadget to have editable cells by using the command SetListIconEditable(listID).
; You MUST set up such listicons to have a column zero of zero width.
; 2) Cells are made editable by intercepting double-clicks, setting the #LVS_EDITLABELS style,
; repositioning the edit control which Windows uses to edit the labels in column zero and copying
; the resulting text to the listicon cell.
; 3) Cells can also be edited by means of the command EditCell().
;*******************************************************************************************

#LVM_SUBITEMHITTEST = #LVM_FIRST+57
#LVM_GETSUBITEMRECT = #LVM_FIRST+56
#LVM_GETHEADER = #LVM_FIRST+31
#HDI_ORDER = $80
#EC_RIGHTMARGIN = 2

EnableExplicit

CompilerIf Defined(HDITEM, #PB_Structure) = 0
Structure HDITEM
mask.l
cxy.l
pszText.l
hbm.l
cchTextMax.l
fmt.l
lParam.l
iImage.l
iOrder.l
EndStructure
CompilerEndIf

Structure _LIEdit
listOldProc.l
editHwnd.l
item.l
subitem.l
x.l
y.l
cx.l
cy.l
osVersion.b
blnIsXPThemes.b
EndStructure

Structure _LIEditGlobals
osVersion.b
blnIsXPThemes.b
EndStructure

Declare.l SetListIconEditable(listID)
Declare _LIEEditCell(*liedit._LIEdit, hWnd)
Declare.l _LIEwinProc(hWnd, uMsg, wParam, lParam)
Declare.l _LIEListProc(hWnd, uMsg, wParam, lParam)
Declare.l _LIEeditProc(hWnd, uMsg, wParam, lParam)

Global _LIEditGlobals._LIEditGlobals

;Returns zero if an error.
Procedure.l SetListIconEditable(listID)
Protected result, parenthWnd, *mem._LIEdit, hWnd, dlv.DLLVERSIONINFO, func, lib
;Set globals if appropriate.
If _LIEditGlobals\osVersion = 0
_LIEditGlobals\osVersion = OSVersion()
dlv\cbSize=SizeOf(DLLVERSIONINFO)
lib=OpenLibrary(#PB_Any,"comctl32.dll")
If lib
func=GetFunction(lib,"DllGetVersion")
If func
CallFunctionFast(func, dlv)
If dlv\dwMajorVersion >=6
_LIEditGlobals\blnIsXPThemes = #True
EndIf
EndIf
CloseLibrary(lib)
EndIf
EndIf
;Check that listID references a valid listicon.
If IsGadget(listID) And GadgetType(listID)=#PB_GadgetType_ListIcon
hWnd = GadgetID(listID)
;Is the listicon already registered?
If GetProp_(hWnd, "_LIEdit")=0 ;No!
;Allocate enough memory for a _LIEdit structure.
*mem=AllocateMemory(SizeOf(_LIEdit))
If *mem
SetWindowLong_(hWnd, #GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)&~#LVS_EDITLABELS)
;Set the fields of the _LIEedit structure.
*mem\listOldProc = SetWindowLong_(hWnd, #GWL_WNDPROC, @_LIEListProc())
;Store a pointer to this structure in a window property ofthe listicon.
SetProp_(hWnd, "_LIEdit", *mem)
;Subclass the parent window if not already through another listicon.
parenthWnd=GetParent_(hWnd)
If GetProp_(parenthWnd, "_LIEditOldProc")=0 ;No!
SetProp_(parenthWnd, "_LIEditOldProc", SetWindowLong_(parenthWnd, #GWL_WNDPROC, @_LIEwinProc()))
EndIf
result=1
EndIf
EndIf
EndIf
ProcedureReturn result
EndProcedure


;Sets the specified cell to be edited.
Procedure EditCell(listID, item, subitem)
Protected hWnd, *liedit._LIEdit, numrows, numcols
;Check that listID references a valid listicon.
If IsGadget(listID) And GadgetType(listID)=#PB_GadgetType_ListIcon
;Check that the listicon is registered as editable.
hWnd = GadgetID(listID)
*liedit = GetProp_(hWnd, "_LIEdit")
If *liedit
;Check parameters are in range.
numrows = CountGadgetItems(listID)
numcols = SendMessage_(SendMessage_(hWnd,#LVM_GETHEADER,0,0), #HDM_GETITEMCOUNT,0,0)
If item>=0 And item < numrows And subitem>0 And subitem < numcols
*liedit\item = item
*liedit\subitem = subitem
SetActiveGadget(listID)
_LIEEditCell(*liedit, hWnd)
EndIf
EndIf
EndIf
EndProcedure


Procedure _LIEEditCell(*liedit._LIEdit, hWnd)
Protected rc.RECT, clientrc.RECT, numCols, headerWnd
Protected Dim cols(0), i, blnFoundZeroColumn
Protected hdi.HDITEM
;Vista themes requires a cheat because it automatically scrolls the listicon to bring the item being edited
;into view.
If _LIEditGlobals\osVersion >= #PB_OS_Windows_Vista And _LIEditGlobals\blnIsXPThemes
headerWnd = SendMessage_(hWnd,#LVM_GETHEADER,0,0)
numCols = SendMessage_(headerWnd, #HDM_GETITEMCOUNT,0,0)
Dim cols(numCols-1)
SendMessage_(hWnd, #LVM_GETCOLUMNORDERARRAY, numCols, @cols())
For i = 0 To numcols-1
If cols(i)
If cols(i) = *liedit\subItem
Break
EndIf
Else
blnFoundZeroColumn = 1
EndIf
Next
i-blnFoundZeroColumn
Dim cols(0)
With hdi
\mask = #HDI_ORDER
\iOrder = i
EndWith
SendMessage_(headerWnd, #HDM_SETITEM, 0, hdi)
EndIf
;Scroll the listicon if the clicked cell is not entirely visible
;*****IF YOU WISH TO RESTRICT WHICH CELLS CAN BE EDITED, THEN PERFORM THE NECESSARY CHECKS HERE
;*****ON THE VALUES OF *liedit\item and *liedit\subitem (WHICH INDICATE WHICH CELL IS ABOUT
;*****TO BE EDITED) AND RUN THE FOLLOWING LINES FOR THOSE CELLS WHICH ARE TO BE EDITED.
rc\top = *liedit\subitem
rc\left = #LVIR_BOUNDS
SendMessage_(hWnd, #LVM_GETSUBITEMRECT, *liedit\item, rc)
GetClientRect_(hWnd, clientrc)
If rc\left < 0 Or (rc\right-rc\left)>=clientrc\right
SendMessage_(hWnd, #LVM_SCROLL,rc\left,0)
Else
If rc\right > clientrc\right
SendMessage_(hWnd, #LVM_SCROLL,rc\right-clientrc\right,0)
EndIf
EndIf
SetWindowLong_(hWnd, #GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)|#LVS_EDITLABELS)
SendMessage_(hWnd, #LVM_EDITLABEL, *liedit\item, 0)
EndProcedure


;Window proc of the ListIcon parent window.
Procedure.l _LIEwinProc(hWnd, uMsg, wParam, lParam)
Protected result, oldwinproc, *nmh. NMHDR, listhWnd, edithWnd, *liedit._LIEdit, *lvd.LV_DISPINFO, rc.RECT
Protected hdi.HDITEM, headerWnd
Static celltext$
;Retrieve the address of the old proc.
oldwinproc = GetProp_(hWnd, "_LIEditOldProc")
Select uMsg
Case #WM_NOTIFY
*nmh=lParam
Select *nmh\code
Case #LVN_BEGINLABELEDIT
listhWnd = *nmh\hwndFrom
;Retrieve the address of the LIEdit structure.
*liedit = GetProp_(listhWnd, "_LIEdit")
If *liedit ;Good to go!
*liedit\editHwnd=0
;Get the handle of the edit control used to edit the label.
edithWnd = SendMessage_(listhWnd, #LVM_GETEDITCONTROL,0,0)
;Subclass the edit control.
SetProp_(edithWnd, "_LIEditOldProc", SetWindowLong_(edithWnd, #GWL_WNDPROC, @_LIEeditProc()))
;Set text.
celltext$=GetGadgetItemText(*nmh\idFrom, *liedit\item, *liedit\subitem)
SendMessage_(edithWnd, #WM_SETTEXT, 0, celltext$)
SetGadgetItemText(*nmh\idFrom, *liedit\item, "",*liedit\subitem)
;Get bounding rectangle.
rc\top = *liedit\subitem
rc\left = #LVIR_BOUNDS
SendMessage_(listhWnd, #LVM_GETSUBITEMRECT, *liedit\item, rc)
*liedit\x=rc\left
*liedit\y=rc\top
*liedit\cx=SendMessage_(listhWnd, #LVM_GETCOLUMNWIDTH, *liedit\subitem,0)
*liedit\cy=rc\bottom-rc\top
EndIf

Case #LVN_ENDLABELEDIT
listhWnd = *nmh\hwndFrom
;Retrieve the address of the LIEdit structure.
*liedit = GetProp_(listhWnd, "_LIEdit")
If *liedit ;Good to go!
*lvd = lParam
If *lvd\item\pszText
SetGadgetItemText(*nmh\idFrom, *liedit\item, PeekS(*lvd\item\pszText), *liedit\subitem)
Else
SetGadgetItemText(*nmh\idFrom, *liedit\item, celltext$, *liedit\subitem)
EndIf
SetWindowLong_(listhWnd, #GWL_STYLE, GetWindowLong_(listhWnd, #GWL_STYLE)&~#LVS_EDITLABELS)
If _LIEditGlobals\osVersion >= #PB_OS_Windows_Vista And _LIEditGlobals\blnIsXPThemes
With hdi
\mask = #HDI_ORDER
\iOrder = 0
EndWith
headerWnd = SendMessage_(listhWnd,#LVM_GETHEADER,0,0)
SendMessage_(headerWnd, #HDM_SETITEM, 0, hdi)
EndIf
EndIf
Default
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
EndSelect

Case #WM_NCDESTROY
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
RemoveProp_(hWnd, "_LIEditOldProc")
Default
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure


;Window proc of the ListIcon.
Procedure.l _LIEListProc(hWnd, uMsg, wParam, lParam)
Protected result, *liedit._LIEdit, PInfo.LVHITTESTINFO, *nmHEADER.HD_NOTIFY
;Retrieve the address of the LIEdit structure.
*liedit = GetProp_(hWnd, "_LIEdit")
Select uMsg
Case #WM_NOTIFY
*nmHEADER = lParam
Select *nmHEADER\hdr\code
Case #HDN_BEGINTRACK, #HDN_BEGINTRACKW ;Prevent column 0 from being resized.
If *nmHEADER\iItem=0
result=1
EndIf
Case #HDN_ENDTRACK, #HDN_ENDTRACKW
InvalidateRect_(hWnd,0,1)
Default
result=CallWindowProc_(*liedit\listOldProc, hWnd, uMsg, wParam, lParam)
EndSelect
Case #WM_LBUTTONDBLCLK
;Identify the clicked item
PInfo\pt\x = lParam&$ffff
PInfo\pt\y = (lParam>>16)&$ffff
SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, PInfo)
If PInfo\iItem <> -1 ;A valid cell was clicked.
*liedit\item = PInfo\iItem
*liedit\subitem = PInfo\iSubItem
_LIEEditCell(*liedit, hWnd)
EndIf
Case #WM_NCDESTROY
result=CallWindowProc_(*liedit\listOldProc, hWnd, uMsg, wParam, lParam)
RemoveProp_(hWnd, "_LIEdit")
FreeMemory(*liedit)
Default
result=CallWindowProc_(*liedit\listOldProc, hWnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure


;Window proc of the edit control.
Procedure.l _LIEeditProc(hWnd, uMsg, wParam, lParam)
Protected result, oldwinproc, *liedit._LIEdit, *wpos.WINDOWPOS
;Retrieve the address of the old proc.
oldwinproc = GetProp_(hWnd, "_LIEditOldProc")
;Retrieve the address of the LIEdit structure.
*liedit = GetProp_(GetParent_(hWnd), "_LIEdit")
Select uMsg
Case #WM_ERASEBKGND
;A hack in order to clear the default selection of characters.
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
If *liedit\editHwnd=0
*liedit\editHwnd = hWnd
;Set margins.
SendMessage_(hWnd, #EM_SETMARGINS, #EC_LEFTMARGIN|#EC_RIGHTMARGIN, 4)
SendMessage_(hWnd, #EM_SETSEL, -1,0)
EndIf
Case #WM_WINDOWPOSCHANGING
*wpos=lParam
*wpos\cx=*liedit\cx ;Comment this line to get an edit control which grows with the text.
*wpos\x=*liedit\x
If _LIEditGlobals\osVersion >= #PB_OS_Windows_Vista And _LIEditGlobals\blnIsXPThemes
*wpos\cy=*liedit\cy
*wpos\y=*liedit\y
Else
*wpos\cy=*liedit\cy+3
*wpos\y=*liedit\y-2
EndIf
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
Case #WM_NCDESTROY
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
RemoveProp_(hWnd, "_LIEditOldProc")
;InvalidateRect_(GetParent_(hWnd),0,0)
Default
result=CallWindowProc_(oldwinproc, hWnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure


DisableExplicit

LoadFont(1, "Arial",10)

If OpenWindow(0, 100, 100, 600, 600, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; If CreateGadgetList(WindowID(0))
ListIconGadget(1, 5, 5, 490, 390, "", 0, #PB_ListIcon_GridLines)
SetGadgetFont(1, FontID(1))
For i = 1 To 30
AddGadgetColumn(1, i, "Col "+Str(i), 100)
Next
For row = 1 To 100
AddGadgetItem(1,-1,"")
For col = 2 To 10
SetGadgetItemText(1, row-1, "row "+Str(row-1)+", col "+Str(col), col)
Next
Next

SetListIconEditable(1)
; EditCell(1, 19, 5)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
; EndIf
EndIf

; IDE Options = PureBasic 5.60 (Windows - x86)
; Folding = --------
; EnableXP


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 11, 2017 10:44 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
newJS, причти внимательно первое сообщение темы. viewtopic.php?p=87021#p87021
Особенно то что написано после PS.
И посмотри мой ответ viewtopic.php?p=87024#p87024

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 11, 2017 10:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
newJS, благодарю, это тоже пригодится.
Но мне бы для SpiderBasic подобные примеры.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB