Automatisches Rechnen

Für Fragen von Einsteigern und Programmieranfängern...
TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Automatisches Rechnen

Beitrag von TheBeer »

Guten Abend ihr lieben :)


Ich habe nach etlichen Jahren mal wieder interesse am Programmieren. Damals hatte ich mit Delphi 6 programmiert aber leider ist mir meine CD und alles dazu beim Umzug abhanden gekommen.

Darum habe ich mir nach etlichen Stunden lesen Lazarus ausgesucht und zugelegt.

Nun eine Frage


Ich möchte ein simples Programm erstellen was einfach nur rechnen soll.

Und zwar sieht das so aus das ich in ein Edit ( gibt insgesammt 15) eine Zahl eingeben will und er mit dann im dahinter stehenden Label das automatisch ausrechnet. Ohne Button

Ich will aus dem Grund kein Button haben weil ich dann ja 15 Buttons bräuchte oder ich mach alles über ein Button rechnen lassen was mich jetzt als "Neuling" in Lazarus etwas überfordern würde. Ich habe schon gemerkt das doch einiges anders ist als in Delphi. Ich habe auch schon ein Quellcode der in Delphi geschrieben wurde ausprobiert aber leider ohne Erfolg.

hoffe ihr könnt mir weiter helfen


mfg Andreas

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Automatisches Rechnen

Beitrag von m.fuchs »

Ein bisschen unklar sind deine Formulierung schon.
Was auch immer aus einer Zahl ausgerechnet werden soll, das geht natürlich auch ohne Button. Die TEdit-Komponente kann auf die Eingabe reagieren und dabei Code ausführen. OnChange ist das passende Stichwort dafür.

Such dir dazu einfach mal ein paar Beispiele heraus (auf diesem Level gibt es keine Unterschiede zu Delphi) und melde dich einfach wieder mit Detailfragen. Sofern überhaupt welche auftreten.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

Hallo und herzlich Willkommen

Zuerst wäre es sicher sinnvoll zu wissen, mit was für einem Betriebssystem du arbeitest und welche Lazarusversion du dir runtergeladen hast.


Für Forms gibs hier eine kleine Anleitung
http://wiki.lazarus.freepascal.org/Form_Tutorial/de


Wenn du dir ein Edit-Object in die Form eingefügt hast, findest du unter Ereignisse eine entsprechende Funktion die dir die Möglichkeit gibt, bei jeder Änderungseingabe im Hintergrund deine Berechnung in ein z.B. Label auszugeben. (siehe Bilder)

Ereignishandle für deine Edit
Ereignishandle für deine Edit
Der Code deiner Ereignis, in der du z.B. deine Berechnung schreiben kannst bevor sie dann im Label ausgegeben wird.
Der Code deiner Ereignis, in der du z.B. deine Berechnung schreiben kannst bevor sie dann im Label ausgegeben wird.

Freundliche Grüsse

exc-jdbi
Zuletzt geändert von exc-jdbi am Sa 30. Aug 2014, 23:19, insgesamt 3-mal geändert.

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

Hallo und danke für die schnelle Antwort :)

ich habe Version 1.2.4 wenn mir nicht alles täuscht hab sie ja auf der HP von Lazarus geladen.


Und danke für dein Tipp nun weiß ich was ich falsch gemacht habe. Ich habe das immer in den Change vom Label geschrieben. -.- Naja is schon ne weile her wo ich in Delphi programmiert habe. War kein Profi aber solche kleinen simplen rechner konnte ich eigentlich ganz gut ausn ff



vielleicht kannst mir ja noch helfen und mal ein Vorschlag machen wir man das hier macht mit der 1000er Trennung. Will nur den ausgegebenen Wert mit punkten Trennen. Sind ganze Zahlen in der Regel aber damit ich das einfach nur kopieren brauch bzw auch übersichtlicher ist wär eine Trennung nicht schlecht. Habe das mal probiert aber kam immer nur ein Fehler raus. Hatte folgendes genommen: Format.Float;


aber das wird mir immer als fehler angezeigt wobei das auch in irgendein delphi tutorial so stand


EDIT: arbeite mit Windows 7 ( hatte ich ganz vergessen)

naja wie gesagt is bestimmt einiges anders als bei Delphi und suche immer noch ein schönes Tutorial ^^ um mich erst mal rein zu lesen


