Hallo,
folgendes Problem (
OOP-Anfänger
): wie kann ich bei eigenen Edit-Objekten sowohl im Objekt als auch außerhalb (im Formular) auf OnChange reagieren?
Konkret: da ich in einem Formular viele Eingabefelder mit angrenzenden Textfeldern und besonderem Verhalten brauche, habe ich mir ein eigenes Objekt hierfür gemacht
Delphi-Quellcode:
type TInputBlock = class(TEdit)
private
FEdit: TEdit;
...
protected
procedure edtChange(Sender: TObject);
...
public
constructor Create(InputData: TInputData; InputDDName: TInputDDNames);
procedure ShowBox(parent: TWinControl; col: integer);
//procedure OnChange2(Sender: TObject);
...
end;
procedure TInputBlock.ShowBox(parent: TWinControl; col: integer);
begin
...
FEdit:=TEdit.Create(FPanel);
FEdit.Parent:=FPanel;
FEdit.Name := 'edt_'+IntToStr(col);
FEdit.SetBounds(120,2,60,20);
FEdit.Text := dd2s(FInputData[FInputDDName],-1);
FEdit.OnEnter := edtEnter;
FEdit.OnExit := edtExit;
FEdit.OnKeyPress := edtKeyPress;
FEdit.OnChange := edtChange;
...
end;
procedure TInputBlock.edtChange(Sender: TObject);
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
// Umwandlung fehlgeschlagen
FEdit.Color:= clRed;
end;
end;
//procedure TInputBlock.OnChange2(Sender: TObject);
//begin
// edtChange(Sender);
//end;
Im FormCreate meines Formulars werden diese InputBoxen jetzt instantisiert und gezeichnet (kann man sicherlich auch zusammenfassen, aber egal):
Delphi-Quellcode:
inpX := TInputBlock.Create(myData,iTS);
inpX.ShowBox(scrInput, col);
...
Soweit klappt das gut: kann im Formular viele Felder erzeugen, die ihre Werte bei Eingabe automatisch prüfen und wegsichern bzw Fehleingaben verhindern und durch Farbe kennzeichnen, also jedes Feld für sich verarbeitet intern das OnChange über edtChange.
Allerdings müssen die Boxen untereinander Wechselwirkung haben, d.h. bei Eingabe/Auswahl bestimmter Werte z.B. in Box inpX (Comboboxen kommen noch) muss sich der Inhalt von Box inpY und inpZ entsprechend anpassen. Also sollte ich im Formular ebenfalls auf OnChange reagieren, aber natürlich das Basisverhalten der Box behalten/erben.
Ich dachte mir, ich könne im Formular eine eigene, zentrale Procedure machen, die ich dem OnChange jeder Box zuweise und die somit zuerst durchlaufen wird, und dann aber seinerseits die jeweilige Original-Routine aufruft (daher auch mal der Versuch mit OnChange2, um OnChange nicht zu überschreiben)
Delphi-Quellcode:
inpX.OnChange := InputChanged;
...
procedure TFormSingle.InputChanged(Sender: TObject);
begin
...
if Sender is TInputBlock then TInputBlock(Sender).OnChange(Sender);
...
end;
Aber leider wird immer noch die edtChange direkt durchlaufen, die InputChanged wird gar nicht erst aufgerufen.
Wo liegt der Denkfehler, kann mir da jemand vielleicht bitte einen Tipp geben?
Gruß, jokeBB