![]() |
DevExpress : einem Edit "wirklich" den Text zuweisen
Moin,
ich werde langsam einfach nur noch wahnsinnig, mit dem Dreck. Ständig geht wieder irgendwas nicht, nach jedem Update. Wie kann man deren Edits einen Text zuweisen, so dass es immer funktioniert. Es fängt ja schon damit an, dass man tausende Properties hat, welche dafür in Frage kommen, aber Keines funktioniert immer zuverlässig. Edit.Text, Edit.EditText, Edit.EditValue, Edit.EditingText, Edit.EditingValue, ... Teilweise wird im Code von denen die Zuweisung fahrlässsig und vorallem ohne Fehlermeldung ignoriert (siehe TcxCustomTextEdit.WMSetText), manchmal wird zwar der zugewiesene Text geändert, aber anstatt der neue Text drin steht, ist das Edit dann leer und manchmal funktioniert es sogar. Das unterscheidet sich dann jeweils, ob das Edit grade den Fokus hat, sichtbar ist oder ob der Nutzer den Text geändert hatte und ob ich das sonstwo zuweise oder z.B. im OnChange eines der Edits. Aktuelles Problem: Einem Edit wird ein Text zugewiesen und im OnChange wird er aufgeteilt und ein Teil an in anderes Edit verschoben. PS: Den selben Code gibt es bei uns nochmal an einem DBEdit, wo der geänderte Text aber an das Field.AsString zugewiesen wird, wo es niemals Probleme gibt. Zuletzt hatte ich mir ein eigenes Property gebaut und einfach allem was zugewiesen, was aber nun auch nicht mehr funktioniert.
Delphi-Quellcode:
Im OnChange, mit Fokus im Edit, sind alle drei Property nach
procedure TcxButtonEdit.SetTextReal(Value: string);
begin // BIGFIX für total unverständliches und sich öfters änderndes Verhalten // TEdit.Text:=... funktioniert immer und überall // cxEdit.Text:=... wird im Edit.Properties.OnChange total ignoriert (Zuweisung wird stillschweigend einfach nicht angenommen, siehe cxTextEdit TcxCustomTextEdit.WMSetText > TCimEdit/TcxButtonEdit) // cxEdit.EditText:=... im OnChange ohne ActiveControl=Self geht (scheinbar immer) // cxEdit.EditText:=... im OnChange mit ActiveControl=Self wird vernichtet (Text ist danach leer = '') // und wer weiß was sonst noch kommt if (Text = Value) and (EditText = Value) and (EditingText = Value) then Exit; Text := Value; if (Text <> Value) or (EditText <> Value) or (EditingText <> Value) then EditText := Value; if (Text <> Value) or (EditText <> Value) or (EditingText <> Value) then EditingText := Value; end;
Delphi-Quellcode:
leer und bei den Anderen passiert nichts mehr.
Text := Value;
Wir selber wissen auch, dass es eventuell eine Endlosschleife geben könnte, wenn im OnChange der Text geändert wird, also wird vorher das OnChange-Event abgehängt und dann der Text geändert. Besonders geil, dass DevExpress beim Zuweisen an Edit.Text im OnChange das ebenfalls ignoriert. Gut, mit EditText oder EditingText lies es sich dann doch zuweisen, ABER komisch ist dann (aber auch nicht immer) und komisch ist dabei auch, dass unser OnChange dennoch doppelt aufgerufen wird, obwohl OnChange während der Änderung abgehängt war und zwar von TcxCustomTextEdit.SetEditingText . Aktuell noch Delphi XE mit ExpressEditors Library 16.2.5 |
AW: DevExpress : einem Edit "wirklich" den Text zuweisen
Ich würde da eher nicht den OnChange Event nehmen - besser wäre der OnValidate oder OnExit Event. Was spricht da dagegen?
|
AW: DevExpress : einem Edit "wirklich" den Text zuweisen
Das würde dann doch beides nur aufgerufen, wenn der Text vom User eingegeben wurde.
Wird der Text aber programmseitig geändert, dann würde das nicht ausgelöst. Aber hier kann ich es schon ins OnExit verschieben, da in diesem Fall vor der programmseitigen Zuweisung der Fokus in Eines der beiden Edits verschoben und danach wieder rausgenommen wird. Aber es muß doch möglich sein, den Dingern irgendwie einen neuen Text zuzuweisen, egal in welchem Zustand das Edit grade ist. Die doofe VCL und selbst FMX bekommen es doch auch problemlos hin. |
AW: DevExpress : einem Edit "wirklich" den Text zuweisen
Hallo Himitzu,
ich habe das in der Regel über die Properties benutzt.
Delphi-Quellcode:
und es gab dazu glaube ich entsprechende PropoertiesOnChange, etc. Events
cxComboBoxCOM.Properties.Items[cxComboBoxCOM.ItemIndex];
Delphi-Quellcode:
procedure TFrmMain.cxDateEditMeterPropertiesChange(Sender: TObject);
begin if cxDateEditMeter.Date = DateOf( Now() ) then cxTimeEditMeter.Time := TimeOf( Now() ); // Ensure Today work also with Time if cxCheckBoxDate_Use.Checked then DmCOM_Commander.DateMeter := cxDateEditMeter.Date + cxTimeEditMeter.Time else begin DmCOM_Commander.DateMeter := S4NullDate; end; end; Ich weiss jetzt nicht ob TcxEdit das auch so hat, aber ich denke schon. Probleme mit den Events hatte ich bisher nicht, aber ich habe das letzte Projekt auch noch auf Win7 und XE8, und noch nicht auf 10.2 portiert. Von DevEx möchte ich mich demnächst auch verabschieden, ich hatte es auch nicht sehr intensiv genutzt. Rollo |
AW: DevExpress : einem Edit "wirklich" den Text zuweisen
Wenn ich in so einer Sackgasse stecke, ist das immer ein Hinweis darauf, dass ich das Timing nicht verstanden habe.
Ich würde eine Methode DataWasChanged machen, die deine Änderungen erledigen. Diese Methode würde ich aufrufen: - Nach dem Befüllen der Controls durch einen neuen Datensatz - OnExit oder OnValidate des Controls Ev. findest du noch bessere Gelegenheiten - zB eine finale Validierung aller Daten, das musst du besser wissen. Wenn du unbedingt während des Tippens den Split der Eingabedaten machen möchtest, würde ich ein zusätzliches Control einführen. Dann hast du das Eingabefeld + zwei Ausgabefelder, die das Ergebnis zeigen. Aber da kenne ich deine Anforderung zu wenig. Im OnChange (welcher auch immer) zu ändern ist jedenfalls keine gute Idee + macht den Code "wackelig" und anfällig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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