Einzelnen Beitrag anzeigen

Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Akzeptanz des Wertes im TField eines TDataSet

  Alt 3. Feb 2023, 10:26
@Papaschlumpf73:
Klingt gut, hatte aber keine Auswirkung. Der Fehler besteht weiterhin.

Es wird also irgendwo validiert, aber das nicht mit der überschriebenen "ValidierungsUndAnpassungs"-Erweiterung?
Oder wird doch deine Methode an der "richtigen" Stelle aufgerufen und die Daten kommen dennoch nicht richtig zurück?
Im OnValidate wird eine Funktion aufgerufen, die den eingegebenen Wert analysiert und ein korrektes Datum zurückliefert, wenn es machbar war. Nur solche Fälle teste ich gerade.

Dann mußt du eben schauen, wo das schief geht und dann versuchen dort auf die richtige Funktion zu gehen.
Also erstmal ab der Exception, oder z.B. bei einer MessageBox manuell den Debugger anhalten, und dann im Stacktrace zurück, bis der Verursacher gefunden wurde.
Eventuell stückchenweise zurück, also mehrmals in den Fehler laufen.
Im Stacktrace werden keine unserer selbst geschriebenen Sourcen angesprochen:
Zitat:
:7604e292 KERNELBASE.RaiseException + 0x62
rtl.System.SysUtils.ConvertErrorFmt($50075C04,(... ))
rtl.System.SysUtils.StrToDateTime('0301',('孞嵙诃嗀卑' #$DA8B'䖉诼ﱅ堺瑒譳ﱅ䂋蕌瓀謊诓ﱍ拨'#$FFD0'诿ﱅ䂋蕄瓀荇籸琀譁籀㛨ᄌ㏿嗀챨䌎摑ヿ襤謠ﱅ 墈㍒嫀奙襤栐'#$0EE1'元䖋诼䑀䂋렻'#$FFFF'xɟ�䖋'#$FFFF'䖋裼剘奛썝 䂍唀jj噓'#$D88B'쀳桕ྨ元、搰₉쎋쫨 ̄诿䡓욋㣨ﴖ藿瓀譳䱃삅⁴횋ᛨᅯ跿ﱕ䎋ᘓ�喋诼䱃䂋 躍'#1'䎍譈ɯ�䎋譨͕�'#$0875'䎍ȓ�王蕌瓶货䎋ᗕ�喋诸'#$0846'쮋ƍ謀 䑃삅'#$0874'䂋켝'#$FFFF'쀳奚摙ႉ꽨䌏赑ʺ'#0'ǣ�xƃ�孞奙썝䂍쌀䂍匀譖 诲'#$0FD8'嚶謥诃(傑'#1'謀뺵'#$FFFF'킋쎋'#$088B'釿Ĩ'#0'䛶Ц锏裀啃 䛶Ȧ锏诂ɉ'#0'纀$'#$0C74'β쎋'#$088B'釿Ġ'#0'孞參譖诲'#$0FD8'厶譐 븃'#$FFFF'쎋ႋ鋿È'#0'킋욋糨ᄒ胿啻琀༐ᖶၴ元욋죨ᄑ༎ᖶၸ元욋루ᄑ胿养琀༑嚶ਦ簕䌐譑 붡'#$FFFF'孞ÃЀ'#0#0#0'Ȁ'#0'謀䱈즅'#$0874'螑햍'#$FFFF'蓃瓒눋 謂(ₑ'#1'쌀碀ɒੵ툳'#$088B'釿Ġ', 48, 136, 'ㆍ', #0, #0, '', ))
dbrtl.Data.DB.TDateTimeField.SetAsString('0301')
dbrtl.Data.DB.TField.SetText(???)
dbrtl.Data.DB.TField.SetEditText('0301')
:018cf72c TcxDBDataProvider.SetEditValue + $64
:00e96194 TcxCustomDataController.SetEditValue + $4C
:017ddf3b TcxCustomGridTableItem.SetEditValue + $37
:017e100e TcxGridEditingController.SetValue + $12
:017e6b43 TcxCustomGridTableController.CheckEditing + $77
:017e7184 TcxCustomGridTableController.FocusNextRecord + $24
:017e7408 TcxCustomGridTableController.FocusNextRecordWithSe lection + $28
:017e754d TcxCustomGridTableController.GoToPrev + $25
:017eecfe TcxCustomGridTableView.DoEditKeyDown + $2A
:017e067e TcxGridEditingController.DoEditKeyDown + $36
:0187f364 TcxGridTableEditingController.DoEditKeyDown + $90
vcl.Vcl.Controls.TWinControl.KeyDown(???,[ssLeft,ssRight,ssMiddle,ssDouble,ssTouch,(außerhal b der zulässigen Bereichs) 12,(außerhalb der zulässigen Bereichs) 13,(außerhalb der zulässigen Bereichs) 14,(außerhalb der zulässigen Bereichs) 15])
:50cfde43 TWinControl.KeyDown + $27
:00f11093 TcxCustomMaskEdit.KeyDown + $17
vcl.Vcl.Controls.TWinControl.DoKeyDown(???)
vcl.Vcl.Controls.TWinControl.WMKeyDown((256, (), 38, 0, (), 21495809, (), 0))
vcl.Vcl.Controls.TControl.WndProc(???)
vcl.Vcl.Controls.TWinControl.WndProc((256, 38, 21495809, 0, 38, 0, (), 1, 328, (), 0, 0, ()))
rtl.System.Classes.StdWndProc(987138,256,38,214958 09)
vcl.Vcl.Forms.TApplication.ProcessMessage(???)
:50cfdedf TWinControl.DoKeyDown + $97
Wenn da Jemand etwas sehen kann, was ich übersehe, bin ich für alles offen.

Da du nicht gesagt hast, wie/wo deine Validierung/Anpassung arbeitet, würde ich jetzt auch mal ganz einfach davon ausgehen, dass dein Code auch an der falschen Stelle sein könnte und eben bei diesem Fall garnicht greifen kann. Genauso kann auch grundsätzlich der Fehler wo anders liegen, wenn im hauseigenen Delphi-Code irgendwo etwas vergessen wurde.
Etwas vereinfachter Source der Validierung:
Delphi-Quellcode:
procedure TMeineForm.DATUMPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
// Dieses Validate bezieht sich auf ein TcxEditRepositoryMaskItem
var
   Datum: TDateTime;
begin
   inherited;

   Error := not IsDatumValid(DisplayValue, Datum); // Datum ist ein "out"

   if not Error then begin
      MycxGridDBTableView.DataController.DataSet.FieldByName('DATUM').AsDateTime := Datum;
//      MycxGridDBTableView.DataController.DataSet.UpdateRecord; // Keine Wirkung
//      MycxGridDBTableView.DataController.SetEditValue(FieldIndex, Datum, evsText); // Auch ohne Wirkung

      // Diese Springerei zwischen den Feldern wirkt, ührt aber unter Umständen zu einem erneuten OnValidate und ist auch Sch...
      if not MycxGridDBTableView.Controller.EditingController.EditingItem.IsFirst then begin
         MycxGridDBTableView.Controller.FocusNextCell(True);
      end
      else begin
         MycxGridDBTableView.Controller.FocusNextCell(False);
      end;
   end
   else begin
      ErrorText := 'Ungültiges Datum!';
      AShowInfoMessage('Ungültiges Datum!');
   end;
end;
Peter
  Mit Zitat antworten Zitat