CreateListViewItem

06/09/2011 23:44 *scarface*#1
Hey Leuts =)

habe mal wieder ne Frage.
Bin an einem Bot, bzw. eher an einem kleinen Arbeitserleichtere/abnehmer dran =)

Er soll aus 2 Inputs die Daten rauslesen und in 2 verschiedene Spalten in einem ListView packen. Nicht in eine normale Liste.
Gleichzeitig speichert er diese Werte auch in einer Ini und liest diese beim
nächsten Starten des Bottes aus und erstellt sofort die ListView einträge.

Wie kann ich nun bestimmen in welches Spalte er welchen Wert
schreiben soll und wie lese ich später nur einen der beiden werte aus?

Script:

PHP Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Ini = @ScriptDir "\Daten.ini"



$Helper GUICreate("Helper"372344192124)
GUICtrlCreateLabel("Wert1"8163317)
$Input1 GUICtrlCreateInput(""481612121)
GUICtrlCreateLabel("Wert2"200163317)
$Input2 GUICtrlCreateInput(""2401612121)
$ListView1 GUICtrlCreateListView("Wert1|Wert2"872353265)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH0200)
GUICtrlSendMsg(-1$LVM_SETCOLUMNWIDTH1200)
$Einlesen GUICtrlCreateButton("Die beiden Werte einlesen und auflisten!"84035325)
GUISetState(@SW_SHOW)

$Werte IniReadSection($Ini,"Werte")
If 
not @error Then
For $i 1 To $Werte[0][0]
    
GUICtrlCreateListViewItem($Werte[$i][0],$ListView1)
Next
EndIf

While 
1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Einlesen 
            GUICtrlCreateListViewItem
(GuiCtrlRead($Input1),$ListView1)
            
IniWrite($Ini,"Werte",GuiCtrlRead($Input1),GuiCtrlRead($Input2))
    EndSwitch
WEnd 
Liebe Grüße
Und vielen Dank *scarface*
06/09/2011 23:57 BlackHybrid#2
Schau dir mal die GuiListView.au3 an. Den Wert der einzelnen Spalten kannst du mit GUICtrlSetData(-1,|BlaBla"). Einfach mit | abtrennen.
06/10/2011 14:19 *scarface*#3
Danke, das hat mir schon weitergeholfen =)

Jedoch noch eine Frage:

PHP Code:
AdlibRegister("CheckEnable",1000)

Func CheckEnable()
    If 
