AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inhaltsabfrage in Delphi 10.2

Ein Thema von iTzElKay · begonnen am 11. Sep 2018 · letzter Beitrag vom 13. Sep 2018
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 13:18
Am einfachsten speicherst du deine Eingaben in Variablen (wenn man so will der Speicher des Taschenrechners) und benutzt das Memo nur zur Anzeige. Du musst dir zudem merken, in welchem Zustand der Taschenrechner gerade ist, ob beim Eingebn der 1. Zahl oder der 2. Zahl, abhängig davon ob ein Operator eingegeben wurde usw. usw.
Das Eingeben per Tastatur kannst du erreichen, indem du für das Formular ein entsprechenden OnKeyPress-Event schreibst.
Ralph
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
998 Beiträge
 
#2

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 13:48
Memo.ReadOnly:=True Dann kann man schon mal nicht mehr direkt ins Memo schreiben.

Und Memo.Lines.Count liefert dir die Anzahl der vorhanden Zeilen im Memo
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 14:07
Danke euch beiden. Das mit dem OnKeyPress habe ich ausprobiert, ist aber auch bisschen kritisch. Der simpelste Weg ist das mit dem ReadOnly - das klappt gut. Gespeichert sind die Eingaben schon (meiner Meinung nach) in Variablen. Ich hatte mir gedacht, dass eine weitere Variable (csEingabe3) deklariert und mit der dritten Zeile initialisiert wird:
csEingabe3 := resultMemo.Lines[3];
if csEingabe3 = '' then...

..das klappt aber nicht so, da dann direkt die erste Eingabe nicht dem Datentyp entspricht.

Code:
  procedure TForm1.enterBtnClick(Sender: TObject);
  var neErgebnis : extended;
      neEingabe1 : extended;
      neEingabe2 : extended;

begin
   csRechenart := resultMemo.Lines[1];
   neEingabe1 := StrToFloat( resultMemo.Lines[0] );
   neEingabe2 := StrToFloat( resultMemo.Lines[2] );

if csRechenart = '/' then begin
   neErgebnis := ( neEingabe1 / neEingabe2 );
   resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis );
end;
if csRechenart = '*' then begin
   neErgebnis := ( neEingabe1 * neEingabe2 );
   resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis );
end;
if csRechenart = '+' then begin
   neErgebnis := ( neEingabe1 + neEingabe2 );
   resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis );
end;
if csRechenart = '-' then begin
   neErgebnis := ( neEingabe1 - neEingabe2 );
   resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis );
end;



end;
Leon
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
998 Beiträge
 
#4

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 15:06
Generell ist dein Vorgehen nicht sehr ergonomisch und fehleranfällig.

Wenn es grundsätzlich um die Aufgabe geht aus zwei Werten eine Ergebnis zu berechnen, dann solltest du die Daten generell auch in entsprechenden Variablen halten, dort auch berechnen und lediglich für die Ausgabe an den User in das Memo schreiben. Bei der Ausgabe kannst du dann auch entsprechend formatieren.

Umgekehrt ist das, wie du merkst, deutlich umständlicher.

Die Erklärung dahinter ist einfach. Einen Fließkommawert in einen String zur Ausgabe umzuwandeln ist einfach, und dabei kann nahezu nichts schiefgehen. Der String kann alle Zeichen speichern, ob's nun Sinn macht oder nicht.
Aber um einen String in einen Fließkommawert zu wandeln, muss man schon deutlich mehr aufpassen. Denn eine Fließkommmazahl unterliegt nun mal ganz strikten Vorgaben (z.B. nur ein Kommazeichen und das richtige Kommazeichen. Keine Buchstaben, Leerzeichen, etc.).
Du merkst der Weg über einen String ist etwas schwieriger.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 15:57
Die Frage ist nur, wie ich diese Werte, die durch einzelne Klicks an das Memo übergeben werden, anders speichern kann. Ich bin gerade zu dumm, um das zu erkennen. Weil, wenn eine 1, eine 4 und eine 5 übergeben werden, kann ich einfach den Wert aus der Line1 übergeben - wie komme ich denn sonst an den Wert, der durch die Klicks zusammengestellt wird? Wie gesagt.. bin Anfänger und sehr verwirrt, haha.
Leon
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
998 Beiträge
 
#6

AW: Inhaltsabfrage in Delphi 10.2

  Alt 11. Sep 2018, 17:32
Ich hab mal eine kleine Demo für dich gemacht. Da kannst du dir anschauen, wie ich es auf die Schnelle machen würde.
Nicht perfekt, aber da kannst du dir was rausziehen, und es für dich dann perfekt machen.

Ich habe dir hier mal die entscheidenden Methoden aufgeführt. Die Aktuelle Zahl halte ich in der Variable Zahl als string (string deshalb, weil ich mir sonst nach dem Komma folgende Nullen merken müsste, bis der Benutzer wenigsten eine Ziffer <>0 eingibt. Daher der Einfachheit halber als string). Die Buttons für die Zahlen und Komma haben alle die btn1Click-Procedure. Ich entnehme jeweils ihrer Caption, um welche Zahl oder Komma es sich handelt. Die Procedure ZahlHinzufuegen übernimmt nun das tatsächliche Hinzufügen. Allerdings müssen hier eben die Sonderfälle berücksichtigt werden, damit immer gewährleistet ist, dass in Zahl ein gültiger Extended-Wert steht.

