Entwickler-Ecke
Sonstiges (Delphi) - Taschenrechner - eine Prozedur?
Schuldelphi Nutzer - So 04.01.09 18:23
Titel: Taschenrechner - eine Prozedur?
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 :)
jaenicke - 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 - 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 - Mo 05.01.09 13:37
Dann kannst du ja alles z.B. in OnKeyPress machen und nur ein Editfeld benutzen.
Schuldelphi Nutzer - 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 - 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 - 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 - 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 - 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 - 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: ;-)
http://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:
http://www.delphi-treff.de/sprachen/object-pascal/prozeduren-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: ;-)
http://www.delphi-library.de/viewtopic.php?p=539975
Schuldelphi Nutzer - 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 - 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 - 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 - 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):
http://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... :roll:
Schuldelphi Nutzer - 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 - 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 - 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 - 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 - 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 .
Quelltext
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 - 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'; |
Schuldelphi Nutzer - So 11.01.09 18:54
Also müsste ich immer Memo1.Lines.Insert durch Memo1.Text := 'Dein Text' + Memo1.Text; ersetzen? Und das danach dahinter?
Oh man ich bin wohl echt auf den Kopf gefallen...
jaenicke - So 11.01.09 22:00
Schuldelphi Nutzer hat folgendes geschrieben : |
| Oh man ich bin wohl echt auf den Kopf gefallen... |
So würde ich das nicht sagen, ich glaube, dass dir nicht
ganz genau klar ist was genau welche Zeile bei dir macht. Und das ist nicht gut, denn dann kannst du schlecht etwas am Quelltext ändern oder so umschreiben, wie du es haben möchtest.
Deshalb solltest du wirklich überlegen ob dir bei allem klar ist, was da passiert, und nachschauen (F1 - Hilfe ;-)), wenn du unsicher bist was ein Befehl macht.
Dein "Insert(0, ..." hat ja den übergebenen Text vor der Zeile 0, also als neue erste Zeile eingefügt. Und deshalb stand das natürlich nicht mehr in der selben Zeile.
Memo1.Text enthält den gesamten Text, wenn du also ohne einen Zeilenumbruch hineinzuschreiben dies veränderst, dann bleibt das auch in einer Zeile. ;-)
Schuldelphi Nutzer - So 11.01.09 22:16
Heißt das, ich muss überall einfach die Strings entfernen? :)
Möchte das noch unbeding hinbekommen^^ Und ja ich weiß, ich versteh den Code nicht wirklich komplett :(
jaenicke - So 11.01.09 22:23
Beispiel:
Im Memo steht...
1: 2:
| Das ist ein Test. Und das die zweite Zeile. |
Dann sind die Inhalte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Memo1.Text = 'Das ist ein Test.'#13#10'Und das die zweite Zeile.'
Memo1.Lines[0] = 'Das ist ein Test.' Memo1.Lines[1] = 'Und das die zweite Zeile.' |
Wenn du jetzt Memo1.Lines.Insert(0, 'Neue Zeile'); ausführst, dann steht im Memo:
Quelltext
1: 2: 3:
| Neue Zeile Das ist ein Test. Und das die zweite Zeile. |
Wenn du aber den Text veränderst:
Delphi-Quelltext
1:
| Memo1.Text := 'Test' + Memo1.Text; |
dann steht danach drin:
Quelltext
1: 2:
| TestDas ist ein Test. Und das die zweite Zeile. |
Denn es wird ja nur dieser neue String vor den alten Inhalt geschrieben, aber keine neue Zeile, also auch kein Zeilenumbruch, neu hinzugefügt.
Schuldelphi Nutzer - So 11.01.09 22:39
hm also das ist schonmal eine gute erklärung, ich denke, die hab ich soweit auch verstanden.
Jedoch anwenden ist immmernoch schwierig.
Außerdem sagt er immer, dass der dieses "text" nicht kennt.
jaenicke - So 11.01.09 22:54
Schuldelphi Nutzer hat folgendes geschrieben : |
| Außerdem sagt er immer, dass der dieses "text" nicht kennt. |
Bei welchem Quelltext kommt welcher Fehler?
Du kannst auch Memo1.Lines.Text benutzen, aber selbst Delphi 3 kennt Memo1.Text eigentlich schon. :gruebel:
Schuldelphi Nutzer - So 11.01.09 23:03
Hm also jetzt geht es, also das mit dem umschreiben. Aber geändert hat sich nix. außer dass der nicht mehr "=" kann.
Quelltext
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.text:= Copy(Memo1.Lines.text,0,length(Memo1.Lines.text)-1); end;
If (zeichen <> '+') and (zeichen <> '-') and (zeichen <> '*') and (zeichen <> '/') then begin Memo1.Lines.text:= Memo1.Lines.text+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.text= '+' then begin ergebnis := StrToFloat(Memo1.Lines.text) + StrToFloat(Memo1.Lines.text); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.text= '-' then begin ergebnis := StrToFloat(Memo1.Lines.text) - StrToFloat(Memo1.Lines.text); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.text= '*' then begin ergebnis := StrToFloat(Memo1.Lines.text) * StrToFloat(Memo1.Lines.text); Memo1.Lines.Insert(0,FloatToStr(ergebnis)); end;
If Memo1.Lines.text= '/' then begin ergebnis := StrToFloat(Memo1.Lines.text) / StrToFloat(Memo1.Lines.text); 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.text := Memo1.Lines.text+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. |
Magst du mir das bitte in den ersten Quelltext einfügen? Ich weiß, sowas macht eigentlich keiner(kenn solche Fragen bei Grafikprogrammen, wenn irgendwelche Leute ankommen "kann ich nicht mach mal" ), aber ich packs echt nicht.Dabei hab ichs ja nun mehrfach versucht :( . Hab auch Informatik mitlerweile abgewählt, dürfte somit nurnoch dieses Programm sein :( Unter anderen Umständen hätte ich gern weiter gemacht.
jaenicke - So 11.01.09 23:11
Also so richtig verstehe ich noch nicht, wie das genau ablaufen soll. Häng doch mal das ganze Projekt an, das ist dann schneller nachzuvollziehen wie das ganze ablaufen soll.
Kürzer geht es z.B. am Anfang. Statt
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| begin zeichen := Memo1.Lines.Strings[0]; 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 ... |
kannst du schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin if not (Sender is TButton) then Exit; zeichen := Memo1.Lines.Strings[0]; if TButton(Sender).Caption[1] in ['0'..'9'] then begin ... |
Schuldelphi Nutzer - So 11.01.09 23:17
wie häng ich das komplett dran? :)
edit: gefunden!
jaenicke - So 11.01.09 23:46
Also im Moment greifst du ja auf die Zeilen in dem Memo zu um die Teile zu trennen. Stattdessen müsstest du dies in Variablen speichern. Zahl1, Operator und Zahl2 zum Beispiel.
Die unsaubere Lösung wäre das Memo zu verstecken und die Eingaben nochmal ohne Zeilenumbrüche hintereinander in ein Edit zu schreiben.
Schuldelphi Nutzer - So 11.01.09 23:52
Hm also wird das wohl nix mehr mit dem in eine Zeile schreiben.
Bin morgen früh noch mal kurz on, aber danach muss ich abgeben.
Falls mir doch noch jemand so den Text umschreiben würde, dass alles in einer Zeile ist währe ich auf ewig dankbar.
Aber dir jaenicke schonmal einen riesen Dank, du hast dir wirklich viel Geduld genommen auch wenn ich wohl ziemlich nervige Fragen stelle :)
jaenicke - Mo 12.01.09 00:16
Ok, also ich halte dir zu Gute, dass du dich zumindest bemüht hast, deshalb helfe ich mal bei der unsauberen Variante nach, das ist nämlich nicht so viel: ;-)
Leg ein Editfeld auf das Formular, setze Visible vom Memo auf False. Und dann ergänze diese Zeilen:
Delphi-Quelltext
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:
| procedure TForm1.btZahlenClick(Sender: TObject); var zeichen: String; posi: Integer; ergebnis: Real; begin Edit1.Text := Edit1.Text + TButton(Sender).Caption; zeichen := Memo1.Lines.Strings[0]; 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;
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;
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; Edit1.Text := Edit1.Text + FloatToStr(ergebnis); end;
If (TButton(Sender).Caption = 'AC') then begin Memo1.Lines.Clear; Edit1.Text := ''; end;
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; Edit1.Text := ''; end; |
Das FormCreate kannst du ganz weglassen, wenn du den Inhalt über den Objektinspektor bereits in Delphi in Lines bzw. beim Edit in Text löschst.
Dann ist nämlich beim Start des Programms schon gar nix mehr im Memo bzw. Edit, du musst es also gar nicht löschen. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!