GuiCtrlRead($LvlNot "" And GuiCtrlRead($KaufpreisNot "" Then
        GUICtrlSetState
($Kaufen,$GUI_ENABLE)
    Else
        
GUICtrlSetState($Kaufen,$GUI_DISABLE)
    EndIf
EndFunc 
Gibt es eine einfachere Version zu überprüfen ob ein Input gefüllt ist und wenn ja einen Button Enablen?
06/10/2011 15:27 Ludder231#4
Quote:
Originally Posted by *scarface* View Post
Danke, das hat mir schon weitergeholfen =)

Jedoch noch eine Frage:

PHP Code:
AdlibRegister("CheckEnable",1000)

Func CheckEnable()
    If 
GuiCtrlRead($LvlNot "" And GuiCtrlRead($KaufpreisNot "" Then
        GUICtrlSetState
($Kaufen,$GUI_ENABLE)
    Else
        
GUICtrlSetState($Kaufen,$GUI_DISABLE)
    EndIf
EndFunc 
Gibt es eine einfachere Version zu überprüfen ob ein Input gefüllt ist und wenn ja einen Button Enablen?
PHP Code:
Func CheckEnable()
    If 
not GuiCtrlRead($Lvl) = "" or not GuiCtrlRead($Kaufpreis) = "" Then
        GUICtrlSetState
($Kaufen,$GUI_ENABLE)
    Else
        
GUICtrlSetState($Kaufen,$GUI_DISABLE)
    EndIf
EndFunc 
06/10/2011 15:31 BlackHybrid#5
Nur blöd, dass die Funktion ohne AdlibRegister nicht aufgerufen wird.
Eine bessere Alternative wäre GUIRegisterMsg. Allerdings wüsste ich jetzt nicht, welchen Parameter man da nehmen kann.
06/10/2011 15:42 *scarface*#6
Habe mir mal eben GuiRegisterMSG angeschaut und finde mich in den Window Codes nicht zurecht^^ Wonach sollte ich suchen?

Habe auch schon nen nächstes Problem...

PHP Code:
Func CheckItem()
    
$SelectedItem _GUICtrlListView_GetSelectedIndices($ItemList,1)
    If 
not @error Then 
        GuiCtrlSetData
($Item,"")
        
GuiCtrlSetData($Item,_GUICtrlListView_GetItemText($ItemList,$SelectedItem))
    EndIf
EndFunc 
Diese Funktion rufe ich auch über Adlib auf, genau wie die "CheckEnable" Funktion.
Hierbei soll das ausgewählte Item aus dem Listview in ein Inputfeld kopiert werden sobal eins ausgewälht wurde.
Allerdings nimmt er hier immer nur das erste item...er prüft garnicht welches "selected" ist.

Vielen Dank für eure Hilfe!
Lg Scarface
06/10/2011 15:51 BlackHybrid#7
Du kannst aber das ganze auch direkt im dem Listview bearbeiten, dass du die Inputbox nicht brauchst.
06/12/2011 16:47 *scarface*#8
Wie mache ich das?

Bzw. wo muss ich dafür nach suchen?
06/12/2011 17:05 BlackHybrid#9
Kannst du mit dem Style $LVS_EDITLABELS machen. Allerdings ist der Style soweit ich weis nicht funktions tüchtig. Wenn ich nachher Zeit hab poste ich nen anderen Weg.
06/12/2011 18:24 *scarface*#10
Das wäre echt nett!

Kann ich damit dann einfach ein neues ListView Item erstllen und dann im ListView alle Daten an-/eingeben?
06/12/2011 18:27 *scarface*#11
Habe den Stil gerade mal ausprobiert.

Bei meinem Listview[5 Spalten] kann ich die erste Spalte editieren. Jedoch sobal ich Enter drücke wird es wieder in den alten Text umgewandelt.
Bischen doof...habe alle Daten im ListView in einer .ini gespeichert, dort müssten die dann auch direkt bearbeitet werden dann.

Vielen Danke =)
06/12/2011 21:41 BlackHybrid#12
So jetzt hab ich zeit :P
Ich hab grad nur ein altes script mit der UDF gefunden.
PHP Code:
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ListviewConstants.au3>
#include <GUIListView.au3>
#include <Notify_UDF.au3>

Opt("GUIOnEventMode"1)
$EditBox GUICreate(''20030, -1, -1BitOR($WS_POPUP$WS_BORDER), $WS_EX_TOPMOST)
$dummy GUICtrlCreateDummy()
Global 
$hEdit GUICtrlCreateInput(''5519020$SS_CENTER)
HotKeySet('{ESC}''_EscEdit')
Global 
$AccelKeys[1][2] = [["{ENTER}"$dummy]]
GUICtrlSetOnEvent($dummy"_EditEnter")
GUISetAccelerators($AccelKeys)
guisetstate(@sw_hide)
Global 
$hWndGlobal
Global $currentItem[2]
$main GUICreate(""300590, -1, -1$WS_SYSMENU)
GUISetOnEvent($GUI_EVENT_CLOSE"_CloseMain"$main)
Global 
$ListView1 GUICtrlCreateListView("Links                                    |Anzahl "30183 30235101)
$ListViewItem1_1 GUICtrlCreateListViewItem("Link 1|1"$ListView1)
$ListViewItem1_2 GUICtrlCreateListViewItem("Link 2|1"$ListView1)
$ListViewItem1_3 GUICtrlCreateListViewItem("Link 3|1"$ListView1)
$ListViewItem1_4 GUICtrlCreateListViewItem("Link 4|1"$ListView1)
guisetstate()
_Notify_SetNotifytoFunc($ListView1$NM_DBLCLK"_NM_DBLCLK")
_StartUp_Notify()

Func _CloseMain()
    Exit
EndFunc   ;==>_CloseMain

While 1

WEnd

Func _NM_DBLCLK
($hWndFrom$iIDFrom$iNotifyCode$wParam$lParam)

    
Local $tInfo DllStructCreate($tagNMITEMACTIVATE$lParam), $tNMHDR
    $iCode 
DllStructGetData($tNMHDR"Code")
    
Local $Info[5] = [$hWndFrom$iIDFrom$iCodeDllStructGetData($tInfo"Index"), _
            DllStructGetData
($tInfo"SubItem")]
    If 
$Info[3] = -1 Then Return
    
_GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    
Local $mouse MouseGetPos(), $posEdit WinGetPos($EditBox)
    
Local $posGUI WinGetPos($main), $posLV ControlGetPos($main''$hWndFrom)
    
Local $colInfo _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth 0$tmp
    
For $i 0 To $Info[4]
        
$tmp _GUICtrlListView_GetColumn($Info[1], $i)
        
$sumWidth += $tmp[4]
    
Next
    $sumWidth 
-= $colInfo[4]
    
Local $xPos $posGUI[0] + $posLV[0] + $sumWidth
    
If $xPos $colInfo[4] + 10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If 
$xPos 0 Then $xPos 0
    WinMove
($EditBox''$xPos$mouse[1] - $posEdit[3], $colInfo[4] + 10)
    
GUICtrlSetData($hEdit_GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    
$currentItem[0] = $Info[3]
    
$currentItem[1] = $Info[4]
    
GUISetState(@SW_SHOW$EditBox)
    Global 
$hWndGlobal $hWndFrom
EndFunc   
;==>_NM_DBLCLK

Func _EscEdit
()
    
GUISetState(@SW_HIDE$EditBox)
EndFunc   ;==>_EscEdit

Func _EditEnter
()
    
_GUICtrlListView_SetItemText($hWndGlobal$currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    
GUISetState(@SW_HIDE$EditBox)
EndFunc   ;==>_EditEnter 
Hier die UDF Notify:
06/13/2011 19:21 *scarface*#13
Wow, danke :)

Da muss ich mich jetzt erstmal zurechtfinden...

Habe noch eine letzte Bitte...
Kannst du mir ncoh erklären, wie ich überprüfe ob eines meiner gesamten ListViewItems einmal angeklickt wurde?
Daraufhin muss er dieses nämlich auslesen und in ein Input übertragen den man dort editieren kann. So wie ich das gemacht habe, liest er pausenlos welches Item selected ist, und da er dann andauernd den Input aktualisiert, kann man den nicht editieren :D

Danke =)
06/13/2011 19:26 BlackHybrid#14
Wieso willst du den wo anders editieren? Bei dem was ich dir gepostet hab kannst du das direkt über doppelklick bearbeiten. Einfach die UDF in den Include Ordner und los gehts.
Eine bessere und gut aussehendere Lösung gibt es meiner Meinung nicht^^
06/15/2011 16:33 *scarface*#15
Das stimmt, jedoch brauche ich die daten von einem der ListView Items und die muss ich damit das übersichtlicher wird in einem Input bearbeiten...

Hast du vll Icq oder skype?
Dann kann ich dir mal mein Skript schicken bzw. du hast es einfacher mir zu helfen^^
=)