Seite 1 von 2
Checkbox in jedem Feld einer Tabelle
Verfasst: 27.04.2006 11:01
von dysti
Hallo,
ich möchte eine Tabelle erstellen mir Spaltenüberschriften und in der ersten Spalte eine Bezeichnung z.B. Name, in den übrigen Felder möchte ich jeweils eine Checkbox haben. Ziel z.B. Tagesanwesendheit von Schülern.
Einfach ein Klick in die Checkbox, Schüler ist da.
Wie kann ich das realisieren. Suche im Forum: irgendwie nichts gefunden.
Immer nur die erste Spalte.
Gruß
Dysti
Verfasst: 27.04.2006 11:34
von Karl
eGrid bietet soetwas an. Ist eine UserLib und findet sich bei
http://www.purebasic.fr/english/viewtop ... ight=egrid
Ist etwas aufwändiger, aber mit Standardcontrols kann man sich eine Tabelle basteln (StringGadgets und CheckBoxGadgets). Ich habe irgendwann mal so ein minimalistisches StringGrid zusammengefummelt:
Code: Alles auswählen
;Stringgrid
Enumeration
#strGrid_left
#strGrid_mid
#strGrid_right
EndEnumeration
#Zwischenraum = 1
Structure cell
id.l
wert.s
EndStructure
Global strRows.l, strColumns.l
Dim zelle.cell(0,0)
strRows = 0
strColumns = 0
Procedure.l strGrid_create(Window.l, x.l, y.l, width.l, height.l, rows.l , columns.l, align.l)
;erzeugt ein Containergadget mit einem Stringgrid (Anordnung von Stringgadgets)
Protected hstrGrid.l, i.l, j.l, hoehe.l, breite.l, flag.l, font.l
Dim zelle.cell(rows-1, columns-1)
strRows = rows
strColumns = columns
hstrGrid = ContainerGadget(#PB_Any, x, y, width, height, #PB_Container_Single)
hoehe = Int((height-(rows-1) * #Zwischenraum) / rows)
breite = Int((width-(columns-1)*#Zwischenraum) / columns)
Debug hoehe
Debug breite
Select align
Case #strGrid_left
flag = #es_left
Case #strGrid_right
flag = #es_right
Case #strGrid_mid
flag = #es_center
EndSelect
font = LoadFont(0, "Courier", 12)
For i = 0 To rows - 1
For j = 0 To columns - 1
zelle(i, j)\id = StringGadget(#PB_Any, (breite+#Zwischenraum)*j, (hoehe+#Zwischenraum)*i, breite, hoehe, "", flag)
SetGadgetFont(zelle(i, j)\id, font)
Next j
Next i
CloseGadgetList()
ProcedureReturn hstrGrid
EndProcedure
Procedure strGrid_setValue(row.l, column.l, value.s)
If (row <= strRows) And (column <= strColumns) And (row > 0) And (column > 0)
zelle(row-1, column-1)\wert = value
SetGadgetText(zelle(row-1, column-1)\id, value)
EndIf
EndProcedure
Procedure.s strGrid_getValue(row.l, column.l)
If (row <= strRows) And (column <= strColumns) And (row > 0) And (column > 0)
ProcedureReturn zelle(row-1, column-1)\wert
EndIf
EndProcedure
Procedure strGrid_lockCell(row.l, column.l, flag.l)
If (row <= strRows) And (column <= strColumns) And (row > 0) And (column > 0)
SendMessage_(GadgetID(zelle(row-1, column-1)\id), #EM_SETREADONLY, flag, 0)
EndIf
EndProcedure
Ich hoffe, du weisst was ich meine.
Gruß Karl
_______________________________________________
Whoops,
meint er, dass die Checkbox nur in der ersten Spalte stehen soll? Na dann ist dat ja geschenkt.
Gruß Karl
Verfasst: 27.04.2006 11:38
von bobobo
http://www.purebasic.fr/german/viewtopic.php?t=365
oder so?
Code: Alles auswählen
;PB 3.94
Enumeration
#Window_0
#ListIcon_0
EndEnumeration
If OpenWindow(#Window_0, 216, 0, 600, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
If CreateGadgetList(WindowID())
ListIconGadget(#ListIcon_0, 0, 0, WindowWidth(), WindowHeight(), "Anwesend", 100,#PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines)
AddGadgetColumn(#Listicon_0,1,"Vorname",50)
AddGadgetColumn(#Listicon_0,2,"Nachname",50)
EndIf
EndIf
AddGadgetItem(#ListIcon_0,-1,""+Chr(10)+"Herbert"+Chr(10)+"Meier")
AddGadgetItem(#ListIcon_0,-1,""+Chr(10)+"Fred"+Chr(10)+"Müller")
AddGadgetItem(#ListIcon_0,-1,""+Chr(10)+"Hansi"+Chr(10)+"Huber")
AddGadgetItem(#ListIcon_0,-1,""+Chr(10)+"Seppl"+Chr(10)+"Schmidt")
AddGadgetItem(#ListIcon_0,-1,""+Chr(10)+"Alois"+Chr(10)+"Alzheime")
; autmatisches Anpassen der Spaltenbreiten
For i=0 To 3
SendMessage_(GadgetID(#LIsticon_0),#LVM_SETCOLUMNWIDTH,i,#LVSCW_AUTOSIZE_USEHEADER)
Next i
Repeat
Event = WaitWindowEvent()
WindowID = EventWindowID()
GadgetID = EventGadgetID()
EventType = EventType()
If Event = #PB_EventGadget
If GadgetID = #ListIcon_0
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End
Verfasst: 27.04.2006 12:57
von dysti
Hallo Karl,
du hast das schon richtig verstanden. In der ersten Spalte der Name und dann in der Reihe ca. 31 Checkboxen. Für jeden Tag eine.
Das Beispiel von bobobo ist nicht richtig und genau andersherum.
Die Lib kann ich wohl nicht nehmen, da ich mit 4er Version arbeite.
Dein Beispiel werde ich erstmal als Grundlage nehmen.
Vielleicht entwickeln sich noch andere Ideen.
Danke erstmal.
Dysti
Verfasst: 27.04.2006 16:18
von bobobo

lesen will gelernt sein..
zur Strafe habe ich mir 'ne andere Lösung aufgebrummt
ohne ListIcon und mit PB 3.94
die schülerListe wird bei ProgrammEnde gespeichert
Code: Alles auswählen
Enumeration
#Window
#schlist
EndEnumeration
Structure schueler
Nachname.s
Vorname.s
Tage.s
EndStructure
Structure CheckBoxen
Nummer.l
Stringfeld.l
EndStructure
CopyFile("Anwesenheitsliste.schueler","Anwesenheitsliste.schueler.bak")
ReadFile(#schlist,"Anwesenheitsliste.schueler")
NewList schueler.schueler()
NewList Stringfelder.l()
NewList CheckBoxen.Checkboxen()
While Eof(#Schlist)=0
count+1
AddElement(schueler())
tmp.s=ReadString()
schueler()\Vorname = Trim (StringField(tmp,2,";"))
schueler()\Nachname= Trim (StringField(tmp,1,";"))
tmp=RemoveString(tmp,schueler()\Vorname)
tmp=RemoveString(tmp,schueler()\Nachname)
schueler()\Tage=tmp
Wend
CloseFile(#schlist)
OpenWindow(#Window,0,0,800,600,#PB_Window_Invisible|#PB_Window_SystemMenu,"Anwesenheitsliste")
CreateGadgetList(WindowID(#window))
sh.l=20
For i =0 To count-2 ;Anzahl der Schüler
SelectElement(schueler(),i)
AddElement (Stringfelder())
Stringfelder()=StringGadget(#PB_Any,0,sh*i,200,sh,schueler()\Nachname+" "+schueler()\Vorname)
cb=15
For day=1 To 32 ;Anzahl der Tage pro Monat
AddElement(Checkboxen())
CheckBoxen()\Nummer=CheckBoxGadget(#PB_Any,cb*(day+1)+200,sh*i,cb,sh,"")
CheckBoxen()\Stringfeld=Stringfelder()
If StringField(schueler()\Tage,day+2,";")="1"
SetGadgetState(checkBoxen()\Nummer,#True)
EndIf
Next day
Next i
HideWindow(#Window,0)
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
SelectElement(Checkboxen(),0)
schueleralt.s=GetGadgetText(Checkboxen()\Stringfeld)
outschueler.s+ StringField(schueleralt,1," ")+";"+StringField(schueleralt,2," ")+";"
outcb.s
outschueler.s
If CreateFile(#schlist,"Anwesenheitsliste.schueler")
SelectElement(Checkboxen(),0)
schueler.s=GetGadgetText(Checkboxen()\Stringfeld)
ForEach Checkboxen()
schueler.s=GetGadgetText(Checkboxen()\Stringfeld)
If schueleralt<>schueler
Nextschueler=1
outall.s=outschueler.s+outcb.s
outschueler.s=""
outcb.s=""
outschueler.s+ StringField(schueler,1," ")+";"+StringField(schueler,2," ")+";"
schueleralt=schueler
EndIf
If schueleralt=schueler
outcb.s+Str(GetGadgetState(Checkboxen()\Nummer))+";"
EndIf
If outall
WriteStringN(outall)
outall.s=""
EndIf
Next
WriteStringN("")
WriteStringN("")
Else
MessageRequester("schwerwiegend","Anwesenheitsliste.schueler konnte nicht gespeichert werden",#MB_ICONERROR)
EndIf
dazu gibt es folgende Liste die im ProgrammVerzeichnis
unter den Namen Anwesenheitslist.schueler zu liegen hat
(!! Die Leerzeichen am Ende sind Pflicht!)
Code: Alles auswählen
Blutwurst;Bernd
Fleissig;Fritz
Fechter;Friedolin
Guck;Gustav
Hackenschlag;Hubert
Karst;Karl
Meier;Max
Schmidt;Seppl
Vollwurst;Volker
Listig;Lisa
Faul;Frieda
Verfasst: 27.04.2006 18:36
von dysti
bobobo:
Ich bin überrascht. Leider habe ich heute keine Zeit mehr.
Werde gleich morgen früh ausprobieren. Wollte nur eben schnell antworten.
Danke.
Dysti
Verfasst: 27.04.2006 21:43
von der-sigi
Misch mich mal ein ... :)
Also ich würde zuerst mal Jahr und Monat mit einbinden. Und dann nur den aktuellen Tag mit Checkboxen ausführen, die anderen Tage als "0" und "1" schreiben. Dann ein Pfeil nach links und rechts, so daß man einen Tag zurück oder vor kann - zum korrigieren. Wenn ich dann noch mehr wollte, würde ich Attribute dazu einführen, wie "krank", "entschuldigt", "unentschudigt", etc. damit man nachher das auch noch nachvollziehen kann, wenn man die Schuljahres-Statistik produziert aus den CSV Dateien.
Nur so als kleine Hilfestellung. Das ganze dann (auch) auf dem PDA (Ups, PB kann das ja noch nicht) für mehrere Klassen und es wäre ein klasse Werkzeug.
Viele Grüße
Sigi
Verfasst: 28.04.2006 12:40
von dysti
Hallo Zusammen,
das sind Beiträge die einen weiter bringen. Ich werde alle eure Anregungen in meinem endgültigen Programm verwenden, allerdings werde ich eine Access-Datenbank verwenden, weil da gleich die Vorteile von SQL nutzen kann. Somit habe ich die Daten gleich sortiert und für weitere statistische Verarbeitung zur Verfügung. Damit stehen ein alle Wege offen.
Verfasst: 28.04.2006 12:54
von dysti
Oh Gott, werde gleich zum Kiosk gehen und ne´ Tüte Deutsch holen.
Nächtes mal besser.
Verfasst: 29.04.2006 19:38
von Karl
Access? Nimm SQLite - ist irgendwie cooler (und kann auch mehr).
Gruß Karl