Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi dynam erzeugten TShape OnMouseDown-Prozedur übergeben (https://www.delphipraxis.net/61308-dynam-erzeugten-tshape-onmousedown-prozedur-uebergeben.html)

fwsp 19. Jan 2006 18:16


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:
[Fehler] UKlavier.pas(102): E2010 Inkompatible Typen: 'TShape' und 'Class reference'
die erzeugung funktioniert einwandfrei.

das ist der Teil wo zugewiesen wird:

Delphi-Quellcode:
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;
und das ist die prozedur die zugewiesen werden soll:
Delphi-Quellcode:
procedure TFKlavier.TasteDruecken(Sender: TShape);
begin
 if Sender is TShape then
  FMain.MidiOutput.PutShort($90, Sender.Tag, 65);
end;
danke.

Khabarakh 19. Jan 2006 18:22

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
 
Zitat:

Zitat von fwsp
Delphi-Quellcode:
   Klaviatur[i].Taste.OnMouseDown:= TasteDruecken;

Außerdem muss der EventHandler genau die gleiche Signatur wie der TMouseEvent-Delegate-Funktionszeiger (babylonische Sprachverwirrung :stupid: ) haben.
Delphi-Quellcode:
type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;

fwsp 19. Jan 2006 18:27

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
 
ich bin ein wenig verwirrt, ich weiß nicht genau wie ich diese informationen umsetzen soll...

Khabarakh 19. Jan 2006 18:38

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:
procedure TFKlavier.TasteDruecken(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Entscheidend für die Gleichheit zweier Signaturen sind
  • Die Gleichheit der Argumenttypen (in der richtigen Reihenfolge)
  • jeweils die Gleichheit der Argumentmodifier (const, var, out)
  • ob beide Funktionen lokale Funktionen oder Methoden sind (of object)

fwsp 19. Jan 2006 18:53

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
 
das heißt ich müsste die funktion einfach anpassen, aber dabei mache ich irgendeinen fehler...

Khabarakh 19. Jan 2006 18:59

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
 
Zitat:

Zitat von fwsp
das heißt ich müsste die funktion einfach anpassen, aber dabei mache ich irgendeinen fehler...

Meine Glaskugel verrät mir, dass du in Zeile 42 ein Semikolon vergessen hast. Der würde ich aber eher nicht vertrauen, sondern lieber Fehlermeldung und Zeile von dir selbst hören :wink: .

fwsp 20. Jan 2006 09:48

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben
 
problem gelöst:
Delphi-Quellcode:
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.
so?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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