![]() |
Proceduren von untergeordneten Objekten
Hallo ich versuche gerade von einem Objekt, welches ein Stringgrid Objekt beinhaltet, welches wiederum ein TEdit Objekt beinhaltet auf das OnChange Ereignis des Objektes mit dem Editfeld zuzugreifen, also das innerste Objekt.
Kann ich im obersten Objekt die "procedure Change" des TEdit Objektes neu definieren? Und welche Parameter muss ich dann angeben? Ich hoffe es ist einigermaßen klar geworden was ich will. Also quasi so wie das automatisch passiert wenn, auf ein erstelltes Edit feld doppelklickt:
Delphi-Quellcode:
müsste dass dann bei meinem obersten Objekt in etwa so aussehen?:
type
TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure Edit1Change(Sender: TObject); privatt
Delphi-Quellcode:
type
ToberstesObjekt = class public ObjektStrGridEdit : TObjekt1; procedure Change(Sender: TObjekt1); end; |
Re: Proceduren von untergeordneten Objekten
Da TObjekt1 ja wohl von TObject abgeleitet ist, müsste das eigentlich so funktionieren. Aber was spricht gegen Ausprobieren?
|
Re: Proceduren von untergeordneten Objekten
Ja klappt aber leider nicht :(
Hier mal die Typ Definitionen:
Delphi-Quellcode:
type
TObjektMit2Objekten = class public Objekt1 : TObjekt1; constructor Create(ZuBenutzendesFormular : TWinControl); destructor Destroy; override; procedure Change(Sender: TObject1); end; type TObjekt2 = class(TEdit) public constructor Create(AOwner: TComponent); override; procedure Change(); override; end; type TObjekt1 = class(TStringGrid) public Objekt2 : TObjekt2; constructor Create(AOwner: TComponent; Anders : byte); reintroduce; destructor destroy; override; procedure Change(Sender : TObjekt2); end; |
Re: Proceduren von untergeordneten Objekten
Klappe kaputt :gruebel:
Du must die Ereignisbehandlungsroutine zuweisen
Delphi-Quellcode:
MyStringgrid.MyEdit.OnChange := Change;
|
Re: Proceduren von untergeordneten Objekten
Ich würde dir raten, keine Objekte die zur Benutzeroberfläche gehören zu grösseren Objekten zusammenzubauen.
Das endet regelmässig in der Sackgasse, weil das entstehende Objekt sehr unflexibel wird. Mal angenommen du hast einen "Geburtstag-Geschenke-Planer". In einem Edit-Feld gibt man den Namen eines Freundes ein und im Stringgrid darunter werden die potentiellen Geschenke mit Preis aufgelistet. Man kann die Geschenke editieren und sie nach der "Wunschpriorität" ordnen. Man könnte jetzt auf die Idee kommen, das TEdit und das Stringgrid zu einer Einheit zusammenzufassen. Das ist aber wie gesagt unflexibel und schwer zu testen. Stattdessen sollte man lieber die ganze Logik (Laden und Speichern der Geschenkeliste,...) in eine TGeschenkePlaner-Klasse bringen und die Schicht zwischen Benutzeroberfläche und dieser Klasse möglichst dünn machen. D.h. wenig Code im Formular und möglicht viel Logik in der TGeschenkePlaner-Klasse. |
Re: Proceduren von untergeordneten Objekten
Wenn es um Komponenten geht, kann das noch sinnvoll sein (Composite Controls), aber das ist ja hier nicht gegeben.
|
Re: Proceduren von untergeordneten Objekten
Ich habe das ganze jetzt mal vereinfacht aber es klappt auch so nicht.
Wo genau muss ich die Ereignisbehandlungsroutine hinzufügen? Hier der Quelltext:
Delphi-Quellcode:
unit Unit2;
interface uses Classes, SysUtils, Variants, Math, Grids, Forms, Dialogs, Controls, StdCtrls, Windows, Messages, Graphics; type TMyObjekt2 = class(TEdit) public constructor Create(AOwner: TComponent); override; end; type TMyOberObjekt = class public MyEdit : TMyObjekt2; constructor Create(ZuBenutzendesFormular : TWinControl); destructor Destroy; override; procedure Change(Sender: TObject); end; implementation //MyEdit Methoden constructor TMyObjekt2.Create(AOwner: TComponent); begin inherited Create(AOwner); Parent := AOwner as TWinControl; Left := 400; Width := 50; AutoSize := false; Height := 32; Font.Size := 16; Text := 'MyObjekt2'; end; //OberObjekt Metoden: constructor TMyOberObjekt.Create(ZuBenutzendesFormular : TWinControl); begin inherited Create; MyEdit := TMyObjekt2.Create(ZuBenutzendesFormular); MyEdit.Width := 100; MyEdit.OnChange := Change; ////////////////////////////////???? end; destructor TMyOberObjekt.destroy; begin MyEdit.Free; Inherited destroy; end; procedure TMyOberObjekt.Change(Sender: TObject); begin ShowMessage('klappt'); end; end. EDIT: Ah hat sich erledigt ich musste die Change Methode von MyObjekt2 rausholen damit hatte ich mir scheinbar alles überschrieben. So wie es oben steht klappt es jetzt. Ist das mit der Ereignisbehandlungsroutine dann so richtig ? Danke euch! |
Re: Proceduren von untergeordneten Objekten
Die zuzuweisende Methode muss exakt dieselbe Signatur wie die Property aufweisen. Mir scheint, Du hast da diese Property mit einer protected-Methode namens Change verwechselt (ich kann aber gerade nicht nachsehen).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz