Autor |
Beitrag |
Schuldelphi Nutzer
      
Beiträge: 20
|
Verfasst: So 04.01.09 18:23
Hallo,
ich muss einen Taschenrechner mit den Grundfunktionen ( + - / * ) und den Zahlen 0 - 9 erstellen.
Soweit erstmal kein Problem, ich werd mich mit Hilfe der Suche etc. mal weiter einlesen. Nun aber mein Problem:
Die Aufgabe ist spezieller gestellt: Alles soll in eine Prozedur geschrieben sein.
Aber ich brauch doch mindestens 2, oder kann ich alles in Formcreate schreiben?
Tut mir leid,
ich bin wohl das, was man nen Delphi Noob nennt.
Hoffe ihr könnt mir helfen 
Zuletzt bearbeitet von Schuldelphi Nutzer am Mo 05.01.09 13:18, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.01.09 18:31
Du brauchst ja nur eine Methode, der du die aktuelle Eingabe übergibst. Dort kannst du dann alles verarbeiten. D.h. egal ob von OnKeyPress im Edit oder die Eingaben durch die Buttons, das kann alles dort landen. Wenn beide Eingabemöglichkeiten möglich sein sollen, müssen die Ereignisbehandlungen aber schon zwei Prozeduren sein.
Wie das genau gemeint ist, ist dann die Frage. Also wie der Rechner aussehen soll, etc.
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 13:30
Sooo..
Also ich hab mir nun mal mehrere Taschenrechner Codes im Internet angeschaut.
Aber ich bin ganz ehrlich, ich verstehe fast garnichts. Deswegen werd ich Informatik auch bald abwählen :s
Ich häng mal dran, wie es ausschauen soll. Vielleicht hat ja jemand die Zeit, mir mal Schritt für Schritt zu helfen (ICQ oder so vllt / Teamviewer).
Ich hab nochmal nachgefragt, was diese Bedingung war:
Ein Mitschüler sagt "wir müssen alles in eine funktion machen, nich einzelne buttonklicks"
& vom anderen Mitschüler " alles unter eine prozedur | also abfrage | du musst ne abfrage machen welche tste gedrückt wurde und bla"
nun bevor ihr denkt die können mir helfen, dem ist leider nicht so. Ich erreich sie nicht -.-
Grüße in der Hoffnung auf Hilfe.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 13:37
Dann kannst du ja alles z.B. in OnKeyPress machen und nur ein Editfeld benutzen.
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 13:40
Hm, ich denke mal, so ist das auch gemacht.
Aber ich versteh ehrlichgesagt nicht, wie genau ich das anstellen soll. Ich müsste doch quasi für jede Taste festlegen was passiert. Aber bei onkeypressed gilt das doch nur für eine taste, oder?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 13:43
OnKeyPress sagt dir, dass eine Taste gedrückt wurde. Du musst dann abfragen welche und entsprechend reagieren.
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 13:50
okay, also ich hab nun eine prozedur onkeypressed über die Form 1 gestartet.
Nächstes Problem währe dann: 1. müsste ich wissen, wie man es anstellt, dass nur zahlen akzeptiert werden und 2., wie man überhaupt abfragt, was gedrückt wurde. Bin gerade auch mal auf der suche in der online hilfe.
ach übrigens arbeite ich noch mit delphi 6... also bissl älter.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 13:53
Schau dir mal die Parameter an, die du übergeben bekommst. Da bekommst du den gerade gedrückten Buchstaben geliefert.
Und nur Zahlen geht ja nicht, du musst ja auch Operatoren akzeptieren, Komma, evtl. auch Backspace, evtl. Escape zum Start einer neuen Rechnung, usw.
Delphi 6 war ja nicht schlecht. Auch wenn es auch eine neue Version kostenlos gibt. (Aber die sieht etwas anders aus, deshalb ist es schon besser, wenn du die Version benutzt, die ihr auch in der Schule habt.)
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 13:56
jaenicke hat folgendes geschrieben : | Schau dir mal die Parameter an, die du übergeben bekommst. Da bekommst du den gerade gedrückten Buchstaben geliefert.
|
Parameter? Also entweder ich hab im Unterricht nicht aufgepasst, oder ich kann nicht wissen, was du damit meinst  Oh man das ist ja schon peinlich, wie wenig ich weiß..
Zitat: |
Und nur Zahlen geht ja nicht, du musst ja auch Operatoren akzeptieren, Komma, evtl. auch Backspace, evtl. Escape zum Start einer neuen Rechnung, usw.
Delphi 6 ist ja nicht schlecht. Auch wenn es auch eine neue Version kostenlos gibt.
|
Stimmt. Also müsste ich nur Die Buchstaben ausschließen.
Hm Delphi 6 ist ansich auch ganz gut, nur denke ich mal, dass in neueren Versionen die interne Hilfe auch besser ist 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 14:08
Schuldelphi Nutzer hat folgendes geschrieben : | Parameter? Also entweder ich hab im Unterricht nicht aufgepasst, oder ich kann nicht wissen, was du damit meinst Oh man das ist ja schon peinlich, wie wenig ich weiß.. |
Schau dir mal den Crashkurs an:
crashkurs.christian-stelzmann.de
Wenn du eine solche Prozedur hast: Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin
end; | Dann ist Sender ein Parameter.
Und bei OnKeyPress steht da u.a. die gedrückte Taste.
Hier steht dazu auch etwas:
www.delphi-treff.de/...uren-und-funktionen/
Schuldelphi Nutzer hat folgendes geschrieben : | Stimmt. Also müsste ich nur Die Buchstaben ausschließen. |
Das musst du nicht ausschließen. Du behandelst einfach nur Tasten, die du möchtest, und alle anderen lässt du nicht durchkommen.
Schuldelphi Nutzer hat folgendes geschrieben : | Hm Delphi 6 ist ansich auch ganz gut, nur denke ich mal, dass in neueren Versionen die interne Hilfe auch besser ist  |
Das sehen manche so, manche so. Ich finde die neue Hilfe recht übersichtlich.
Du kannst auch einfach beide Versionen installieren, also Delphi 6 installiert lassen. Dann kannst du beides ausprobieren.
Wo es die neue Version gibt, wie du sie installierst, etc. habe ich hier beschrieben:
www.delphi-library.d...ewtopic.php?p=539975
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 14:21
Puh, warum muss das nur so kompliziert sein..
Also währe der Parameter auf den du hinauswillst warscheinlich "char", nicht wahr?
Es tut mir echt leid, aber ich check einfach nie, was ich machen muss  .
Komisch ist halt, dass es 3/4 des Kurses so geht..
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 14:29
Wenn du z.B. im Objektinspektor OnKeyPress anklickst und F1 drückst, dann kommst du zur Hilfe... Zitat: | Use the OnKeyPress event handler to make something happen as a result of a single character key press.
The Key parameter in the OnKeyPress event handler is of type Char; therefore, the OnKeyPress event registers the ASCII character of the key pressed. Keys that don't correspond to an ASCII Char value (Shift or F1, for example) don't generate an OnKeyPress event.
... |
In der alten Hilfe bis Delphi 7 gibt es auch ein Beispiel.
In der neuen nicht, dort wird es dafür noch ausführlicher erklärt.
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Mo 05.01.09 15:03
Ich gebs auf. Das ist nun das Xte Projekt mit dem ich nicht klarkomme
Muss wohl oder übel abwählen. Und wenn ich das nun nicht hinbekomm kann ich damit rechnen ne richtig miese Note aufm Zeugnis zu haben.
Kann mir vllt irgendjemand mehr oder weniger "vorsagen" was ich machen muss? Bin ganz ehrlich, der Lerneffekt ist bei mir fehl am Platz, ist anscheinend nicht mein Ding!
Ich dachte damals programmieren etc. ist lustig aber das macht mir keinen Spaß..liegt wohl am Lehrer. Ich würd ja sagen ich arbeite alles neu auf aber ich hab nurnoch heute & morgen Zeit, Mittwoch und Donnerstag komm ich nicht wirklich mehr dazu..
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.09 15:08
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| case Ord(Key) of 13: ShowMessage('Enter'); Ord('0')..Ord('9'): ShowMessage('Zahl'); else Key := #0; end; | Damit prüfst du welche Taste gedrückt wurde. Dort wo jetzt Meldungen ausgegeben werden musst du deinen Code hinschreiben.
Und weitere Tasten musst du noch ergänzen. 8 wäre z.B. Backspace. Hier gibts eine Liste (die grünen Zahlen sind das was du brauchst):
www.torsten-horn.de/techdocs/ascii.htm
// EDIT:
Schuldelphi Nutzer hat folgendes geschrieben : | Ich würd ja sagen ich arbeite alles neu auf aber ich hab nurnoch heute & morgen Zeit, Mittwoch und Donnerstag komm ich nicht wirklich mehr dazu.. |
Dann hättest du eben früher anfangen müssen... 
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Di 06.01.09 17:37
Früher anfangen ging leider nicht. War in den Ferien nicht in Deutschland, deshalb hatte ich keine Zeit dazu.
Hab nun einen Taschenrechner fertig (dank einem Freund, der mir sehr stark geholfen hat [hab alles einigermaßen verstanden] ´) aber dazu ne Frage. da ich aber ncith möchte, dass alle bald meinen Rechner haben (aus unserem Kurs stöbern hier bestimmt mehrere durch) wollte ich fragen, ob mir jemand per Nachricht oder so helfen kann.
Mein Problem mal allgemein Beschrieben: Meinr Rechner rechnet in nem Memofeld übereinander. Und ich wills nebeneinander haben.
Mehr Infos dann per Nachricht 
|
|
lincore
Hält's aus hier
Beiträge: 15
Kubuntu 8.04, Debian lenny, Windows XP, Windows Vista
Delphi 2009, C++, Python, Lua
|
Verfasst: Di 06.01.09 17:49
Schuldelphi Nutzer hat folgendes geschrieben : | Mein Problem mal allgemein Beschrieben: Meinr Rechner rechnet in nem Memofeld übereinander. Und ich wills nebeneinander haben. |
Ich rate mal: Du fügst dem Memofeld Text mit "memo.lines.add('mein text');" hinzu. Um alles auf einer Zeile zu haben schreibst Du: "memo.text := memo.text + 'mein text';"
Das ist ein Forum und kein Instant Messenger, also lass dir selbst was einfallen um zu verschleiern, dass Du code geklaut hast.
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: Di 06.01.09 17:54
lincore hat folgendes geschrieben : |
Ich rate mal: Du fügst dem Memofeld Text mit "memo.lines.add('mein text');" hinzu. Um alles auf einer Zeile zu haben schreibst Du: "memo.text := memo.text + 'mein text';"
Das ist ein Forum und kein Instant Messenger, also lass dir selbst was einfallen um zu verschleiern, dass Du code geklaut hast. |
wollte nur mal anfügen: ich habe den Code nicht geklaut... Ich saß lang genug daran, weshalb ich den Vorwurf nen bisschen frech find. Ich denke es ist verständlich, dass ich nicht will, dass plötzlich jemand das gleiche abgibt wie ich!
Aber danke für den Tip, ich werds mal versuchen 
|
|
lincore
Hält's aus hier
Beiträge: 15
Kubuntu 8.04, Debian lenny, Windows XP, Windows Vista
Delphi 2009, C++, Python, Lua
|
Verfasst: Di 06.01.09 18:04
Schuldelphi Nutzer hat folgendes geschrieben : | wollte nur mal anfügen: ich habe den Code nicht geklaut... Ich saß lang genug daran, weshalb ich den Vorwurf nen bisschen frech find. Ich denke es ist verständlich, dass ich nicht will, dass plötzlich jemand das gleiche abgibt wie ich! |
Touché. Sagen wir "geliehen".
Ich wette, es gibt genug Möglichkeiten, deinen Code anzupassen, ohne deinen Mitschülern Wissen vorzuenthalten. Haben wir früher auch hingekriegt 
|
|
Schuldelphi Nutzer 
      