mfg Andreas

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

Hallo Andreas

Google ist dein Freund.

http://www.delphipraxis.net/150464-inte ... geben.html
http://www.delphipraxis.net/1036927-post7.html

Ich bin auch ganz neu, und musste mich auch zuerst durch das WIKI kämmen. Delphi war für mich absolut Neuland. Aber irgendwie bin ich ziemlich schnell in das Thema reingekommen. Und mittlerweile habe ich schon einige ganz flotte Sachen zusammengestellt.

Ich denke mit deiner Delphi-Erfahrung wird es für dich somit noch einfacher sein als für mich.


Freundliche Grüsse

exc-jdbi

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

danke dir :)

habs auch jetzt hin bekommen das er berechnet. Kommt zwar immer noch ne Fehlermeldung wenn ich z.b. den Eintrag im Edit lösche aber das wird irgendwie mit einer If funktion schon gehen ^^

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

Guten Morgen,

mir is da gerade noch was aufgefallen, ich habe irgendwie keine integrierte Hilfe in Lazarus. Hab eigentlich bei der Installation alles angekreuzt.

Stecke nämlich beim TausenderTrennZeichen Fest. Und zwar ist das ja für ein Game also die Berechnung. Im Game werden alle Zahlen mit Tausender Trennung ausgegeben. z.b. 114.085.105

Wäre toll wenn man das irgendwie einfach nur kopieren könnte und nicht immer die Punkte löschen müsste. Bin jetzt auch umgestiegen von Real auf Integer, so habe ich erst einmal immer diese Fehlmeldungen beseitigt die immer kommen wenn man das Edit Fenster leeren will.

Habe es schon mit FormatFloat probiert gehabt und alle anderen Format Befehle die mir die Suche ausgespuckt hatte aber kam jedes mal ein Fehler entweder weil ich die Const als Real hatte oder jetzt wegen irgendwas anderen.

EDIT: um mal zu veranschaulichen wie mein Code jetzt aussieht nach dem alten Float Muster( würde gerne auch Float nehmen weil die Zahlen auch in die Mrd gehen könnten)

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
begin
 
   ergebnis:=StrToFloat(Edit1.Text)*1200;
 
   if StrToFloatDef(Edit1.Text, 0) = StrToFloatDef(Edit1.Text, -1) then
  else
    ShowMessage('Bitte eine Zahl eingeben!!!');
 
 
  Label9.Caption:=FloatToStr(ergebnis);
end;  

vielleicht kann mir ja einer helfen. Immer wenn man den Edit dann löschen will sprich neue Zahlen eingeben will kommt eine Fehlermeldung beim letzten Backslasch genauso wie wenn man ein Buchstaben eingibt wo ja eigentlich keine Fehlermeldung kommen sollte sondern ein Message mit dem oben genannten text

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

Guten Tag Andreas

Setze am Anfang unbedingt die Anfangsbedingungen, wenn du in der onChange-Prozedur bist.

z.B. mit einer Abfrage wie if length(trim(self.Edit1.Text))=0 then und setzt gleich auch einem bestimmten Wert z.B. "0" und spring aus der Prozedur.

Sofern sich etwas in der Edit befindet so musst du es erst checken, ob es sich um eine Zahl ist !!!!

Ist diese Bedingung erfüllt kannst du mit z.B. TryStrToFloat (und ffNumber) dir die Zahl in das Label ausgeben.

So würde ich das in etwa machen.

Freundliche Grüsse

exc-jdbi

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

Hier noch ein kleines Beispiel ungetestet

Code: Alles auswählen

 
procedure TForm1.Edit1Change(Sender: TObject);
var strEdit:string;
     dblZahl:Double;
begin
  if trim(Edit1.Text)='' then
    if length(trim(self.Edit1.Text))=0 then
  begin
    self.Edit1.Text:='0';
    self.label1.caption:=self.Edit1.Text;
    exit;
  end;
  if length(trim(self.Edit1.Text))>0 then
  begin
    strEdit:=trim(self.Edit1.Text);
    if isNumeric(strEdit) then
    begin
      TryStrToFloat(strEdit,dblZahl);
      self.Label1.caption:=FloatToStrF(Berechnung(dblZahl),ffNumber,12,3);
    end
    else self.Label1.caption:='#Nummer#';  
  end;