Das Anzeigen mache wieder über eine eigenen Procedure, da ich a) diesen Code an verschiedenen Stellen benötigen würde und b) ich die Methode so klein wie möglich halten will.
Also immer wenn sich ein Codefragment mindestens 1x wiederholt, lohnt sich eine eigene Methode dafür. Und übersichtlicher macht's auch.

Im KeyPrass filtere ich mir alle Key's und löse entsprechen den Button aus. Ich hätte auch z.B. ZahlHinzufuegen('1'); machen können.

Und dann noch eine Procedure für das Löschen von Zahlen. Auch hier muss man immer darauf achten, das in Zahl ein gültiger Extended-Wert verbleibt.

Statt Komma füge ich einen Punkt hinzu, weil das das Dezimalzeichen für Fließkommazahlen unter Delphi ist. Das in der Darstellung zu ändern, darum kannst du dir Gedanken machen.
Genauso wie über den Fehler, dass man in der Version das Komma mehrmals eingeben kann, was natürlich nicht sein darf.

Bitteschön.

(Liegt übrigens auch als komplettes Projekt im Anhang)

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
  ZahlHinzufuegen((Sender as TButton).Caption);
end;

procedure TForm1.btnDivisionClick(Sender: TObject);
begin
  Uebertrag(raDivision);
end;

procedure TForm1.btnMinusClick(Sender: TObject);
begin
  Uebertrag(raMinus);
end;

procedure TForm1.btnMultiplikationClick(Sender: TObject);
begin
  Uebertrag(raMultiplikation);
end;

procedure TForm1.btnPlusClick(Sender: TObject);
begin
  Uebertrag(raPlus);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Zahl:='0';
  Ergebnis:=0;
  RechenArt:=raPlus;
  AddKomma:=False;
  mmoAusgabe.Lines.Clear;
  while mmoAusgabe.Lines.Count<3 do
    mmoAusgabe.lines.Add('');
  WertAufMemo;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
    TShiftState);
begin
    case Ord(Key) of
      8: LoescheLetztStelle;
      48, 96: btn0.Click;
      49, 97: btn1.Click;
      50, 98: btn2.Click;
      51, 99: btn3.Click;
      52, 100: btn4.Click;
      53, 101: btn5.Click;
      54, 102: btn6.Click;
      55, 103: btn7.Click;
      56, 104: btn8.Click;
      57, 105: btn9.Click;
      42, 106: btnMultiplikation.Click;
      43, 107, 61, 12: btnPlus.Click;
      45, 109: btnMinus.Click;
      47, 111: btnDivision.Click;
      44, 188, 190: btnKomma.Click;
    else
      Key:=0;
    end;
end;

procedure TForm1.LoescheLetztStelle;
begin
  if Length(Zahl)>1 then
    Zahl:=Copy(Zahl, 1, Length(Zahl)-1) else
    Zahl:='0';
  WertAufMemo;
end;

procedure TForm1.Uebertrag(NeueRechenArt: TRechenart);
begin
  case RechenArt of
    raPlus: Ergebnis:=Ergebnis+StrToFloat(Zahl);
    raMinus: Ergebnis:=Ergebnis-StrToFloat(Zahl);
    raMultiplikation: Ergebnis:=Ergebnis*StrToFloat(Zahl);
    raDivision:
      begin
        if Zahl<>'0then
          Ergebnis:=Ergebnis/StrToFloat(Zahl);
      end;
  end;
  Zahl:='0';
  RechenArt:=NeueRechenArt;
  WertAufMemo;
end;

procedure TForm1.WertAufMemo;
begin
  mmoAusgabe.Lines[0]:=FloatToStr(Ergebnis);
  case RechenArt of
    raPlus: mmoAusgabe.Lines[1]:='+';
    raMinus: mmoAusgabe.Lines[1]:='-';
    raMultiplikation: mmoAusgabe.Lines[1]:='*';
    raDivision:mmoAusgabe.Lines[1]:='/' ;
  end;
  mmoAusgabe.Lines[2]:=Zahl;
end;

procedure TForm1.ZahlHinzufuegen(Eingabe: string);
begin
  if Eingabe='0then
  begin
    if Zahl<>'0then Zahl:=Zahl+Eingabe else
      Zahl:='0';
  end else if Eingabe=',then
  begin
    if Zahl='0then Zahl:='0.else
      Zahl:=Zahl+'.';
  end else begin
    if Zahl<>'0then
      Zahl:=Zahl+Eingabe else
        Zahl:=Eingabe;
  end;
  WertAufMemo;
end;
Angehängte Dateien
Dateityp: zip TaschenRechnerDemo.zip (53,6 KB, 11x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
iTzElKay

Registriert seit: 11. Sep 2018
Ort: Vlotho, im wundervollen NRW.
25 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: Inhaltsabfrage in Delphi 10.2

  Alt 12. Sep 2018, 14:05
Vielen Dank für deine Mühe!
Ich habe nur das Problem, dass ich mit Embarcadero programmiere und daher die VisualStudios-Datei nicht benutzen kann (kann sein, dass es Wege gibt). Ich schaue mir das mal genauer an und versuche mir an Hand des Quellcodes, mein Wissen zu erweitern.
Dank dir
Leon
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 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 by Thomas Breitkreuz