AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi tedit.onchange schluckt ersten Wert bei Iteration
Thema durchsuchen
Ansicht
Themen-Optionen

tedit.onchange schluckt ersten Wert bei Iteration

Ein Thema von DrUArn · begonnen am 2. Apr 2012 · letzter Beitrag vom 4. Apr 2012
Antwort Antwort
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#1

tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 21:51
Hi,
ein Problem beim Iterieren bei Nutzung von onchange-Ereignis:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    button1:tbutton;
    edit1:tedit;
    memo1:tmemo;// nur zur Darstellung
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
memo1.lines.Add(tedit(sender).text)
end;

procedure TForm1.Button1Click(Sender: TObject);
 var i:integer;
begin
    if tbutton(sender).tag =0 then
      for I := 1 to 3 do
         begin
// memo1.lines.Add(inttostr(i));
         edit1.text:=inttostr(i)
         end
    else
      for I := 3 downto 1 do
       begin
// memo1.lines.Add(inttostr(i));
       edit1.text:=inttostr(i);

       end;

memo1.lines.Add('_____');

if tbutton(sender).tag=0 then tbutton(sender).tag:=1 else tbutton(sender).tag:=0;
end;
Beim Betätigen des Tbutton wird der jeweils erste Wert der Iteration nicht bearbeitet in onchange - d.h. onchange wird gar nicht gerufen.
Verändert man Tag nicht, werden immer alle Werte bearbeitet.

Das direkte Eifügen mit "memo1.lines.Add(inttostr(i))" führt zum richtigen Ergebnis.

Auch wenn man zwei tbutton nutzt - einen für die "to"-, den anderen für die "downto"-Iteration passiert beim Wechseln zwischen diesen Buttons das Gleiche!

Woran liegt das ?


MfG Uwe

Geändert von DrUArn ( 2. Apr 2012 um 21:53 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.869 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 21:55
Der Wert wird zwar in den Edit geschrieben, aber er wird wieder überschrieben, bevor der Event ausgelöst wird.
Markus Kinzler
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 22:03
Hi,

Der Wert wird zwar in den Edit geschrieben, aber er wird wieder überschrieben, bevor der Event ausgelöst wird.
Aber wie löst diese Änderung von Tag das Überschreiben aus? Ändere ich Tag nicht (bzw. wenn ich zwei Buttons benutze jeweils den einen nur drücke, dann kommt beim zweiten Drücken des gleichen Buttons das richtige Ergebnis).


MfG Uwe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#4

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 22:04
Nee, genau anders.

Da der Text im Edit nicht "verändert" wird, wird auch kein OnChange aufgerufen.

Delphi ist so intelligent und prüft, ob sich der Text wirklich ändert.
Zitat:
Delphi-Quellcode:
procedure TControl.SetText(const Value: TCaption);
begin
  if GetText <> Value then
    ...
end;
Tag ist ein reines Datenproperty, welches nur für den Programmierer da ist ... dort reagiert niemand auf eine Änderung, weil es der VCL vollkommen egal ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Apr 2012 um 22:06 Uhr)
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 22:16
OK,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 var i:integer;
begin
    if tbutton(sender).tag =0 then
      for I := 1 to 3 do
         begin
         edit1.text:='9999';
// memo1.lines.Add(inttostr(i));
         edit1.text:=inttostr(i)
         end
    else
      for I := 3 downto 1 do
       begin
       edit1.text:='9999';
// memo1.lines.Add(inttostr(i));
       edit1.text:=inttostr(i);

       end;

memo1.lines.Add('_____');

if tbutton(sender).tag=0 then tbutton(sender).tag:=1 else tbutton(sender).tag:=0;
end;
So geht das dann erst einmal - kann man nun delphi zwingen diese Prüfung zu unterlassen?


oder so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 var i:integer;
     ereignis:tereignishprozedure// ???? fällt mir grad' nicht ein, welche var das sein müßte
begin
    if tbutton(sender).tag =0 then
      for I := 1 to 3 do
         begin
         ereignis:=edit1.onchange;
         edit1.onchange:=nil;
         edit1.text:='9999';
         edit1.onchange:=ereignis;
// memo1.lines.Add(inttostr(i));
         edit1.text:=inttostr(i)
         end
    else ....

       end;

memo1.lines.Add('_____');

if tbutton(sender).tag=0 then tbutton(sender).tag:=1 else tbutton(sender).tag:=0;
end;
... sieht sehr masochistisch aus.

oder

procedure TControl.SetText(const Value: TCaption);
begin
if GetText <> Value then
...
end;

überschreiben???


MfG Uwe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#6

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 22:24
Nee, wozu? (OK, aber wozu sich jetzt mit der WinAPI oder über Perform an das Edit wenden, nur um etwas Falsches zu machen )
OnChange gibt an, daß sich der Wert geändert hat und geändert hat er sich schließlich nicht.

Du kannst aber dein ChangeEreignis auch manuell aufrufen.

Delphi-Quellcode:
Edit1Change(nil);
oder
if Assigned(Edit1.OnChange) then Edit1.OnChange(nil);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Apr 2012 um 22:27 Uhr)
  Mit Zitat antworten Zitat
DrUArn

Registriert seit: 20. Mär 2003
130 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: tedit.onchange schluckt ersten Wert bei Iteration

  Alt 2. Apr 2012, 22:55
Nee, wozu? (OK, aber wozu sich jetzt mit der WinAPI oder über Perform an das Edit wenden, nur um etwas Falsches zu machen )
OnChange gibt an, daß sich der Wert geändert hat und geändert hat er sich schließlich nicht.

Du kannst aber dein ChangeEreignis auch manuell aufrufen.

Delphi-Quellcode:
Edit1Change(nil);
oder
if Assigned(Edit1.OnChange) then Edit1.OnChange(nil);
Ist korrekt, onchange nur bei geänderten Werten - heißt so und soll's auch tun!
Über direktes rufen muß ich erst mal nachdenken.

Erst mal Danke an alle Diskutanten

Uwe
  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 11:22 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