Bildveränderung durch Mausbewegung
Bildveränderung durch Mausbewegung
Ich möchte, dass sich ein Image verändert, wenn sich die Maus darüber bewegt.
Soweit ich weiß, muss ich dazu folgendes in den Code eingeben:
- Im Deklarationsteil unter "type":
"TImage1 = class(TImage)
Procedure ImageMouseMove(Sender: TImage1; Shift: TShiftState; X, Y: Integer);
end;"
- Im Deklarationsteil unter "var":
"Image1: TImage1;"
- unter "Form1.FormCreate":
"Image1.OnMouseMove:=@ImageMouseMove;"
Und die Prozedur:
"Procedure TImage1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
end;"
Das funktioniert allerdings nicht. Weshalb funktioniert es nicht?
Soweit ich weiß, muss ich dazu folgendes in den Code eingeben:
- Im Deklarationsteil unter "type":
"TImage1 = class(TImage)
Procedure ImageMouseMove(Sender: TImage1; Shift: TShiftState; X, Y: Integer);
end;"
- Im Deklarationsteil unter "var":
"Image1: TImage1;"
- unter "Form1.FormCreate":
"Image1.OnMouseMove:=@ImageMouseMove;"
Und die Prozedur:
"Procedure TImage1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
end;"
Das funktioniert allerdings nicht. Weshalb funktioniert es nicht?
Zuletzt geändert von 400kmh am Fr 11. Mär 2011, 23:49, insgesamt 1-mal geändert.
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: Bildveränderung durch Mausbewegung
Hi 400,
vielleicht koenntest Du den gesamten Code der Unit posten? Fehler suchen mit Angaben wie "weiter unten" und leeren Methoden (Absicht oder Fehler?) ist etwas muessig
Zudem waere natuerlich hilfreich zu wissen, was nicht funktioniert ... compiliert das Ding nicht? Passiert nichts?
vielleicht koenntest Du den gesamten Code der Unit posten? Fehler suchen mit Angaben wie "weiter unten" und leeren Methoden (Absicht oder Fehler?) ist etwas muessig

