Checkbox in jedem Feld einer Tabelle

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Checkbox in jedem Feld einer Tabelle

Beitrag 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
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
Zuletzt geändert von Karl am 27.04.2006 11:44, insgesamt 1-mal geändert.
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

:oops: 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




‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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
der-sigi
Beiträge: 39
Registriert: 07.04.2006 12:22

Beitrag 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
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Oh Gott, werde gleich zum Kiosk gehen und ne´ Tüte Deutsch holen.
Nächtes mal besser.
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Access? Nimm SQLite - ist irgendwie cooler (und kann auch mehr). 8)

Gruß Karl
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Antworten