Beiträge: 20
|
Verfasst: So 11.01.09 14:25
lincore hat folgendes geschrieben : | Schuldelphi Nutzer hat folgendes geschrieben : | Mein Problem mal allgemein Beschrieben: Meinr Rechner rechnet in nem Memofeld übereinander. Und ich wills nebeneinander haben. |
Ich rate mal: Du fügst dem Memofeld Text mit "memo.lines.add('mein text');" hinzu. Um alles auf einer Zeile zu haben schreibst Du: "memo.text := memo.text + 'mein text';"
Das ist ein Forum und kein Instant Messenger, also lass dir selbst was einfallen um zu verschleiern, dass Du code geklaut hast. |
Hm damit bekomm ichs leider auch nicht hin.
Ich kopier mal den Quellcode hier rein, vielleicht kann mir dann jemand genauer helfen .
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158:
| unit mTaschenrechner;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Math, StdCtrls;
type TForm1 = class(TForm) bt7: TButton; bt8: TButton; bt9: TButton; bt4: TButton; bt5: TButton; bt6: TButton; bt1: TButton; bt2: TButton; bt3: TButton; bt0: TButton; btAC: TButton; btAddition: TButton; btMultiplikation: TButton; btDivision: TButton; btSubtraktion: TButton; btGleich: TButton; btPunkt: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure btZahlenClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btZahlenClick(Sender: TObject); var zeichen: String; posi: Integer; ergebnis: Real; begin zeichen := Memo1.Lines.Strings[0]; //Zahlen If (TButton(Sender).Caption = '0') or (TButton(Sender).Caption = '1') or (TButton(Sender).Caption = '2') or (TButton(Sender).Caption = '3') or (TButton(Sender).Caption = '4') or (TButton(Sender).Caption = '5') or (TButton(Sender).Caption = '6') or (TButton(Sender).Caption = '7') or (TButton(Sender).Caption = '8') or (TButton(Sender).Caption = '9')
then
begin
If (zeichen = '0') then begin Memo1.Lines.Strings[0] := Copy(Memo1.Lines.Strings[0],0,length(Memo1.Lines.Strings[0])-1); end;
If (zeichen <> '+') and (zeichen <> '-') and (zeichen <> '*') and (zeichen <> '/') then begin Memo1.Lines.Strings[0] := Memo1.Lines.Strings[0]+TButton(Sender).Caption; end else Memo1.Lines.Insert(0,TButton(Sender).Caption); end;
//Rechenzeichen If (TButton(Sender).Caption = '+') or (TButton(Sender).Caption = '-') or (TButton(Sender).Caption = '*') or (TButton(Sender).Caption = '/') then begin If (zeichen <> '+') and (zeichen <> '-') and (zeichen <> '*') and (zeichen <> '/')
then begin Memo1.Lines.Insert(0,TButton(Sender).Caption); end; end;
//Ergebnis If (TButton(Sender).Caption = '=') then begin If Memo1.Lines.Strings[1] = '+' then begin ergebnis := StrToFloat(Memo1.Lines.Strings[2]) + StrToFloat(Memo1.Lines.Strings[0]); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.Strings[1] = '-' then begin ergebnis := StrToFloat(Memo1.Lines.Strings[2]) - StrToFloat(Memo1.Lines.Strings[0]); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.Strings[1] = '*' then begin ergebnis := StrToFloat(Memo1.Lines.Strings[2]) * StrToFloat(Memo1.Lines.Strings[0]); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.Strings[1] = '/' then begin ergebnis := StrToFloat(Memo1.Lines.Strings[2]) / StrToFloat(Memo1.Lines.Strings[0]); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end; end;
//AC => löschen If (TButton(Sender).Caption = 'AC') then begin Memo1.Lines.Clear; end;
//Komma If (TButton(Sender).Caption = ',') then begin posi := pos(',',zeichen); If posi = 0 then begin If (zeichen <> '+') AND (zeichen <> '-') AND (zeichen <> '*') AND (zeichen <> '/') then begin Memo1.Lines.Strings[0] := Memo1.Lines.Strings[0]+TButton(Sender).Caption; end else Memo1.Lines.Insert(0,'0' + TButton(Sender).Caption); end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Clear; // leert bei start das Memo Fenster end;
end. |
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 11.01.09 14:34
Ich hoffe dir ist klar, dass Memo1.Lines.Insert(0, ... den text in eine neue Zeile vor der bis dahin ersten einfügt? Wenn du das in die selbe Zeile haben willst: Delphi-Quelltext 1: 2: 3: 4: 5:
| Memo1.Text := 'Dein Text' + Memo1.Text;
Memo1.Text := Memo1.Text + 'Dein Text'; |
|
|
|