Forum | | | | - Seite 1 - |
| Energizer | Hallo liebes Form ;), bin nun auch neu dabei und an der Arbeit mit XProfan 11.2 Free (das ist doch die aktuellste oder?)
Habe schon ein wenig herumgestöbert und dank der Hilfe vom XLehrbuch von Dietmar Horn auch schon kleinere Programme geschafft.
Nun soll ich für eine zwölfte Klasse einen Abiturrechner programmieren. Dieser soll so funktionieren, dass man alle Fächer inkl. Punkte eingibt und der Abirechner anhand div. Vorgaben (Abiprüfungsfächer werden 5-fach gewertet, bei Wahl einer Zusatzprüfung 4-fach etc.) die Endpunktzahl errechnen.
Nun bin ich am Überlegen, wie man das mit der Eingabe am besten regeln sollte. Am liebsten wäre mir ja eigentlich eine Tabelle (ähnlich Excel) in die der Anwender einfach selber Werte eingebn kann. Da ich dafür direkt nichts gefunden habe, wollte ich das ganze über einen Umweg machen, indem der Anwender in vordefinierten CheckBoxen seine Fächer auswählt und diese dann auf die Tabelle übertragen werden. Ist es dabei möglich zu definieren, wie viele Checkboxen gewählt werden dürfen?
Vielleicht kann mir jemand von euch bei der Lösung dieses Problems helfen, bzw. mir sogar eine noch bessere Lösung für die Implementierung der Userdaten in mein Programm vorschlagen.
Mfg Peter |
| | | | |
| | | | | - Seite 1 - |
| Energizer | @Thomas Freier: Danke für deine schnelle Hilfe! Deine erste Möglichkeit gefällt mir sehr gut, da werde ich mal etwas weiter rumprobieren ;)
@H.Brill: Auch deine Variante ist ähnlich der von Thomas, ich denke mal da werde ich mir was zusammenschustern ;)
1. Finde die Variante von Thomas aufgrund der Funktion zum "sperren" einer Spalte sehr gut. Mit welchem Befehl bekomme ich hier nun einen Vorgabetext hinein? Hätte mir gedacht da Vorgaben wie "LK1" etc. reinzuschreiben ... für die nicht so mit Wissen bedachten Leute ;)
Vielen Dank Leute, Ihr helft einem Anfänger wie mir wirklich sehr! ;) |
| | | | |
| | Thomas Freier | Über die Funktionen der Listview.dll beim Anlegen der Leerzeilen z.B.: KompilierenMarkierenSeparieren Ein Item mit SetItemText(H,T,S,L) . Da XProfan 11.n verwendet wird, können auch die Funktionen zu den Gridboxen verwendet werden. |
| | | | |
| | Energizer | ok also Ich habe jetzt eine Tabelle mit mehreren Spalten und zeilen, so wie ich mir das ganze wünsche ;) auch mit vorschrift in den feldern.
jetzt würde ich nur gerne eine einzelne zeile und eine einzelne spalte "schreibgeschützt" machen
z.b. für spalte 6 und zeile 12
PS: außerdem würde ich gerne die tabelle größer machen, so dass ich alle felder gleichzeitig sehe, finde leider nur ne option um das fenster zu vergrößern?
lg ;) |
| | | | |
| | Thomas Freier | Dann scheidet die Variante 1 aus. Nur über Variante 3 ist das möglich. Einfach die Bedingungen abfragen, z.B.: KompilierenMarkierenSeparieren PS. Variante 2 geht natürlich auch, wenn keine speziellen EDITs verwendet werden. |
| | | | |
| | Energizer | gut also hab jetzt probiert, spalten/zeilen schon wieder drin udn so aber wie bekomme ich jetzt mehrer zeilen oder spalten "editierfähig" ?
hab jetzt versucht in folgende zeile: KompilierenMarkierenSeparieren
IF &uwParam=1'hier nur 2.Spalte(Index =1) editieren
hinter die 1 noch 2, 3 etc zu schreiben (mit kommas für die anderen spalten) hat aber leider nicht geklappt
wie mach ich das jetzt? ;) |
| | | | |
| | | | - Seite 2 - |
| | Thomas Freier | Die Abfrage über KompilierenMarkierenSeparieren oder KompilierenMarkierenSeparieren oder KompilierenMarkierenSeparieren Minibeispiel Listview-/Gridboxgröße zum Fenster KompilierenMarkierenSeparierenSet("ErrorLevel", 2)
$H Windows.ph
$H messages.ph
DECLARE LV&,a$
SubClassproc
IF SUBCLASSMESSAGE(%HWND,~WM_SIZING) or SUBCLASSMESSAGE(%HWND,~WM_SIZE)
SETWINDOWPOS LV&=10, 30 - (Width(%HWND)-20), (Height(%HWND)-60)
SET("WinProc",0)
ENDIF
endproc
CLS
~SetClassLong(%hwnd, ~GCL_STYLE, (~GetClassLong(%hwnd, ~GCL_STYLE)- ~CS_HREDRAW - ~CS_VREDRAW))
a$ = "Links;0;180;Mitte;2;100;Rechts;1;80"
LV&=Create("GridBox", %HWND, a$, 3, 10, 30, (Width(%HWND)-20), (Height(%HWND)-60))
SUBCLASS %HWND,1
WHILE 1
WAITINPUT
ENDWHILE
END
|
| | | | |
| | Energizer | Also für die Abfrage fand ich deine erste Möglichkeit am besten, hat soweit auch geklappt doch wie mach ich das für Zeilen?
Und mit der Listboxgröße komm ich noch nicht ganz klar ...
Nach CLS fängst du ja an mit setclasslong
ab dem punkt war ja dein erstes programm ganz anders, da konnte ich dann alle tabellen ändern und jetzt steht ja hinter jedem spaltennamen zwei zahlen und die felder sind gar nicht editierbar?
ja sry ich weiß ist ne schwere geburt mit mir hier ;) |
| | | | |
| | Thomas Freier | Das war nur ein Beispiel mit der internen Gridboxfunktion wie sich die Gridbox einer Größenveränderung des Hauptfensters anpasst. Um Beispiele zum "Abiturrechner" anzupassen, müßten mehr Informationen vorliegen, z.B.: Soll es ein in der Größe unveränderbares oder veränderbares Hauptfenster werden. Erforderliche Breite der Listbox , wenn nicht horizontal gescrollt werden soll. Wieviele Zeilen sind vorgesehen. Hat das Hauptfenster eine Toolbar und/oder Statuszeile? |
| | | | |
| | Energizer | Also das Hauptfenster kann ruhig in seiner größe veränderbar sein, dass wäre mir egal und manchmal wahrscheinlich auch sehr passend
wie breit die listbox sein soll kann ich eigentlich nicht sagen, da ich die genaue breite weiß also wäre ein anpassen an das fenster sehr gut ... sollte das nicht gehen könnte ich natürlich auch die längste kombination von buchstaben, zahlen etc. die für fächer in frage kommen eingeben und dir ne pixelzahl oder so nennen
zeilen sind es 15, spalten 6
wenn du mit toolbar oben die leiste meinst wo datei speichern etc kommen soll dann ja ;)
ich werde demnächst die einzelnen unterprogramme meines abirechners zusammenfügen und dann hier mal nen beispiel posten, vllt könnt ihr euch dann besser hinein versetzen. |
| | | | |
| | H.Brill | Ich weiß jetzt nicht, ob ImportDLL schon in der Version 11.2 Free verfügbar war. Wenn ja, kann man die DLL auch ohne Includedatei (Listview_funktionen.inc) nutzen. Es fehlen halt nur die paar Procs, die in der Include zusätzlich definiert sind. Aber die kann man ja auch in seinen Quellcode kopieren. Das sähe dann so aus : KompilierenMarkierenSeparierenDeclare hd%, ende%, lvdll&, Grid&, edits$
Declare datensatz#
Declare sp1$, sp2$, sp3$, sp4$, Name$, Ort$, Strasse$, Telefon$
sp1$ = "Name"
sp2$ = "Wohnort"
sp3$ = "Strasse"
sp4$ = "Telefon"
Dim datensatz#, 20
lvdll& = Importdll("Listview.dll", "")
edits$ = "1111"' alle Spalten editierbar
hd% = @Create("Window",%HWnd,"Editieren mit rechter Maustaste",10,10,800, 300)
ende% = @Create("Button", hd%, "Ende", 20, 10, 120, 20)
Grid&=CreateListview(hd%,%hinstance,0,$ffffff,-1,$31)
' Spalten definieren
IColumn(Grid&, addr(sp1$), 220, 0)
IColumn(Grid&, addr(sp2$), 150, 0)
IColumn(Grid&, addr(sp3$), 150, 0)
IColumn(Grid&, addr(sp4$), 120, 0)
' zwei Einträge ins Listview
Name$ = "Maier"
Ort$ = "Hamburg"
Strasse$ = "Hauptstr"
Telefon$ = "4711"
Long datensatz#, 0 = Addr(Name$)
Long datensatz#, 4 = Addr(Ort$)
Long datensatz#, 8 = Addr(Strasse$)
Long datensatz#, 12 = Addr(Telefon$)
SItem(Grid&, datensatz#, 4)
Name$ = "Müller"
Ort$ = "Köln"
Strasse$ = "Rheinstr."
Telefon$ = "4712"
Long datensatz#, 0 = Addr(Name$)
Long datensatz#, 4 = Addr(Ort$)
Long datensatz#, 8 = Addr(Strasse$)
Long datensatz#, 12 = Addr(Telefon$)
SItem(Grid&, datensatz#, 4)
' Listview anzeigen u. Optionen (EnableEdits) setzen
ShowListview(Grid&, 10, 40, 600, 200)
InitMessages(hd%)' nötig wegen EnableEdits
EnableEdits(Grid&, 1+8)
SelectColumnEdits(Grid&, Addr(edits$))
WhileNot @Clicked(ende%)
WaitInput
EndWhile
Dispose datensatz#
FreeDll lvdll&
End
|
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 28.09.2013 ▲ |
| |
| | Thomas Freier |
wenn du mit toolbar oben die leiste meinst wo datei speichern etc kommen soll dann ja ;) So wie ich es sehe reicht ein Menü. Die Button einer Toolbar sind bei umfangreichen Menüs für schnelle Einklickaktionen von Vorteil. Eine Statuszeile ist geeignet eine gewählte Datei/Informationen anzuzeigen, d.h., wenn nach einer Berechnug diese gespeichert und später wieder angezeigt werden soll.
Bei der Fächerauswahl würde ich diese für DRAG&DROP anbieten. Beispiel KompilierenMarkierenSeparieren $H Windows.ph
$H messages.ph
$I Listview_Funktionen.inc
Def GetSysColor(1) !"USER32","GetSysColor"
var Font& = @CREATE("FONT","NEW TIMES ROMAN",14,0,0,0,0)
Window 930,350
WindowTitle "Abiturrechner"
SetTrueColor 1
Cls GetSysColor(15)
SetDialogFont Font&
' Menü
PopUp "Programm"
AppendMenu 109,"Ende"
PopUp "Fächer"
AppendMenu 102,"übernehmen"
AppendMenu 103,"ausblenden"
AppendMenuBar 104,"Berechnen"
AppendMenuBar 105,"Drucken"
AppendMenuBar 106,"Eingaben löschen"
' Listview
Declare lvdll&,text$,x&,y&,z&,x%,y%,z%,listview&
lvdll&=usedll("Listview.dll")
listview&=CreateListView(%hwnd,%hinstance,0,GetSysColor(24),-1,$431)
'bei +400 kann der Anwender die Spaltenbreite nicht verändern
text$="Spalte 1,Spalte 2,Spalte 3,Spalte 4,Spalte 5,Spalte 6"
SetColumnsFromMem(listview&,addr(text$),0)
SetFont listview&,Font&
Whileloop 15
SetItem listview&,str$(&loop),"","","","",""
EndWhile
SetColumnWidth(listview&,0,80)
SetColumnWidth(listview&,1,240)
SetColumnWidth(listview&,2,140)
SetColumnWidth(listview&,3,140)
SetColumnWidth(listview&,4,140)
SetColumnWidth(listview&,5,140)
ShowListView(listview&,10,10,900,270)
' damit beim Fensterverändern die Anzeige ruhiger bleibt:
~SetClassLong(%hwnd, ~GCL_STYLE, (~GetClassLong(%hwnd, ~GCL_STYLE)- ~CS_HREDRAW - ~CS_VREDRAW))
' Liste mit den Fächern
Declare Fach&, LV_F&
LV_F&=CreateListView(%hwnd,%hinstance,0,GetSysColor(24),-1,$431)
text$="Fach"
SetColumnsFromMem(LV_F&,addr(text$),0)
SetColumnWidth(LV_F&,0,80)
SetFont LV_F&,Font&
AddString(LV_F&,"Fach 1")
AddString(LV_F&,"Fach 2")
AddString(LV_F&,"Fach 3")
EnableDragDrop(listview&,1+16)
EnableDragDrop(LV_F&,1+16)
Proc FAECHEROPEN
ShowListView(listview&,10,10,(Width(%HWND)-160),270)
ShowListView(LV_F&,(Width(%HWND)-140),10,100,100)
EndProc
Proc FAECHERCLOSE
ShowListView(LV_F&,0,0,0,0)
ShowListView(listview&,10,10,(Width(%HWND)-20),270)
EndProc
' ermöglicht Aktionen beim Fensterverändern (durchbricht Waitinput)
SUBCLASS %HWND,1
InitMessages(%hwnd)
usermessages $1407, 16
While 1
waitinput
Case (%UMessage = 16) OR MenuItem(109) : BREAK
If %umessage=$1407'nach Doppellinksklick
If Getfocus(Listview&)
IF (&uwParam=2) OR (&uwParam=3) OR (&uwParam=4)
EditManual(listview&,&uwParam, &ulParam,0)'Spaltenindex, Zeilenindex (nullbasierend)
Endif
EndIf
ElseIf MenuItem(102)
FAECHEROPEN
ElseIf MenuItem(103)
FAECHERCLOSE
ElseIf MenuItem(104)
messagebox("berechnet was auch immer","Programm",32)
ElseIf MenuItem(105)
messagebox("druckt die Tabelle","Programm",32)
ElseIf MenuItem(106)'leeres Listview
DeleteAllItems(Listview&)
Whileloop 15
SetItem listview&,str$(&loop),"","","","",""
EndWhile
DeleteAllItems(LV_F&)
AddString(LV_F&,"Fach 1")
AddString(LV_F&,"Fach 2")
AddString(LV_F&,"Fach 3")
ElseIf MenuItem(15000)' Fenstergröße wurde verändet. Höhe soll bleiben
x%=%WinLeft
y%=%WinTop
z%=Width(%HWND)+8
SETWINDOWPOS %hwnd=x%,y% - z%,(270+80);0
endif
Wend
messagebox("wird beendet","Programm",32)
CloseMessages(%hwnd)
freedll lvdll&
End
SubClassproc
IF SUBCLASSMESSAGE(%HWND,~WM_SIZING) or SUBCLASSMESSAGE(%HWND,~WM_SIZE)
case ~WM_LBUTTONUP: SetMenuItem 15000' für Aktionen nach der Fenstergrößenänderung
SETWINDOWPOS Listview&=10, 10 - (Width(%HWND)-22), 270
SET("WinProc",0)
ENDIF
endproc
Soll DROP nur nach einer Spalte der Hauptliste zulässig sein, muß dieses über GetDragDropParas(B) gesteuert werden. Auch, wenn in der Fächertabelle die Faktoren zu den Fächern hinterlegt sind und diese in der Hauptliste übernommen werden sollen. |
| | | | |
| | Energizer | So erstmal danke für eure Hilfe!
Bin jetzt erstmal bis 10.10 im Urlaub, werde mich dann wieder bei euch melden
lg ;) |
| | | | |
|
AntwortenThemenoptionen | 12.876 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |