![]() |
Edit Felder voneinander Abhängig / Umrechnung
Hi,
ich muss einen Umrechner basteln bei dem in verschiedene Temperaturskalen umgewandelt wird. Das Programm besteht aus drei Edit Feldern und einem Umrechnen Knopf. Jedes Edit Feld enthält eine Temperaturskala. Irgendwie müssen diese Edit Felder voneinander abhängig sein. Das heisst wenn ich Edit2 verändere müssen sich nach Klick auf Umrechnen Edit 1 und 3 ändern. Wenn ich Edit3 verändere müssen sich Edit 1 und 2 verändern. Nur wie erkennt Delphi welches Edit Feld zuletzt geändert wurde? Insgesamt ist die Geschichte ja nicht all zu schwer. Ist ja nur eine if Schleife mit drei Bedingungen. if Edit1 geändert dann Edit2.Caption:= Edit1*Umrechnungskurs und Edit3.Caption:=Edit1*Umrechnungskurs if Edit2 geändert u.s.w. Wäre super wenn ihr mir hierhelfen könntet. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Hi,
herzlich Willkommen! Gleich vorweg: Eine if-Schleife gibt es nicht. Entweder eine if-Verzweigung, if-Anweisung oder wie man's auch nennen mag. Es wird ja nichts wiederholt. Du könntest das OnChange-Ereignis der Edits nutzen und darin den Inhalt der 2 weiteren Edits anpassen. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Das klingt doch schonmal gut, hast du vielleicht hierzu auch ein explizites Beispiel?
Bedanke mich schonmal im Voraus! |
Re: Edit Felder voneinander Abhängig / Umrechnung
Befass mich mal mit den Grundlagen der VCL
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Moin,
ein gutes Anfängertutorial bzw. einen Crashkurs findest du ![]() Aber kurz zum Problem: Du könntest es beispielsweise so (für jedes Edit extra) lösen:
Delphi-Quellcode:
Der Button ist übrigens dann überflüssig, das geschieht alles "live".
procedure TForm1.Edit1Change(Sender: TObject);
begin try Edit2.Text := FloatToStr(StrToFloat(Edit1.Text) * Faktor); Edit3.Text := FloatToStr(StrToFloat(Edit1.Text) * Anderer_Faktor); except end; end; Der leere except-Block ist eigentlich keine saubere Lösung, doch in diesem Fall würde ich sagen, kann man das mal so machen, dass nicht bei jeder Fehleingabe bzw. beim Leeren des Edits eine Fehlermeldung erscheint. ;) |
Re: Edit Felder voneinander Abhängig / Umrechnung
Die Idee ist sicherlich gut. Leider Funktioniert der Change bei mir nicht. (undeclared identitifier)
aber gibt es nicht auch eine Lösung die mit Button funktioniert? Problem ist, das ich mich genau an die Vorlage halten muss. Ich bedanke mich schon jetzt für die Zahlreichen Antworten, ein klasse Forum ist das hier! |
Re: Edit Felder voneinander Abhängig / Umrechnung
Zeig mal deinen Code
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Der ist genauso wie oben, nur die Faktoren sind halt eingesetzt, das Problem tritt jedoch ganz oben, bei Change auf...
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Das OnChange ist ein Ereignis der Edits. Das heißt, du musst im Objektinspektor doppelt auf das Ereignis oder doppelt aufs Edit zur Designtime klicken, um dies automatisch erstellen zu lassen.
Du solltest dir wirklich zuerst einmal die Grundlagen ansehen und dich mit der Delphi-IDE vertraut machen. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Ich kann deiner Erklärung nicht ganz folgen. Grundlagen sind da habe auch shcon normal umrechnungen u.s.w. gemacht, das einzige Problem was sich mir stellt ist diese Verknüpfung der Edits. Was dieses Onchange bewirkt ist mir auch klar, nur ist das ja nicht die perfekt Lösung.
Ich würde mich freuen wenn du mir entweder nochmal erklären könntest warum der OnChange nicht geht oder mir bei einer Lösung mit Button helfen könntest... |
Re: Edit Felder voneinander Abhängig / Umrechnung
Also. Ein ButtonClick-Ereignis erstellst du ja, indem du doppelt auf den Button klickst (bzw im Objektinspektor). Genauso erstellt man alle Ereignisse der Komponenten u.a. auch das OnChange des Edits. Also klicke doppelt aufs Edit und im Code-Editor öffnet sich der Rumpf der Prozedur, dort kannst du deinen Code dann einfügen.
Ohne OnChange wird's etwas schwieriger. Du könntest den Inhalt der Edits in je einer Variablen speichern und dann vergleichen. Sind die Werte nicht identisch, wurde der Inhalt des entsprechenden Edits geändert. Dann weist du den neuen Wert der Variablen zu und berechnest die neuen Werte, die du in den beiden anderen Edits ausgeben kannst. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Zitat:
Die zweite Möglichkeit ist eine Nummer zu schwer, dann würde ich lieber mit der anderen Möglichkeit agieren. Ich werde morgen mal einen Informatiklehrer in der Schule anlabern, vielleicht kann der mir weiterhelfen... |
Re: Edit Felder voneinander Abhängig / Umrechnung
Hallo,
Zitat:
![]() Gruß Hawkeye |
Re: Edit Felder voneinander Abhängig / Umrechnung
Also mit Onchange habe ich es jetzt hinbekommen. Musste einfach nochmal das Projekt neu öffnen, dann ging's.
Vielleicht fällt ja jemadem noch eine elegante Lösung mit Button ein. Das mit TEdit.Modified werde ich aber auf jeden Fall nochmal probieren. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Zitat:
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Wenn du allet zusammenfassen willst:
Delphi-Quellcode:
type
TForm1 = class(TForm) {...} public fLastField: integer procedure Umrechnen; {...} procedure TForm1.Umrechnen; begin case fLastField of 1: begin // umrechnungen für Edit2 end; 2: begin // umrechnungen für Edit3 end; else // umrechnungen für Edit1 end; end; procedure TForm1.Edit1OnChange begin fLastField := 0; Umrechnen; end; procedure TForm1.Edit1OnChange begin fLastField := 1; Umrechnen; end; procedure TForm1.Edit1OnChange begin fLastField := 2; Umrechnen; end; procedure TForm1.Button1OnClick begin Umrechnen; end; |
Re: Edit Felder voneinander Abhängig / Umrechnung
@cruiser : Würde es dir was ausmachen deinen code nochmal ein wenig zu erläuter?
Also ich habe das jetzt mal das alte Beispiel weitergeführt und es funktioniert fast alles. Wenn ich jedoch eine Programmzeile für die Fahrenheit Skala eingebe bricht das Programm sofort ab. Das liegt daran das sich die drei Edits gegenseitig ändern wollen. Nur wie lässt sich das beheben? Hier noch der Programmcode, ohne die Zeilen für Fahrenheit.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin close; end; procedure TForm1.celChange(Sender: TObject); begin rea.Text := FloatToStr( round (StrToFloat(cel.Text) * 0.8)); fahr.Text := FloatToStr( round (StrToFloat(cel.Text) * 1.8 + 32)); end; procedure TForm1.reaChange(Sender: TObject); begin cel.Text := FloatToStr( round (StrToFloat(rea.Text) * 1.25)); fahr.Text := FloatToStr( round (StrToFloat(rea.Text) * 2.25 + 32)); end; end. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Klar, wenn Du per Quellcode den Text eines Edits änderst, wird dessen OnChange-Ereignis durchlaufen. So kommst Du in eine Endlosschleife. Tipp: Frag doch mal den Sender ab, dafür ist dieser Parameter da ;)
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Mal ein Beispiel auf die Schnelle:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var i: integer; begin i := StrToInt(Edit1.Text); if Sender <> Edit2 then Edit2.Text := IntToStr(i*2); if Sender <> Edit3 then Edit3.Text := IntToStr(i*3); end; procedure TForm1.Edit2Change(Sender: TObject); var i: integer; begin i := StrToInt(Edit2.Text); if Sender <> Edit1 then Edit1.Text := IntToStr(i div 2); if Sender <> Edit3 then Edit3.Text := IntToStr(i div 2 *3); end; procedure TForm1.Edit3Change(Sender: TObject); var i: integer; begin i := StrToInt(Edit3.Text); if Sender <> Edit1 then Edit1.Text := IntToStr(i div 3); if Sender <> Edit2 then Edit2.Text := IntToStr(i div 3 * 2); end; |
Re: Edit Felder voneinander Abhängig / Umrechnung
Das geht leider auch nicht! Wieder eine Überlastung... (StackOverflow)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin close; end; procedure TForm1.celChange(Sender: TObject); var i: extended; begin i := StrToFloat(cel.Text) ; if Sender <> rea then rea.Text := FloatToStr(i * 0.8); if Sender <> fahr then fahr.Text := FloatToStr(i * 1.8 + 32); end; procedure TForm1.reaChange(Sender: TObject); var i: extended; begin i := StrToFloat(rea.Text); if Sender <> cel then cel.Text := FloatToStr(i * 1.25); if Sender <> fahr then fahr.Text := FloatToStr(i * 2.25 + 32); end; procedure TForm1.fahrChange(Sender: TObject); var i: extended; begin i := StrToFloat(fahr.Text); if Sender <> cel then cel.Text := FloatToStr(i - 32 * 5/9); if Sender <> rea then rea.Text := FloatToStr(i - 32 * 4/9); end; end. |
Re: Edit Felder voneinander Abhängig / Umrechnung
puuuh ja... hab ich nicht bedacht... ich schiess mal aus der Hüfte heraus:
mh... setz die Tags der Edits auf 1,2 und 3... die Onchange-Events setzt du auf CalcFieldsChange, nachdem du es in deinen Code eingebaut hast.
Delphi-Quellcode:
// unter TForm1 eintragen:
procedure CalcFieldsChange(Sender: TObject); // im Implementations-Bereich procedure TForm1.CalcFieldsChange(Sender: TObject); begin case (Sender as TEdit).Tag of 1: begin edit2.Text := edit1.Text; // bzw. was du jeweils machen willst edit3.Text := edit1.Text; end; 2: begin edit1.Text := edit2.Text; edit3.Text := edit2.Text; end; 3: begin edit1.Text := edit3.Text; edit2.Text := edit3.Text; end; end; end; |
Re: Edit Felder voneinander Abhängig / Umrechnung
Hey Jungs, jetzt habe ich fast alles geschafft, nur noch ein paar Kleinigkeiten fehlen.
Die Idee ist folgende: Immer wenn ein OnChange bei einem Edit eintritt, wird die Variable i auf 1,2 oder 3 gesetzt, je nachdem welches Edit Feld geändert wurde. Eigentlich genial einfach, nicht wahr? Nun habe ich noch ein paar Probleme, irgendwie ist die variable nicht richtig deklariert, jedefalls meckert der Debugger immer rum und sagt mir "Value Assigned to i never used". Dann bekomme ich irgendwie keine if then else anweisung hin. Die benötige ich aber, sonst würde ja die Schleife wieder mehrmals durchlaufen, weil sich die Felder ja verändern, sobald Erebnisse eingetragen werden. Und zu guter Letzt habe ich Problem mit der Fahrenheit Rechnung wenn ich das so eintrage wie ich das jetzt gemacht habe, also mit den -32 dann mäckert der debugger und sagt "Incobatible Types : "String" and "Integer"" Ist ja auch logisch, nur wie kann ich das beheben. Anbei noch der Code, ich hoffe ihr könnt mir auch noch bei den letzten Fragen helfen, Vielen, vielen Dank!
Delphi-Quellcode:
procedure TForm1.celChange(Sender: TObject);
var i: integer; begin i:=1 end; procedure TForm1.reaChange(Sender: TObject); var i: integer; begin i:=2 end; procedure TForm1.fahChange(Sender: TObject); var i: integer; begin i:=3 end; procedure TForm1.UmrechnenClick(Sender: TObject); var i: integer ; begin if i=1 then rea.Text := FloatToStr( round (StrToFloat(cel.Text) * 0.8)) ; fah.Text := FloatToStr( round (StrToFloat(cel.Text) * 1.8 + 32)); if i=2 then cel.Text := FloatToStr( round (StrToFloat(rea.Text) * 1.25)) ; fah.Text := FloatToStr( round (StrToFloat(rea.Text) * 2.25 + 32)) ; if i=3 then cel.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 5 div 9)); rea.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 4 div 9)) end; end. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Du hast die Variable i überall lokal definiert.
Die ist nur in der jeweiligen Methode gültig und nach Abschluss der Methode nicht mehr da. Mach eine privat Variable in deine Form Klasse zB.
Delphi-Quellcode:
und benutze diese Variable.
type
TForm1 = class(TForm) private Auswahl: Integer; public { Public declarations } end; Edit: Das mit der -32 machst du ganz einfach indem du 32.00 schreibst. Noch eine Verfeinerung. Schreibe in die OnCreate Methode deiner Form folgendes. Damit initialsierst du schon mal die Variable.
Delphi-Quellcode:
...und folgendes in deine Umrechnen Methode.
procedure TForm1.FormCreate(Sender: TObject);
begin Auswahl := 0; end;
Delphi-Quellcode:
..damit hast du auch noch geprüft, ob dein Initialwert drin steht oder ein neuer Wert.
procedure TForm1.UmrechnenClick(Sender: TObject);
begin if Auswahl = 0 then Exit; end; Die letzen beiden Punkte sind kein muss in deinem Fall, aber soll mehr dem Lernen und sauberem programmieren in späteren Projekten helfen. |
Re: Edit Felder voneinander Abhängig / Umrechnung
Gut, das mit der variable funktioniert.
Wenn ich jedoch 32.00 eingebe sagt er mir Incompatible Types String and Extended. Notfalls muss ich die als variablen Festlegen und dann die Rechnung machen... |
Re: Edit Felder voneinander Abhängig / Umrechnung
...jetzt seh ich wo du den Fehler mit den inkompatiblem Typen hast
zB hier
Delphi-Quellcode:
so muss das lauten
rea.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 4 div 9))
Delphi-Quellcode:
Du hast versucht von dem Zeichen eine Zahl abzuziehen, daß geht natürlich nicht. Erst umwandeln, dann rechnen.
rea.Text := FloatToStr( round (StrToFloat(fah.Text)-32) * 4 div 9))
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Ja jetzt ist es fast fertig!
Ich habe das nun so eingegeben
Delphi-Quellcode:
Funktioniert soweit prima nur nun müsste ich noch die else anweisung reinbringen sonst treten machnmal kleine differenzen beim Umrechnen auf...
rea.Text := FloatToStr( round (StrToFloat(fah.Text)-32.00) * 4 div 9)
Nur wie geht das? Finde das echt klasse wie intensiv sich manche user hier mit den Problemen anderer rumschlagen. Wirklich ein unglaublich gutes Forum. :love: Danke! |
Re: Edit Felder voneinander Abhängig / Umrechnung
Ganz grob funktioniert eine if-Anweisung so:
Delphi-Quellcode:
Wichtig: vor dem else kein Semikolon!
if xyz=acb then
begin end else begin end; |
Re: Edit Felder voneinander Abhängig / Umrechnung
Die Differenzen liegen nicht am fehlendem else sondern an fehlenden begin..ends ;)
Wenn du nicht jedem if then sagst wo sie anfängt und endet, nimmt der Compiler nur die erste Zeile danach. Ein else kannst du trotzdem reinbringen ist sogra besser in dem Fall.
Delphi-Quellcode:
Aufgabe:
procedure TForm1.UmrechnenClick(Sender: TObject);
begin if Auswahl=1 then begin rea.Text := FloatToStr( round (StrToFloat(cel.Text) * 0.8)) ; fah.Text := FloatToStr( round (StrToFloat(cel.Text) * 1.8 + 32)) end else if Auswahl=2 then begin cel.Text := FloatToStr( round (StrToFloat(rea.Text) * 1.25)) ; fah.Text := FloatToStr( round (StrToFloat(rea.Text) * 2.25 + 32)) ; end else if Auswahl=3 then begin cel.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 5 div 9)); rea.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 4 div 9)) end; end; Guck dir case an und wende es hier an ! :D Dann lernst du noch etwas zusätzliches, da case noch besser wäre. Edit: - die Prüfvariable geändert - @DreddyH gar nicht, ich habs von oben kopiert und die gefragten Stellen eingesetzt....guck weiter oben und dir wird es klar ;) |
Re: Edit Felder voneinander Abhängig / Umrechnung
Wo wird i denn mit einem Wert belegt?
|
Re: Edit Felder voneinander Abhängig / Umrechnung
Und es Funktioniert!
Danke an alle User die Mitgewirkt haben. Letztendlich war es ja dann eine Kombination aus vielein verschiedenen Ideen. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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