Zudem waere natuerlich hilfreich zu wissen, was nicht funktioniert ... compiliert das Ding nicht? Passiert nichts?
Re: Bildveränderung durch Mausbewegung
Steht in der Prozedur "TForm1.FormCreate".Eclipticon hat geschrieben:Fehler suchen mit Angaben wie "weiter unten"
Keine Absicht. Vielleicht liegt da der Fehler. Ich weiß nicht, was ich da rein schreiben soll.und leeren Methoden (Absicht oder Fehler?) ist etwas muessig
Es gibt folgende Fehlermeldungen:Zudem waere natuerlich hilfreich zu wissen, was nicht funktioniert ... compiliert das Ding nicht? Passiert nichts?
(Zeile in der "Image1.OnMouseMove:=@ImageMouseMove;" steht) Error: Identifier not found "ImageMouseMove"
(Zeile in der "Procedure TImage1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);" steht) Error: function header doesn't match any method of this class "TImage1.ImageMouseMove(TObject, TShiftState, LongInt, LongInt);"
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: Bildveränderung durch Mausbewegung
Also, das hier funktioniert - versuch es doch mal nachzubauen. Im Object Inspector sind OnMouseEnter und OnMouseLeave entsprechend gesetzt ...
Und im Eventhandler muss natuerlich etwas stehen, sonst wird kaum etwas passieren (OnMouseMove ist hier uebrigens IMHO der falsche, Code siehe oben).
HTH ...
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseEnter(Sender: TObject);
procedure Image1MouseLeave(Sender: TObject);
end;
var
Form1: TForm1;
implementation
procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
Image1.Stretch:= True;
end;
procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
Image1.Stretch:= False;
end;
initialization
{$I unit1.lrs}
end.
HTH ...
Re: Bildveränderung durch Mausbewegung
So kann ich das nicht in mein Programm einbauen. Da wird alles im Code erzeugt und ist zum Teil recht verschachtelt.Eclipticon hat geschrieben:Also, das hier funktioniert - versuch es doch mal nachzubauen. Im Object Inspector sind OnMouseEnter und OnMouseLeave entsprechend gesetzt ...
Schau Dir mal folgendes Programm an: So wie das hier bei "BeendenClick" funktioniert, stelle ich mir das auch bei MouseMove vor:Und im Eventhandler muss natuerlich etwas stehen, sonst wird kaum etwas passieren
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure BeendenClick(Objekt1: TObject);
end;
var
Form1: TForm1;
Button: TButton;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
Button:=TButton.Create(self);
Button.Parent:=Form1;
Button.Caption:='Beenden';
Button.OnClick:=@BeendenClick;
end;
Procedure TForm1.BeendenClick(Objekt1: TObject);
begin
close;
end;
initialization
{$I unit1.lrs}
end.
Es soll sich das Bild entsprechend der Position der Maus verändern, nicht nur wenn die Maus das Bild betritt oder verlässt.(OnMouseMove ist hier uebrigens IMHO der falsche, Code siehe oben).
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Bildveränderung durch Mausbewegung
klappt folgendes nicht:
Wir nehmen ein Image - klatschen das auf die Form und erzeugen ein OnmouseMove Ereignis.
Jetzt löschen wir das Image.
Und nehmen nen button...
Der debugger meint das funktioniert...
Wir nehmen ein Image - klatschen das auf die Form und erzeugen ein OnmouseMove Ereignis.
Jetzt löschen wir das Image.
Und nehmen nen button...
Code: Alles auswählen
type
{ TForm1 }
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Image1: TImage;
procedure BitBtn1Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
VirtuelImage:TImage;
begin
VirtuelImage := TImage.Create(Form1);
VirtuelImage.Parent := Form1;
VirtuelImage.Canvas.Line(10,10,50,50);
VirtuelImage.OnMouseMove:=@Image1MouseMove;
end;
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 475
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: Bildveränderung durch Mausbewegung
Er findet die Prozedur nicht, weil sie zu TImage1 und nicht zu TForm1 gehört, du ihm das aber nicht sagst. Es wäre IMHO besser einen Constructor und Destructor, für dein TImage1, zu bauen und im Constructor die Zuweisung zu machen. BTW wo createst du dein Image1 eigendlich?400kmh hat geschrieben:Es gibt folgende Fehlermeldungen:
(Zeile in der "Image1.OnMouseMove:=@ImageMouseMove;" steht) Error: Identifier not found "ImageMouseMove"
Besagt, dass du dich verschrieben hast (Sender):400kmh hat geschrieben:(Zeile in der "Procedure TImage1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);" steht) Error: function header doesn't match any method of this class "TImage1.ImageMouseMove(TObject, TShiftState, LongInt, LongInt);"
Code: Alles auswählen
TImage1 = class(TImage)
Procedure ImageMouseMove(Sender: TImage1; Shift: TShiftState; X, Y: Integer);
end;
....
Procedure TImage1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
mfg Ingo
Re: Bildveränderung durch Mausbewegung
Bei mir kommt die Fehlermeldung "SIGSEGV".MAC hat geschrieben:klappt folgendes nicht:
Wir nehmen ein Image - klatschen das auf die Form und erzeugen ein OnmouseMove Ereignis.
Jetzt löschen wir das Image.
Und nehmen nen button...
Der debugger meint das funktioniert...
Wie sagt man ihm das? Wenn ich schreibe ""Image1.OnMouseMove:=@TImage1.ImageMouseMove;" kommt die Fehlermeldung:shokwave hat geschrieben:Er findet die Prozedur nicht, weil sie zu TImage1 und nicht zu TForm1 gehört, du ihm das aber nicht sagst.400kmh hat geschrieben:Es gibt folgende Fehlermeldungen:
(Zeile in der "Image1.OnMouseMove:=@ImageMouseMove;" steht) Error: Identifier not found "ImageMouseMove"
"Error: Incompatible types: got "<address of procedure(TImage1, TShiftState, LongInt, LongInt) of object;Register>" expected "<procedure variable type of procedure(TObject, TShiftState, LongInt, LongInt) of object;Register>""
In "TForm1.FormCreate".Es wäre IMHO besser einen Constructor und Destructor, für dein TImage1, zu bauen und im Constructor die Zuweisung zu machen. BTW wo createst du dein Image1 eigendlich?
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Bildveränderung durch Mausbewegung
@400kmh : OnMouseMove:= @Form1.MouseMove; Ohne das "T" bei TForm1 - versuch das mal...
shockwave, meinst du er soll ne eigene klasse von TImage ableiten oder was ?
Das Folgene Beispiel Funktioniert.
Ich habe gemacht: Image1 drauf - OnMouseMove erzeugt - Image1 gelöscht. Button1 drauf...
Danach den Code einfügen:
viel spaß.
shockwave, meinst du er soll ne eigene klasse von TImage ableiten oder was ?
Code: Alles auswählen
class TMyImage = class(TImage)
private
public
constructor Create;
end;
constructor TMyImage.Create;
begin
inherited; // ruft TImage.Create auf
OnMouseMove:= @Form1.Image1MouseMove;
end;
Das Folgene Beispiel Funktioniert.
Ich habe gemacht: Image1 drauf - OnMouseMove erzeugt - Image1 gelöscht. Button1 drauf...
Danach den Code einfügen:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
);
private
{ private declarations }
public
{ public declarations }
end;
TMyImage = class(TImage)
private
public
constructor Create(AOwner:TComponent);
end;
var
Form1: TForm1;
Image:TMyImage;
implementation
{$R *.lfm}
{ TForm1 }
constructor TMyImage.Create(AOwner:TComponent);
begin
inherited; // ruft TImage.Create auf
OnMouseMove:= @Form1.Image1MouseMove;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Image.Canvas.Rectangle(0,0,Image.width,Image.height);
Image.Canvas.Line(Image.width div 2,Image.height div 2,x,y);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Image := TMyImage.Create(Form1);
Image.Parent := Form1;
end;
end.
Code: Alles auswählen
Signatur := nil;
Re: Bildveränderung durch Mausbewegung
Jetzt steigt das Programm aus mit der Fehlermeldung: "Project raised exception class 'External: SIGSEGV'." Die Zeile mit "OnMouseMove:= @Form1.MouseMove;" ist markiert. Wie kann man das beheben?MAC hat geschrieben:@400kmh : OnMouseMove:= @Form1.MouseMove; Ohne das "T" bei TForm1 - versuch das mal...
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Bildveränderung durch Mausbewegung
versuch mal das beispiel was ich im post eben auch gepostet habe - das ist ne gesammte unit.
Wenn die nicht klappt dann installiert am besten mal ne aktuelle Lazarusversion . hatte 0.9.31 29677 fpc 2.4.3
Wenn die nicht klappt dann installiert am besten mal ne aktuelle Lazarusversion . hatte 0.9.31 29677 fpc 2.4.3
Code: Alles auswählen
Signatur := nil;
Re: Bildveränderung durch Mausbewegung
Grundsätzlich funktioniert es jetzt bei mir, warum weiß ich selber nicht genau. Allerdings wird jetzt beim Bewegen der Maus über das Image, das Image immer schwarz, weshalb alles immer neu gezeichnet werden muss in der OnMouseMove-Prozedur. Dadurch flackern allerdings die gezeichneten Dinge. Weiß jemand wie man dieses Flackern beheben kann, bzw. wie man es erreicht, dass beim Aufrufen der OnMouseMove-Prozedur die bisherigen Pixelfarben übernommen werden, anstatt dass alles ersteinmal schwarz wird?
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Bildveränderung durch Mausbewegung
Hab ich bei meinen Images auch immer gehabt. aba keine lösung gefunden . 

Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Bildveränderung durch Mausbewegung
bei meinem programm ist das bei mir nicht so : daten siehe sigi
Code: Alles auswählen
Signatur := nil;
Re: Bildveränderung durch Mausbewegung
Vielleicht kann man zwei Bilder übereinanderlegen, das hintere immer das Bild des vorderen übernehmen lassen, und in den Vordergrund rücken, wenn das vordere überarbeitet wird. Wenn das vordere überarbeitet ist, könnte man es dann wieder in den Vordergrund rücken, und das zweite ihm angleichen.Maik81ftl hat geschrieben:Hab ich bei meinen Images auch immer gehabt. aba keine lösung gefunden .
Da bräuchte man nur einen Befehl mit dem man einfach allen Pixeln eines Images die Farben der Pixel eines anderen Images geben kann. Gibt es da einen Befehl?