![]() |
Abi-Rechner
Hallo,
wir haben in der Schule die Aufgabe erhalten einen Abi-Rechner(f. Sachsen-Anhalt) zu programmieren. Nur leider weiß ich nicht so recht wie ich das Anfangen soll. Das Formular mag machbar sein, aber die sich dahinter verbergenden Programmstrukturen? Hat jemand eine Idee mein Problem möglichst schnell und unkompliziert zu lösen? Danke im Voraus |
Re: Abi-Rechner
Was soll denn ein Abi-Rechner sein? :gruebel:
|
Re: Abi-Rechner
Ein Abi-Rechner ist ein Programm, welches mir den Abiturdurchschnitt durch Eingabe der Halbjahres- bzw. Prüfungsleistungen
angibt. Sorry für den späten Hinweis! |
Re: Abi-Rechner
Zitat:
|
Re: Abi-Rechner
Schreib doch noch ein bisschen genauer auf, was das Ding können soll. Wenn Du das nämlich getan hast, werden sich einige Fragen von ganz alleine Lösen. Andere können wir dann alle gemeinsam klären ;)
Sonst wird das nämlich nix, bzw. nur sowas: Zitat:
Zitat:
Zitat:
Sherlock |
Re: Abi-Rechner
Ich bin jetzt auf das erste Problem gestoßen:
Als erstes möchte ich die Wahl der Fächer ermöglichen, z.B. Englisch, Französisch und Chemie aus insgesamt 6 möglichen Profilfächern. Dazu habe ich 6 Checkboxen erstellt. Nur wie kann ich erreichen, dass das programm merkt wieviele Checkboxen angeklickt wurden um damit weiter zu arbeiten(suche eine Möglichkeit, die mir dies infach ermöglicht, da es ja nicht sein kein, dass ich alle Rutinen für jede mögliche Kombination einzeln programmieren muss). Danke im voraus. |
Re: Abi-Rechner
Das ließe sich z.B. gut in einer Bitmaske oder einer Menge abbilden. Für weitere Infos verweise ich mal auf mein
![]() |
Re: Abi-Rechner
Da find ich mich überhaupt nicht durch...
Was ind überhaupt flags? Gibt es keine andere Möglichkeit? P.S. Wie erzeuge ich eine Infobox?[lediglich ein "showmessage" mit einem "i" für info davor und mehrenen möglichen Zeilen Text] |
Re: Abi-Rechner
Ein Flag ist ein gesetztes Bit. Aber wahrscheinlich wäre es einfacher, mit einer Menge zu arbeiten. Du definierst Dir also je CheckBox eine Konstante und legst diese bei Bedarf in der Menge ab. Abfragen kannst Du dann mit dem in-Operator.
Delphi-Quellcode:
Für die "InfoBox" kannst Du <Application.>MessageBox verwenden. Schau dazu mal in die Hilfe, da sind auch die möglichen Werte für die Grafiken beschrieben.
const cb1 = 1;
cb2 = 2; cb3 = 3; //usw. var iMenge: set of Byte; begin iMenge := []; if Checkbox1.Checked then Include(iMenge,cb1); if Checkbox2.Checked then Include(iMenge,cb2); //usw. //Abfragen if cb1 in iMenge then //Behandlungsroutine für Checkbox1 |
Re: Abi-Rechner
Und wie frage ich jetzt ab, wieviele Elemnte die Menge enhält? P.S. Irgedetwas haut noch nicht hin...
|
Re: Abi-Rechner
Wozu musst Du wissen, wieviele Elemente Deine Menge enthält? Und was haut nicht hin? Genauere Infos wären schon hilfreich.
|
Re: Abi-Rechner
Es gibt ja die Möglichkeit alle 6 Boxen gleichzeiig anzuklicken, als erstes muss ich überprüfen, dass nicht mehr als 3 Boxen aktiviert sind[ich möche für 4, 5 bzw. 6 aktivierte eine nachricht ausgeben die zur Korrektr der Angabn zwingt]der Rest funktioniert dann.
|
Re: Abi-Rechner
Zähl doch einfach in einer globalen Variablen bzw. einem privaten Feld mit, wieviele Checkboxen aktiviert sind.
|
Re: Abi-Rechner
und wie? es tut mir immer leid so elementare Fragen zu stellen...
Aber unser Lehrer , so hat man immer den EIndruck, weiß garnicht wo von er spricht... |
Re: Abi-Rechner
Eine Beispielunit mit 6 Checkboxen:
Delphi-Quellcode:
unit Unit12;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; CheckBox5: TCheckBox; CheckBox6: TCheckBox; procedure RefreshCBCount(Sender: TObject); private { Private-Deklarationen } FCntCBs: Cardinal; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm12 } //Diese Methode wurde per Objektinspektor allen Checkboxen zugewiesen (OnClick) procedure TForm1.RefreshCBCount(Sender: TObject); begin if Sender is TCheckBox then begin if TCheckBox(Sender).Checked then inc(FCntCBs) else dec(FCntCBs); if FCntCBs > 3 then MessageBox(Handle,'Zuviele Checkboxen gewählt','Info',MB_OK or MB_ICONINFORMATION); end; end; end. |
Re: Abi-Rechner
Wo muss ich diese Prozedur hinzufügen?
P.S. Soll ja beim Klick eines Buttons ducrhlaufen werden! |
Re: Abi-Rechner
Kopier sie einfach in Deinen Quellcode (den Interface- und den Implementation-Teil). Und die Prüfung der Anzahl kannst Du ja ausschneiden und in Dein ButtonClick einfügen.
Zitat:
|
Re: Abi-Rechner
Und wo kommt dann der Res deiner vorigen Prozedur hin(wenn ich nur die Abfrage der Anzahl einfüge hat er die Anzahl doch noch garnich gezählt), d.h. wie weise ich allen Checkboxen diese Methode per Objektinspektor zu?
|
Re: Abi-Rechner
Markiere die Checkboxen in der IDE, wechsel im OI auf den Reiter "Ereignisse" und wähle OnClick diese Methode aus.
|
Re: Abi-Rechner
Wo schreibe ich jetzt die Prozedur hin?
Wenn ch sie einfach so im Quelltext al gliechwertige Prozedur einfüge werden verschiedene Betandteile der Prozedur rot unterstrichen und er kann nicht kompilieren! |
Re: Abi-Rechner
:glaskugel: Dann machst Du irgend etwas falsch, ich habe sie auch "frei Hand" in meinen Source geschrieben. Zur Not häng mal Deine Unit an, ich komplettiere sie dann.
|
Re: Abi-Rechner
Liste der Anhänge anzeigen (Anzahl: 1)
Alles klar!
siehe Anhang...
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus; type TForm2 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; CheckBox5: TCheckBox; CheckBox6: TCheckBox; procedure RefreshCbCount(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } FCntCBs: Cardinal; public { Public-Deklarationen } end; const cb1 = 1; cb2 = 2; cb3 = 3; cb4 = 4; cb5 = 5; cb6 = 6; var Form2: TForm2; iMenge: set of Byte; implementation uses Unit3, Unit1; {$R *.dfm} { Tform12 } procedure TForm1.RefreshCBCount(Sender: TObject); begin if Sender is TCheckBox then begin if TCheckBox(Sender).Checked then inc(FCntCBs) else dec(FCntCBs); if FCntCBs > 3 then MessageBox(Handle,'Zuviele Checkboxen gewählt','Info',MB_OK or MB_ICONINFORMATION); end; end; procedure TForm2.Button2Click(Sender: TObject); begin form2.Visible:=false; form1.visible:=true; end; procedure TForm2.Button4Click(Sender: TObject); begin form3.Visible:=true; end; procedure TForm2.Button3Click(Sender: TObject); begin iMenge:= []; if checkbox1.Checked then include(iMenge, cb1); if checkbox2.Checked then include(iMenge, cb2); if checkbox3.Checked then include(iMenge, cb3); if checkbox4.Checked then include(iMenge, cb4); if checkbox5.Checked then include(iMenge, cb5); if checkbox6.Checked then include(iMenge, cb6); if FCntCBs > 3 then MessageBox(Handle,'Zuviele Checkboxen gewählt','Info',MB_OK or MB_ICONINFORMATION); if (cb1) and (cb2) and (cb3) in iMenge then showmessage('Naturwissenschaft'); //Abfragen der Menge if (cb4) and (cb5) and (cb6) in iMenge then showmessage('Sprache'); {if cb1 and cb2 and cb4 then form4.label2.caption:= } end; end. |
Re: Abi-Rechner
Ich seh schon, was fehlt. Schreib mal in der Typdeklaration des Formulars folgene Zeile vor das "private":
Delphi-Quellcode:
Btw: Auch wenn das kompiliert wird, glaube ich, dass Du bei
procedure RefreshCBCount(Sender: TObject);
Zitat:
Schreib das lieber mal so um:
Delphi-Quellcode:
if (cb1 in iMenge) and (cb2 in iMenge) and (cb3 in iMenge) then showmessage('Naturwissenschaft');
|
Re: Abi-Rechner
Nein, das hat nicht gefhlt, hab es nur wo anders hingeschrieben...
Aber trotzdem kann es nicht kompiliert werden, bleibt immer bei der Prozedur hängen:
Delphi-Quellcode:
Im Übrigen danke für den anderen Tipp!
procedure TForm1.RefreshCBCount(Sender: TObject);
begin {usw} |
Re: Abi-Rechner
Das muss ja auch TForm2 heißen.
[edit] Was mir gerade auffällt: Deine Logik scheint etwas merkwürdig zu sein. Wieso müssen die Checkboxen 1 bis 3 alle aktiv sein, um als Naturwissenschaft zu gelten? Das Gleiche mit den anderen Checkboxen :gruebel: [/edit] |
Re: Abi-Rechner
Ja da hast du Recht, werde ich gleich korrigieren...
Noch mal ne andere Frage[klappt jetzt]: Wie kann ich die Captions von Panels während des Programmablaufs ändern?
Delphi-Quellcode:
Das klappt nicht!!!
form5.Panel5.caption:='EN'
|
Re: Abi-Rechner
Was heißt "klappt nicht"? Compilerfehler oder Laufzeitfehler? Syntaktisch ist Dein Code in Ordnung.
|
Re: Abi-Rechner
ALso kleine Korrektur den vorher gegebenen Code kompiliert er, wenn ich aber so etwas schreibe:
Delphi-Quellcode:
heißt es "Poerator ist auf diesen Operandentyp nicht anwendbar.
if (cb1 in iMenge) and (cb2 in iMenge) and (cb4 in iMenge) then (form5.Panel5.caption:='EN') and (form2.panel1.caption:='1');
|
Re: Abi-Rechner
So geht das ja auch nicht. Versuch es mal so (ein Grundlagentutorial zu lesen wäre vielleicht auch eine gute Idee):
Delphi-Quellcode:
if (cb1 in iMenge) and (cb2 in iMenge) and (cb4 in iMenge) then
begin form5.Panel5.caption:='EN'; form2.panel1.caption:='1'; end; |
Re: Abi-Rechner
und warum schriebt er bei folgendem inkompatible Typen?
Delphi-Quellcode:
Sorry mein Fehler "caption" fehlt.
if (cb1 in iMenge) and (cb2 in iMenge) and (cb4 in iMenge) then begin form5.Panel5.caption:='EN'; form5.panel6.caption:='FRZ'; form5.Panel7:='PHY'; end;
|
Re: Abi-Rechner
Zitat:
|
Re: Abi-Rechner
Delphi-Quellcode:
Warum funktionert das nicht?
edit1.Text := a;
form5.panel12.Caption:= a; edit2.Text := b; form5.panel13.caption:= b; a habe ich als string deklariert. Mekkert auch nicht beim compilieren! -->Was ich in die editbox schreibe sollte er doch in die Panelüberschrift übernehmen... |
Re: Abi-Rechner
Meintest Du das nicht eher so?
Delphi-Quellcode:
P.S.: die Namen von Komponenten kann man auch ändern, dann sieht man bei gescheiter Namensgebung gleich im Quelltext, was was ist.
form5.panel12.Caption:= edit1.Text;
form5.panel13.caption:= edit2.Text; |
Re: Abi-Rechner
Delphi-Quellcode:
Gibt es sowas? Bzw. wie kann ich realisiere, dass man mindestens ein Feld ausfüllen muss?
if edit1.Text:='' then showmessage('Bitte geben Sie ein Fach ein')
|
Re: Abi-Rechner
Für ein einziges Edit ist Dein Code schon ganz in Ordnung (Vergleiche aber mit = statt :=, das wäre sonst eine Zuweisung). Ansonsten musst Du die Bedingungen klammern.
Delphi-Quellcode:
if (Edit1.Text = '') and (Edit2.Text = '') and (Edit3.Text = '') then
ShowMessage('Was soll'' s denn nun sein?'); |
Re: Abi-Rechner
Delphi-Quellcode:
Gibt es sowas?
if (form5.Panel6.caption = 'CHE') and (form5.Panel6.color:= clblue) then
Außerdem möchte ich, da ich aus dem Bereich der Wahlpflichtfächer noch 8 weitere Notenpunkte einbringen muss, mein array sortieren um dem Programm zu ermöglichen, dass automatisch nur die besten Leistungen eingebracht werden. -->Ist das möglich??????? |
Re: Abi-Rechner
Natürlich geht so etwas. Allerdings solltest Du die Logik von der Darstellung trennen. Und zum Sortieren hat Daniel mal ein schönes Tut geschrieben, schau mal in der entsprechenden Sparte nach.
|
Re: Abi-Rechner
UNd wie wende ich den BubbleSort auf mein Array[1..3,7..12] an?
Delphi-Quellcode:
Procedure BubbleSort;
var i,j : Integer; Begin For i:= N downto 1 Do For j:= 1 To i Do If (Data[j-1] > Data[j]) Then SwapValues( j-1, j ); End; |
Re: Abi-Rechner
Du hast ja da ein 2-dimensionales Array. Nun musst Du Dir überlegen, in welcher Dimension Du das sortieren möchtest. Die Syntax ist dann dabei fast die Gleiche mit der Ausnahme, dass die 2. Dimension halt noch dazugeschrieben werden muss.
[edit] Wobei ich nun endgültig der Meinung bin, dass Du je Frage einen neuen Thread eröffnen solltest. [/edit] |
Re: Abi-Rechner
Ja ich werde bei der nächsten großen Frage einen neuen Thread eröffnen.
Aber ich habe zunächst noch zwei Fragen, wie schreibe ich die zweite Dimension dazu? Im übrigen wofür steht "data" und wohin muss ich die Prozedur schreiben? Und wie kann ich dann aus der sortierten "Liste" die 8 besten Leistungen auslesen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz