Einzelnen Beitrag anzeigen

jokeBB

Registriert seit: 7. Okt 2009
Ort: Böblingen
10 Beiträge
 
Delphi 2010 Professional
 
#1

OnChange-Verarbeitung bei eigenem Edit-Objekt

  Alt 20. Apr 2010, 16:35
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
  Mit Zitat antworten Zitat