Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   DevExpress : einem Edit "wirklich" den Text zuweisen (https://www.delphipraxis.net/193085-devexpress-einem-edit-wirklich-den-text-zuweisen.html)

himitsu 19. Jun 2017 10:27

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:
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;
Im OnChange, mit Fokus im Edit, sind alle drei Property nach
Delphi-Quellcode:
Text := Value;
leer und bei den Anderen passiert nichts mehr.

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

TigerLilly 19. Jun 2017 10:51

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?

himitsu 19. Jun 2017 11:38

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.

Rollo62 19. Jun 2017 18:40

AW: DevExpress : einem Edit "wirklich" den Text zuweisen
 
Hallo Himitzu,

ich habe das in der Regel über die Properties benutzt.
Delphi-Quellcode:
cxComboBoxCOM.Properties.Items[cxComboBoxCOM.ItemIndex];
und es gab dazu glaube ich entsprechende PropoertiesOnChange, etc. Events
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

TigerLilly 21. Jun 2017 07:14

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 05:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz