![]() |
dynam erzeugten TShape OnMouseDown-Prozedur übergeben
moin,
für mein projekt erzeuge ich TShapes dynamisch und möchtre ihnen zur laufzeit eine OnMouseDown-prozedur an hängen, der compiler meckert aber
Delphi-Quellcode:
die erzeugung funktioniert einwandfrei.
[Fehler] UKlavier.pas(102): E2010 Inkompatible Typen: 'TShape' und 'Class reference'
das ist der Teil wo zugewiesen wird:
Delphi-Quellcode:
und das ist die prozedur die zugewiesen werden soll:
procedure TFKlavier.FormCreate(Sender: TObject);
var i, Count: integer; begin Count:= 1; ... for i:= 55 to 84 do begin Klaviatur[i].Taste.Tag:= i; Klaviatur[i].Taste.OnMouseDown:= TFKlavier.TasteDruecken(TShape); end; end;
Delphi-Quellcode:
danke.
procedure TFKlavier.TasteDruecken(Sender: TShape);
begin if Sender is TShape then FMain.MidiOutput.PutShort($90, Sender.Tag, 65); end; |
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
Zitat:
Delphi-Quellcode:
type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
|
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
ich bin ein wenig verwirrt, ich weiß nicht genau wie ich diese informationen umsetzen soll...
|
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
Meine erste Codezeile kannst du hoffentlich umsetzen :zwinker: .
Die Signatur einer Funktion ist dieser "Funktionskopf". Wenn du einem Event einen Eventhandler zuweisen willst, muss dieser die gleiche Signatur wie der Funktionszeigertyp des Events haben.
Delphi-Quellcode:
Entscheidend für die Gleichheit zweier Signaturen sind
procedure TFKlavier.TasteDruecken(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
das heißt ich müsste die funktion einfach anpassen, aber dabei mache ich irgendeinen fehler...
|
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
Zitat:
|
Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
problem gelöst:
Delphi-Quellcode:
so?
unit UKlavier;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TFKlavier = class(TForm) PnlKlavier: TPanel; procedure FormCreate(Sender: TObject); procedure TasteDruecken(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; type TKlaviatur = record Weiss: bool; Taste: TShape; end; type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; var FKlavier: TFKlavier; Klaviatur: array[55..84] of TKlaviatur; TasteDruecken:TMouseEvent; _bla1: TMouseButton; _bla2: TShiftState; implementation uses UMain; {$R *.dfm} procedure TFKlavier.FormCreate(Sender: TObject); var i, Count: integer; begin Count:= 1; for i:= 55 to 84 do if (i=56) or (i=58) or (i=61) or (i=63) or (i=66) or (i=68) or (i=70) or (i=73) or (i=75) or (i=78) or (i=80) or (i=82) then Klaviatur[i].Weiss:= False else Klaviatur[i].Weiss:= True; for i:= 55 to 84 do if Klaviatur[i].Weiss then begin Klaviatur[i].Taste:= TShape.Create(Self); with Klaviatur[i].Taste do begin Left:= 20*Count - 10; Top:= 10; Width:= 20; Height:= 85; Parent:= FKlavier.PnlKlavier; end; inc(Count); end; for i:= 55 to 84 do if Klaviatur[i].Weiss=False then begin Klaviatur[i].Taste:= TShape.Create(Self); with Klaviatur[i].Taste do begin Top:= 10; Width:= 16; Height:= 60; Brush.Color:= clBlack; Parent:= FKlavier.PnlKlavier; end; end; Klaviatur[56].Taste.Left:= 22; Klaviatur[58].Taste.Left:= 42; Klaviatur[61].Taste.Left:= 82; Klaviatur[63].Taste.Left:= 102; Klaviatur[66].Taste.Left:= 142; Klaviatur[68].Taste.Left:= 162; Klaviatur[70].Taste.Left:= 182; Klaviatur[73].Taste.Left:= 222; Klaviatur[75].Taste.Left:= 242; Klaviatur[78].Taste.Left:= 282; Klaviatur[80].Taste.Left:= 302; Klaviatur[82].Taste.Left:= 322; for i:= 55 to 84 do begin Klaviatur[i].Taste.Tag:= i; Klaviatur[i].Taste.OnMouseDown:= TasteDruecken; end; end; procedure TFKLavier.TasteDruecken(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Sender is TShape then FMain.MidiOutput.PutShort($90, TShape(Sender).Tag, 65); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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