Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Proceduren von untergeordneten Objekten (https://www.delphipraxis.net/142244-proceduren-von-untergeordneten-objekten.html)

Ginko 24. Okt 2009 12:46


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:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  privatt
müsste dass dann bei meinem obersten Objekt in etwa so aussehen?:

Delphi-Quellcode:
type
  ToberstesObjekt = class
  public
    ObjektStrGridEdit : TObjekt1;
    procedure Change(Sender: TObjekt1);
  end;

DeddyH 24. Okt 2009 12:57

Re: Proceduren von untergeordneten Objekten
 
Da TObjekt1 ja wohl von TObject abgeleitet ist, müsste das eigentlich so funktionieren. Aber was spricht gegen Ausprobieren?

Ginko 24. Okt 2009 13:27

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;

Tryer 24. Okt 2009 13:35

Re: Proceduren von untergeordneten Objekten
 
Klappe kaputt :gruebel:

Du must die Ereignisbehandlungsroutine zuweisen
Delphi-Quellcode:
MyStringgrid.MyEdit.OnChange := Change;

sx2008 24. Okt 2009 14:15

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.

DeddyH 24. Okt 2009 14:24

Re: Proceduren von untergeordneten Objekten
 
Wenn es um Komponenten geht, kann das noch sinnvoll sein (Composite Controls), aber das ist ja hier nicht gegeben.

Ginko 24. Okt 2009 15:11

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!

DeddyH 24. Okt 2009 20:10

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