AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi dynam erzeugten TShape OnMouseDown-Prozedur übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

dynam erzeugten TShape OnMouseDown-Prozedur übergeben

Ein Thema von fwsp · begonnen am 19. Jan 2006 · letzter Beitrag vom 20. Jan 2006
Antwort Antwort
fwsp
(Gast)

n/a Beiträge
 
#1

dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:16
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
[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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:22
Zitat von fwsp:
   Klaviatur[i].Taste.OnMouseDown:= TasteDruecken;
Außerdem muss der EventHandler genau die gleiche Signatur wie der TMouseEvent-Delegate-Funktionszeiger (babylonische Sprachverwirrung ) haben.
type TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
fwsp
(Gast)

n/a Beiträge
 
#3

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:27
ich bin ein wenig verwirrt, ich weiß nicht genau wie ich diese informationen umsetzen soll...
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:38
Meine erste Codezeile kannst du hoffentlich umsetzen .
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.
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)
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
fwsp
(Gast)

n/a Beiträge
 
#5

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:53
das heißt ich müsste die funktion einfach anpassen, aber dabei mache ich irgendeinen fehler...
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 19. Jan 2006, 19:59
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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
fwsp
(Gast)

n/a Beiträge
 
#7

Re: dynam erzeugten TShape OnMouseDown-Prozedur übergeben

  Alt 20. Jan 2006, 10:48
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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