Zusammenfassung: ein Formular (Loan Form) erstellt dynamisch ein modales Formular namens DatePickerForm (wenn Benutzer auf eine bestimmte Schaltfläche klickt). Nach der Auswahl eines Datums in der DatePickerForm klickt der Benutzer auf die Schaltfläche "Schließen" des Formulars: (a BitBtn) - dies verursacht einen Zugriffsverletzungsfehler.Delphi (Seattle) - Schließen eines dynamisch erstellten modalen Formulars verursacht Zugriffsverletzung
Details:
Der Zweck des wieder verwendbaren modal DatePickerForm ist der Eingabe Daten unter besonderen Umständen Benutzer eine einheitliche Art und Weise zur Verfügung zu stellen. Es wird in mehreren anderen Situationen verwendet werden - das heißt, wenn ich es wie geplant zum Laufen bekomme.
Genauer Fehlertext ist: "Projekt ABCD.exe ausgelöst Ausnahmeklasse $ C0000005 mit Meldung 'Zugriffsverletzung bei 0x0060d0b1: Lesen der Adresse 0x00000000'."
Der Code kompiliert und das Programm funktioniert gut, bis Schritt 4 unter:
Laufzeit Prozess:
- Der Benutzer klickt auf eine Schaltfläche auf der Leihformular (arbeitet)
- Das modale Formular DatePickerForm wird erstellt (Besitzer: Application) und dann angezeigt. (funktioniert)
- Der Benutzer wählt ein Datum aus dem DatePicker-Steuerelement aus. (arbeitet)
- Der Benutzer klickt auf die Schaltfläche OK (nicht)
- Die DatePickerForm schließen und wir sollten auf die Loan Form zurückkehren - aber der Fehler auftritt statt.
- Der nächste Schritt noch das Datum lesen würde auf dem Formular Datepicker Kontrolle des Datepicker (die Form noch vorhanden ist, ist es an dieser Stelle nur unsichtbar ist)
Meine Fragen:
A) Sollte das funktionieren oder verwende ich dynamische Formularerstellung falsch?
B) Gibt es einen besseren Weg, dies zu erreichen?
Jede Hilfe wird geschätzt.
John
DatePickerForm Code (gesamt):
unit DatePicker_PopupForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls;
type
TfmDatePicker_Popup = class(TForm)
DTDatePicker: TDateTimePicker;
lblDatePrompt: TLabel;
btnOK: TBitBtn;
procedure btnOKClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmDatePicker_Popup: TfmDatePicker_Popup;
implementation
{$R *.dfm}
procedure TfmDatePicker_Popup.btnOKClick(Sender: TObject);
begin
fmDatePicker_Popup.CloseModal;
end;
end.
Leihformular - Teilcode (vollständige Code ist in etwa 9700 Zeilen lang)
unit LoanForm;
interface
uses
Winapi.Windows, ......, DatePicker_PopupForm;
...
implementation
...
procedure TfmLoan.btnSetDefaultClick(Sender: TObject);
begin
DatePickerForm := TfmDatePicker_Popup.Create(Application);
DatePickerForm.DTDatePicker.Date := GD_ProcessDate;
DatePickerForm.ShowModal;
dDefaultDate := DatePickerForm.DTDatePicker.Date;
end;
...
end.
Dank David - das tat es !!!! Ich werde das definitiv weiter studieren müssen (ich hasse es nicht zu verstehen, wie die Dinge funktionieren). Danke - John –