Cool, es funktioniert! Vielen Dank! Ich hab's zwar immer noch nicht so ganz geblickt, wer hier was von wem und überhaupt erbt, aber irgendwann kommt das auch noch. Wenn man's blickt, ist
OOP doch irgendwie eine nette Sache...
P.S.
FEdit:=TEdit.Create(Self); FEdit.Parent:=Self; hatte ich entsprechend deiner Empfehlung auch probiert, gab aber Schutzverletzung
Falls es jemand interessiert (und jemand genauso lange grübelt wie ich), hier die Langform...
Delphi-Quellcode:
type TInputBlock = class(TPanel)
private
FPanel: TPanel;
FEdit: TEdit;
FOnChange: TNotifyEvent;
...
protected
procedure Change(Sender: TObject);
...
public
property OnChange: TNotifyEvent read FOnChange write FOnChange;
constructor Create(InputData: TInputData; InputDDName: TInputDDNames; parent: TWinControl; col: integer);
...
end;
...
constructor TInputBlock.Create(InputData: TInputData; InputDDName: TInputDDNames; parent: TWinControl; col: integer);
begin
...
FPanel:= TPanel.Create(parent);
FPanel.Parent := parent;
FPanel.SetBounds(0,(col-1)*25,250,25);
...
FEdit:=TEdit.Create(FPanel);
FEdit.Parent:=FPanel;
FEdit.SetBounds(120,2,60,20);
FEdit.Text := dd2s(FInputData[FInputDDName],-1);
FEdit.OnChange := Change;
...
end;
...
procedure TInputBlock.Change;
var dd: Double;
begin
if s2dd(FEdit.Text,dd) then
begin
// erfolgreiche Umwandlung in Double => Wert speichern
FInputData[FInputDDName] := dd;
FEdit.Color:= clYellow;
...
end else begin
FEdit.Color:= clRed;
...
end;
if Assigned(FOnChange) then FOnChange(Self);
inherited;
end;
...
Sowie im Form
Delphi-Quellcode:
procedure TFormSingle.FormCreate(Sender: TObject);
begin
...
inpX := TInputBlock.Create(myData,iTS,scrInput, col);
inpX.OnChange := InputChanged;
...
end;
procedure TFormSingle.InputChanged(Sender: TObject);
begin
...
Label1.Caption := 'Test';
...
end;
Ergebnis: bei einer Änderung des Eingabefeldes wird zuerst die "innere" Routine (z.B. für die Eingabeprüfung) und dann die "äußere" (z.B. um andere Felder zu ändern) durchlaufen