Edit.Modified in Lazarus?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
weber_8722
Beiträge: 27
Registriert: Mo 17. Feb 2014, 10:11

Edit.Modified in Lazarus?

Beitrag von weber_8722 »

Hallo,

habe jahrelang mit Delphi programmiert und bin nun aber auch mit Lazarus hochzufrieden. Ein Unterschied wundert mich aber noch und macht die Handhabung eines TEdits schwierig.

In Delphi geht so etwas prima:

Code: Alles auswählen

procedure TFormMain.EditSpecLimChange(Sender: TObject);
var
  st: string;
begin
   If EditSpecLim.Modified then Begin 
    st := EditSpecLim.Text;
    SpecLim := fvalx(st); // meine Funktion zur Umwandlung string zu real
    SpecLim := Begrenzungd(SpecLim, 1, 100); // meine Funktion zur Begrenzung von reals
    Berechnen; // Hier wird vieles neu berechnet - [b]auch Speclim selber könnte davon betroffen sein[/b]!
  end;
end;   
 
Der Trick ist ich möchte schon beim Tippen unmittelbar sehen wie die Eingabe die Berechnungen beeinflusst, die meist in anderen TEdits ausgeben werden.

Aber unter Lazurus geht .Modified nicht korrekt und man kann in einer Endlosschleife landen!!
Deshalb habe ich diesen Workaround eingebaut:

Code: Alles auswählen

procedure TFormMain.EditSpecLimChange(Sender: TObject);
var
  st: string;
begin
 
  if not SimilarNumbers(SpecLim, fValx(EditSpecLim.Text), 3) and
    (EditSpecLim.Text <> '') then
  begin // now pretty good!!!
   .... siehe oben!!
end;
Dadurch wird die die Endlosschleife oder Mehrfachberechnung unterbrochen - ist aber nicht sehr elegant!

Ich möchte, wenn intern SpecLim geändert wird zwar das TEdit aktualisieren, aber nicht noch einmal alles berechnen lassen.

In Firemonkey gibt es beim TEdit deshalb einen Split:

Man hat OnChange und OnTyping -das ist oft ganz praktisch. :D
Geht das auch in Lazarus???

Eine einfache Aufgabe wo man so etwas braucht ist z.B. wenn man aus Weg und Zeit die Geschwidigkeit v=s/t brechnen will. Wenn ich t eingebe, möchte ich z.B. v aktualisieren (s=const). Wenn ich v eingebe möchte ich z.B. t aktualiseren (s=const). Was jewals konstant gehalten werden soll könnten man per RadioButton festlegen - aber entscheidend ist das jeder TEdit sowohl Eingabe als auch Ausgabe sein kann!!!!

Hat jemand eine Idee? :D

Viele Grüße
Stephan
Zuletzt geändert von Lori am So 6. Sep 2015, 11:48, insgesamt 1-mal geändert.
Grund: Highlighter

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Edit.Modified in Lazarus?

Beitrag von Michl »

Hast du z.B. drei Editfelder für v, s und t, die jeweils entsprechend einer Eingabe angepasst werden, bräuchtest du eigentlich nur zu testen, welche Eingabe der Nutzer gemacht hatte. Das Beispiel funktioniert auch, wenn die drei Editfelder von außen her neu gefüllt würden:

Code: Alles auswählen

procedure TForm1.edtVChange(Sender: TObject);
begin
  if not edtV.Focused then Exit;
  edtS.Text := IntToStr(Random(100));
  edtT.Text := IntToStr(Random(100));
end;
 
procedure TForm1.edtSChange(Sender: TObject);
begin
  if not edtS.Focused then Exit;
  edtV.Text := IntToStr(Random(100));
  edtT.Text := IntToStr(Random(100));
end;
 
procedure TForm1.edtTChange(Sender: TObject);
begin
  if not edtT.Focused then Exit;
  edtS.Text := IntToStr(Random(100));
  edtV.Text := IntToStr(Random(100));
end; 
Das ist wirklich nur ein einfaches Beispiel. Generell würde ich Eingabe und Logik von einander trennen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten