![]() |
Nochmal Prozeduren Events zuweisen...
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:
Die Unit der Klasse TShapeControl sieht so aus:
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.
Delphi-Quellcode:
Der Aufruf in der Unit UMain.pas sieht folgendermaßen aus:
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.
Delphi-Quellcode:
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 :gruebel: :
// UMain.pas
OverviewShapes := TShapeControl.create(10,10,10,PMap,OverviewClick); { <- OverviewClick ist wie oben gesagt der Name der aufzurufenden Prozedur }
Delphi-Quellcode:
Das funktioniert aber hinten und vorne nicht mit der Prozedurübergabe...
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. 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 :wall: |
Re: Nochmal Prozeduren Events zuweisen...
Hallo,
probiers mal mit:
Delphi-Quellcode:
type
TClickProcedure = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; |
Re: Nochmal Prozeduren Events zuweisen...
Moin Char,
statt
Delphi-Quellcode:
schreib mal
TClickProcedure = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Code:
soweit ich das im Moment überblicke müsste es dann gehen.
TClickProcedure = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) [color=red]of object;[/color]
Durch das "of object" wird TClickProcedure zu einem Methodentyp, die intern noch einen Parameter haben, ansonsten wäre es ein normaler Prozeduretyp. Du könntest übrigens auf diese Deklaration völlig verzichten, wenn Du statt Deines TClickProcedure einfach den Typ TMouseEvent angibst. Der ist schon entsprechend vordeklariert. |
Re: Nochmal Prozeduren Events zuweisen...
Hehe gibt's das... da schreib ich nen kilometerlangen Text und dann ist die Lösung so "einfach"...
Es funktioniert jetzt, danke euch beiden :) :thuimb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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-2025 by Thomas Breitkreuz