end;
function TForm1.Berechnung(dbl: double): double;
begin
  result:=//Deine Berechnung
end;
function TForm1.IsNumeric(s: string): boolean;
var  i: integer;
begin
  Result := //Lass dir was einfallen
end;
 
Freundliche Grüsse

exc-jdbi
Zuletzt geändert von exc-jdbi am So 31. Aug 2014, 14:34, insgesamt 1-mal geändert.

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

Danke dir exc-jdbi für deine Hilfe,

leider habe ich jetzt das selbe Problem was ich schon ganz am anfang hatte er meckert rumm wegen der Dekleration der Variablen

unit1.pas(50,7) Fatal: Syntax error, ";" expected but "identifier STREDIT" found
das kommt bei der Zeile: strEdit:string;

das kam auch vorgestern bei mir wo ich angefangen hatte das erste mal mit Lazarus zu programmieren. Da wollte ich für jeden Edit eine variable fest legen z.b.

var a,b,c: real;

und dann a:=StrToFloat(Edit1.Text);

aber wie gerade auch in dein Code die selbe Meldung. Nun habe ich einfach edit 1,2,3,4 usw als globale Variablen in Real deklariert und es geht bis jetzt einwandfrei.

Ich habe vorher noch nie mit TryStrToFloat gearbeitet oder was davon gehört wahrscheinlich stecke ich deswegen auch fest. genauso habe ich an dein Vorpost erst mal mit der ffNumber onkel Google fragen müssen ^^ wie gesagt die ganze Funktion is komplett neu für mich. Und auch nirgends irgendwie so richtig erklärt anhand von Beispielen oder so


Mit freundlichen Grüßen und besten Dank für deine Mühe

Andreas

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

kannst du ein bisschen Code zeigen

Freundliche Grüsse

exc-jdbi

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

Ich habe jetzt mal den Code was du so in der Grundform rein kopiert hast mir mal raus kopiert. Kann ja sein das ich irgendwo was falsch abgetipp habe oder wieder zuviel verändert hatte aber selber fehler bei der Dekleration der Variablen var


unit1.pas(51,1) Fatal: Syntax error, ";" expected but "identifier STREDIT" found
Zeile 51,1 steht "var" der gibt gleich das v von var als fehler an

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

So wie ich den Fehler interpretiere fehlt dir irgendwo ein Zeilenabschluss [Semikolon >> ;]

Also ohne Code kann ich da auch nicht viel bewirken.


Freundliche Grüsse

exc-jdbi

TheBeer
Beiträge: 22
Registriert: Sa 30. Aug 2014, 19:33

Re: Automatisches Rechnen

Beitrag von TheBeer »

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
begin
 
 
  begin
    if trim(Edit1.Text)='' then
      if length(trim(self.Edit1.Text))=0 then
    begin
      self.Edit1.Text:='0';
      exit;
    end;
    if length(trim(self.Edit1.Text))>0 then
 
      begin
        TryStrToFloat(strEdit,dblZahl);
  Label9.Caption:=FloatToStr((Edit1.Text)(dblZahl),ffNumber,12,3);   <-----------------------------------------------
      end;
    end;
  end;
  function TForm1.Berechnung(dbl: double): double;
  begin
    result:=StrToFloat(Edit1.Text)*1200;
  end;         

so sieht der code jetzt im groben erst mal aus. Nun habe ich die Dekleration der string variablen nach oben gesetzt und keine Fehlermeldung mehr

Nun kommt nur noch unit1.pas(65,47) Fatal: Syntax error, ")" expected but "(" found

in der Zeile was ich Rot makiert habe

exc-jdbi
Beiträge: 64
Registriert: So 3. Aug 2014, 03:37

Re: Automatisches Rechnen

Beitrag von exc-jdbi »

Ja die Klammern stimmen nicht

und den wert deiner Edti1.caption würde ich zuerst in checken, ob es eine Zahl ist

(Edit1.Text)(dblZahl) .. das kann nicht gehen, end du nimmst das eine oder das andere :wink:

Code: Alles auswählen

 
Label9.Caption:=FloatToStr(dblZahl,ffNumber,12,3);
 

Antworten