Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi procedure an Mutter Klasse übergeben (https://www.delphipraxis.net/97499-procedure-mutter-klasse-uebergeben.html)

Christian18 11. Aug 2007 15:30


procedure an Mutter Klasse übergeben
 
Hallo,

kann man ganze proceduren an die Mutter Klasse übergeben?
Delphi-Quellcode:
procedure TProgramm.Entscheide(p1, p2, p3 : TProcedure);
begin
  case i of
    1 : p1; // Procedure 1 ausführen
    2 : p2; // Procedure 2 ausführen
    3 : p3; // Procedure 3 ausführen
  end;
end;
so in etwa?? funktioniert aber leider nicht.

MFG Christian18

Apollonius 11. Aug 2007 15:38

Re: procedure an Mutter Klasse übergeben
 
Ein paar Beispiele:
Delphi-Quellcode:
p1, p2, p3: procedure; //ohne Parameter
p1, p2, p3: procedure(const a:integer; var b:double); //Parameter müssen gleichen Typ haben, dürfen aber anders heißen
p1, p2, p3: function: integer; stdcall; //Funktion mit Aufrufkonvention stdcall
p1, p2, p3: procedure (param1:string) of object; //of object heißt Methode
Jetzt sollte eigentlich alles klar sein.

Christian18 11. Aug 2007 15:55

Re: procedure an Mutter Klasse übergeben
 
Hallo,

ich habe das mal probiert. Funktioniert aber leider nicht.

unit Unit2;

interface
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TProgramm = class(TForm)
    procedure KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private

  public
    FP1 : procedure;
  end;

implementation

procedure TProgramm.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if shift = [] then
    begin
      case Key of
        27 : FP1;
      end;
    end;
end;

end.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;

type
  TForm1 = class(TProgramm)
    procedure Neu(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Neu(Sender: TObject);
begin
  ShowMessage('Hallo');
end;

procedure TForm1.FormCreate(Sender: TObject);
  var p : procedure;
begin
  FP1:=Neu; // Hier der fehler [Pascal Fehler] Unit1.pas(34): E2009 Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'

  Form1.OnKeyDown:=KeyDown;
end;

end.

Christian18 11. Aug 2007 16:07

Re: procedure an Mutter Klasse übergeben
 
Hallo,

hier mal was ich eigentlich machen will. Ich habe ein Projekt mit 25 Forms. Alle dieser Forms soll auf die ESC Taste(27), Enter Taste(13), Einfg Taste(45) und Entf(46) reagieren können. Das zu programmieren ist nicht schwer. Nur habe ich nun auf jeder Form folgende procedure:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if shift = [] then
    begin
      case Key of
        13 : Edit(Sender);
        27 : Exit(Sender);
        45 : New(Sender);
        46 : Delete(Sender);
      end;
    end;
end;
Die einzelnen proceduren machen auf jeder Form etwas anderes. Nun habe ich mir gedacht erzeuge ich eine Mutter Klasse TProgramm, damit ich das nur einmal machen muss. An die Klasse TProgramm übergebe ich nun immer die proceduren die dann ausgeführt werden.

Übergeben würde ich die proceduren so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FProcedure1:=Edit(Sender);
  FProcedure2:=Exit(Sender);
  FProcedure3:=New(Sender);
  FProcedure4:=Delete(Sender);

  Form1.OnKeyDown:=KeyDown;
end;
Ist sowas möglich wie ich vorhabe??? Das ganze soll kein weiteren sinn haben. Sondern nur ein bisschen Quellcode einsparen.

MFG Christian18

Reinhard Kern 11. Aug 2007 16:25

Re: procedure an Mutter Klasse übergeben
 
Zitat:

Zitat von Christian18
Hallo,

hier mal was ich eigentlich machen will. Ich habe ein Projekt mit 25 Forms. Alle dieser Forms soll auf die ESC Taste(27), Enter Taste(13), Einfg Taste(45) und Entf(46) reagieren können. Das zu programmieren ist nicht schwer. Nur habe ich nun auf jeder Form folgende procedure:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if shift = [] then
    begin
      case Key of
        13 : Edit(Sender);
        27 : Exit(Sender);
        45 : New(Sender);
        46 : Delete(Sender);
      end;
    end;
end;
Die einzelnen proceduren machen auf jeder Form etwas anderes. Nun habe ich mir gedacht erzeuge ich eine Mutter Klasse TProgramm, damit ich das nur einmal machen muss. An die Klasse TProgramm übergebe ich nun immer die proceduren die dann ausgeführt werden.

Übergeben würde ich die proceduren so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FProcedure1:=Edit(Sender);
  FProcedure2:=Exit(Sender);
  FProcedure3:=New(Sender);
  FProcedure4:=Delete(Sender);

  Form1.OnKeyDown:=KeyDown;
end;
Ist sowas möglich wie ich vorhabe??? Das ganze soll kein weiteren sinn haben. Sondern nur ein bisschen Quellcode einsparen.

MFG Christian18

Hallo, da gibt es eine ganze Reihe von Möglichkeiten, die OO-gerechteste ist meiner Meinung nach die verwendung virtueller Methoden: du definierst Edit bereits in TProgram, aber virtuell, und überschreibst sie in allen Abkömmlingen. Das Übergeben von prozeduralen Parametern ist dabei völlig überflüssig.

Nur macht das Ganze so oder so keinen Sinn: wenn du 25 verschiedene Versionen hast, dann musst du 25 Prozeduren schreiben, ganz egal, wo du sie unterbringst. Alles was du dir bisher überlegt hast, ist sinnlose Mehrarbeit. Die in Handbüchern erläuterte Verwendung virtueller Methoden dient auch nicht der Ersparnis, sondern der Einheitlichkeit - Draw zeichnet beim Typ TRectangle eben ein Rechteck und bei TCircle einen Kreis, der Befehl ist einheitlich, was dem Programmierer das Gedächtnis schont, aber schreiben muss er natürlich 2 Methoden.

Gruss Reinhard

Christian18 11. Aug 2007 20:35

Re: procedure an Mutter Klasse übergeben
 
Hallo,

hat jemand vieleicht ein kleines Beispiel für mich???

Christian18 11. Aug 2007 21:35

Re: procedure an Mutter Klasse übergeben
 
Hallo,

so funktioniert es schonmal. Aber Neu muss so deklariert (procedure TForm1.Neu(Sender: TObject);) werden weil Neu auch ausgelöst werden soll wenn ein button geklickt wird. Ist das auch möglich???
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2;

type
  TForm1 = class(TProgramm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure Neu;
begin
  ShowMessage('sdf');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  pro:=Neu;
  Form1.OnKeyDown:=KeyDown;
end;

end.
Delphi-Quellcode:
unit Unit2;

interface

uses
  Forms, Classes;

type
  TProgramm = class(TForm)
    procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private

  public
    pro : procedure;
  end;

implementation

procedure TProgramm.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if shift = [] then
    begin
      case key of
        27 : pro;
      end;
    end;
end;

end.
LG Chris

Dax 11. Aug 2007 21:44

Re: procedure an Mutter Klasse übergeben
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Forms, Classes;

type
  TProgramm = class(TForm)
    procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private

  public
    pro : TNotifyEvent;
  end;

implementation

procedure TProgramm.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if shift = [] then
    begin
      case key of
        27 : pro(self);
      end;
    end;
end;

end.
Dazu nimmst du deinen alten Code für die andere Unit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz