Bildveränderung durch Mausbewegung

Für Fragen von Einsteigern und Programmieranfängern...
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

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?
Zuletzt geändert von 400kmh am Fr 11. Mär 2011, 23:49, insgesamt 1-mal geändert.

Eclipticon
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

Beitrag von Eclipticon »

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?

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

Eclipticon hat geschrieben:Fehler suchen mit Angaben wie "weiter unten"
Steht in der Prozedur "TForm1.FormCreate".
und leeren Methoden (Absicht oder Fehler?) ist etwas muessig
Keine Absicht. Vielleicht liegt da der Fehler. Ich weiß nicht, was ich da rein schreiben soll.
Zudem waere natuerlich hilfreich zu wissen, was nicht funktioniert ... compiliert das Ding nicht? Passiert nichts?
Es gibt folgende Fehlermeldungen:
(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);"

Eclipticon
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

Beitrag von Eclipticon »

Also, das hier funktioniert - versuch es doch mal nachzubauen. Im Object Inspector sind OnMouseEnter und OnMouseLeave entsprechend gesetzt ...

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.
Und im Eventhandler muss natuerlich etwas stehen, sonst wird kaum etwas passieren (OnMouseMove ist hier uebrigens IMHO der falsche, Code siehe oben).

HTH ...

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

Eclipticon hat geschrieben:Also, das hier funktioniert - versuch es doch mal nachzubauen. Im Object Inspector sind OnMouseEnter und OnMouseLeave entsprechend gesetzt ...
So kann ich das nicht in mein Programm einbauen. Da wird alles im Code erzeugt und ist zum Teil recht verschachtelt.
Und im Eventhandler muss natuerlich etwas stehen, sonst wird kaum etwas passieren
Schau Dir mal folgendes Programm an: So wie das hier bei "BeendenClick" funktioniert, stelle ich mir das auch bei MouseMove vor:

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.
(OnMouseMove ist hier uebrigens IMHO der falsche, Code siehe oben).
Es soll sich das Bild entsprechend der Position der Maus verändern, nicht nur wenn die Maus das Bild betritt oder verlässt.

MAC
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

Beitrag von MAC »

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...

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;
Der debugger meint das funktioniert...

Code: Alles auswählen

Signatur := nil;

shokwave
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

Beitrag von shokwave »

400kmh hat geschrieben:Es gibt folgende Fehlermeldungen:
(Zeile in der "Image1.OnMouseMove:=@ImageMouseMove;" steht) Error: Identifier not found "ImageMouseMove"
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:(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);"
Besagt, dass du dich verschrieben hast (Sender):

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);
Hoffe das hilft dir ein bisschen weiter.
mfg Ingo

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

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...
Bei mir kommt die Fehlermeldung "SIGSEGV".
shokwave hat geschrieben:
400kmh hat geschrieben:Es gibt folgende Fehlermeldungen:
(Zeile in der "Image1.OnMouseMove:=@ImageMouseMove;" steht) Error: Identifier not found "ImageMouseMove"
Er findet die Prozedur nicht, weil sie zu TImage1 und nicht zu TForm1 gehört, du ihm das aber nicht sagst.
Wie sagt man ihm das? Wenn ich schreibe ""Image1.OnMouseMove:=@TImage1.ImageMouseMove;" kommt die Fehlermeldung:
"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>""
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?
In "TForm1.FormCreate".

MAC
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

Beitrag von MAC »

@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 ?

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.
viel spaß.

Code: Alles auswählen

Signatur := nil;

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

MAC hat geschrieben:@400kmh : OnMouseMove:= @Form1.MouseMove; Ohne das "T" bei TForm1 - versuch das mal...
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
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

Beitrag von MAC »

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

Code: Alles auswählen

Signatur := nil;

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

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?

Maik81ftl
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

Beitrag von Maik81ftl »

Hab ich bei meinen Images auch immer gehabt. aba keine lösung gefunden . :(
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
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

Beitrag von MAC »

bei meinem programm ist das bei mir nicht so : daten siehe sigi

Code: Alles auswählen

Signatur := nil;

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Bildveränderung durch Mausbewegung

Beitrag von 400kmh »

Maik81ftl hat geschrieben:Hab ich bei meinen Images auch immer gehabt. aba keine lösung gefunden . :(
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.

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?

Antworten