Ich werde das mal ausführlich erläutern
:
Ich habe das Hauptformular "FMain" in der
Unit "UMain.pas". Es enthält eine Prozedur names "OverviewClick".
Die
Unit bzw. die Klasse "TFMain" verwendet eine weitere Klasse, die in der
Unit "UShapeControl.pas" gespeichert ist, um mehrere zusammengehörige Shape-Komponenten zu verwalten.
Delphi-Quellcode:
unit UMain
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, JPEG, UShapeControl, UTypes;
type
TFMain =
class(TForm)
{...}
private
procedure OverviewClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
{...}
end;
var
FMain: TFMain;
OverviewShapes: TShapeControl;
implementation
procedure TFMain.OverviewClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{...}
end;
{...}
end.
Die
Unit der Klasse TShapeControl sieht so aus:
Delphi-Quellcode:
unit UShapeControl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, UTypes;
type
TShapeControl =
class
private
FShapeArray:
array of TShape;
{...}
public
constructor Create(howMany,iWidth,iHeight: integer;
ParentObj: TWinControl =
nil;
ClickProcedure: TClickProcedure =
nil);
{...}
end;
implementation
constructor TShapeControl.Create(howMany,iWidth,iHeight: integer;
ParentObj: TWinControl =
nil;
ClickProcedure: TClickProcedure =
nil);
{ <- stimmt das so? }
var i: integer;
begin
inherited Create;
SetLength(FShapeArray, howMany);
for i:=0
to high(FShapeArray)
do
begin
FShapeArray[i] := TShape.Create(
nil);
with FShapeArray[i]
do
begin
parent := ParentObj;
height := iHeight;
width := iWidth;
left := 0;
top := 0;
brush.style := bsClear;
pen.style := psClear;
onMouseDown := ClickProcedure;
// <- Die dem Constructor übergebene Prozedur soll onMouseDown zugewiesen werden
Hide;
end;
end;
end;
{...}
end.
Der Aufruf in der
Unit UMain.pas sieht folgendermaßen aus:
Delphi-Quellcode:
// UMain.pas
OverviewShapes := TShapeControl.create(10,10,10,PMap,OverviewClick); { <- OverviewClick ist wie oben gesagt der Name der aufzurufenden Prozedur }
Dann gibt es noch die
Unit "UTypes.pas", in der der quasi Prozedurentyp deklariert ist. Sie wird in UShapeControl.pas und UMain.pas verwendet. Das muss glaub ich so sein, sonst würde ja der "Undefinierter Bezeichner"-Fehler kommen
:
Delphi-Quellcode:
unit UTypes;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TClickProcedure =
procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
implementation
end.
Das funktioniert aber hinten und vorne nicht mit der Prozedurübergabe...
Ich weiß nicht wo evtl. diese "@" hinmüssen oder irgendwo hinter eine Prozedur "of object" oder was auch immer.
Ich hoffe das war verständlich und ihr könnt mir helfen