Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Edit Felder voneinander Abhängig / Umrechnung (https://www.delphipraxis.net/93724-edit-felder-voneinander-abhaengig-umrechnung.html)

problemstoffe 10. Jun 2007 14:26


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.

Matze 10. Jun 2007 14:34

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.

problemstoffe 10. Jun 2007 14:43

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!

mkinzler 10. Jun 2007 14:44

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Befass mich mal mit den Grundlagen der VCL

Matze 10. Jun 2007 14:46

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Moin,

ein gutes Anfängertutorial bzw. einen Crashkurs findest du hier, dann fällt dir das Programmieren sicher leichter, denn die Grundlagen brauchst du unbedingt.

Aber kurz zum Problem: Du könntest es beispielsweise so (für jedes Edit extra) lösen:

Delphi-Quellcode:
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 Button ist übrigens dann überflüssig, das geschieht alles "live".

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. ;)

problemstoffe 10. Jun 2007 15:00

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!

mkinzler 10. Jun 2007 15:01

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Zeig mal deinen Code

problemstoffe 10. Jun 2007 15:07

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...

Matze 10. Jun 2007 15:20

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.

problemstoffe 10. Jun 2007 15:37

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...

Matze 10. Jun 2007 15:57

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.

problemstoffe 10. Jun 2007 16:06

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Zitat:

Zitat von Matze
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.

Das ist mir natürlich klar, und trotzdem funktioniert die Geschichte nicht...



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...

Hawkeye219 10. Jun 2007 16:10

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Hallo,

Zitat:

Zitat von Matze
Ohne OnChange wird's etwas schwieriger.

Ob der Inhalt eines Eingabefelds vom Anwender(!) geändert wurde, läßt sich über Delphi-Referenz durchsuchenTEdit.Modified ermitteln. Allerdings sagt auch das nichts darüber aus, welches Feld als letztes geändert wurde. Dies war aber einer der Vorgaben in Beitrag #1, deren Umsetzung ohne Verwendung von OnChange tatsächlich ziemlich schwierig werden dürfte.

Gruß Hawkeye

problemstoffe 10. Jun 2007 16:18

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.

Matze 10. Jun 2007 16:23

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Zitat:

Zitat von problemstoffe
Vielleicht fällt ja jemadem noch eine elegante Lösung mit Button ein.

Ich vermute mit deinem Wissen ist mein Vorschlag der einfachste (Wertevergleich).

cruiser 10. Jun 2007 17:14

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;

problemstoffe 10. Jun 2007 17:45

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.

DeddyH 10. Jun 2007 18:19

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 ;)

DeddyH 10. Jun 2007 18:32

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;

problemstoffe 10. Jun 2007 19:35

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.

cruiser 10. Jun 2007 19:56

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;

problemstoffe 11. Jun 2007 14:25

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.

Tyrael Y. 11. Jun 2007 14:41

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:
type
  TForm1 = class(TForm)
  private
    Auswahl: Integer;
  public
    { Public declarations }
  end;
und benutze diese Variable.

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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Auswahl := 0;
end;
...und folgendes in deine Umrechnen Methode.

Delphi-Quellcode:
procedure TForm1.UmrechnenClick(Sender: TObject);
begin
  if Auswahl = 0 then Exit;
end;
..damit hast du auch noch geprüft, ob dein Initialwert drin steht oder ein neuer Wert.
Die letzen beiden Punkte sind kein muss in deinem Fall, aber soll mehr dem Lernen und sauberem programmieren in späteren Projekten helfen.

problemstoffe 11. Jun 2007 14:58

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...

Tyrael Y. 11. Jun 2007 15:04

Re: Edit Felder voneinander Abhängig / Umrechnung
 
...jetzt seh ich wo du den Fehler mit den inkompatiblem Typen hast

zB hier

Delphi-Quellcode:
rea.Text := FloatToStr( round (StrToFloat(fah.Text-32) * 4 div 9))
so muss das lauten

Delphi-Quellcode:
rea.Text := FloatToStr( round (StrToFloat(fah.Text)-32) * 4 div 9))
Du hast versucht von dem Zeichen eine Zahl abzuziehen, daß geht natürlich nicht. Erst umwandeln, dann rechnen.

problemstoffe 11. Jun 2007 15:18

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Ja jetzt ist es fast fertig!

Ich habe das nun so eingegeben
Delphi-Quellcode:
rea.Text := FloatToStr( round (StrToFloat(fah.Text)-32.00) * 4 div 9)
Funktioniert soweit prima nur nun müsste ich noch die else anweisung reinbringen sonst treten machnmal kleine differenzen beim Umrechnen auf...

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!

Tormentor32 11. Jun 2007 15:24

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Ganz grob funktioniert eine if-Anweisung so:
Delphi-Quellcode:
if xyz=acb then
  begin
  end
else
  begin
  end;
Wichtig: vor dem else kein Semikolon!

Tyrael Y. 11. Jun 2007 15:25

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:
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;
Aufgabe:
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 ;)

DeddyH 11. Jun 2007 15:46

Re: Edit Felder voneinander Abhängig / Umrechnung
 
Wo wird i denn mit einem Wert belegt?

problemstoffe 11. Jun 2007 15:52

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