![]() |
Auf Visible reagieren
Hallo zusammen,
ich möchte gern auf darauf reagieren wenn in meinem Programm irgendwo ein TImage.visible sich nach true bzw false ändert. Ich hab schon gelesen das man eigene Ereignisse definieren kann, aber ich steig da absolut nicht durch. Wie mach ich das ? Was ich bereits rausgefunden habe: Als erstes soll ich wohl das Ereignis definieren...so?
Delphi-Quellcode:
Anschließend sollte ich die Variable definieren...wie?
TVisibleEvent=procedure(visiblestate:boolean)
Delphi-Quellcode:
So und dann sollte dann noch das Ereignis ausgelöst werden, aber da häng ich jetzt komplett...
TVisibleEvent = ???
private FOnVisible: TVisibleEvent; published property OnVisible: TVisibleEvent read FOnVisible write FOnVisible;//<=Was das soll kapier ich nicht hab diese definition ausm Buch gelesen end; Dank im Voraus für die Hilfe Matthias |
Re: Auf Visible reagieren
Zitat:
Delphi-Quellcode:
schreiben dann wird beim lesen das blubberdifasel zurückgegeben und beim schreiben das visibleevent verändert.
TVisibleEvent = ???
private FOnVisible: TVisibleEvent; FBlubberdifasel: TVisibleEvent; published property OnVisible: TVisibleEvent read FBlubberdifasel write FOnVisible end; zu dem anderen kann ich nix sagen würd mich auch mal interessieren |
Re: Auf Visible reagieren
Leider hat dieser Hinweis bei mir jetzt mehr Verwirrung wie Klarheit ausgelöst.
Meine Alternative ist in einem Timer alle 100ms prüfen ob sich das Visible geändert hat, aber das finde ich unpraktisch hintenrum. Ich hätte das lieber als Event. Vieleicht hat noch jemand anders eine Idee??? Gruß Matthias |
Re: Auf Visible reagieren
Ich habe mal TmyImage vom Timage genommen und das Ereignis hinzugefügt. Man könnte auch die Message CM_VisibleChanged (o.ä.) abfangen. Das ist mir zu kompliziert.
Delphi-Quellcode:
Edit: Der Clou war eigentlich nur die Methode "visiblechanging" zu überschreiben. Alles andere ist Zugabe.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; //Die "neue Klasse" kann alles was TImage kann + ein neues Property namens onVisibleChange type TImage=class(ExtCtrls.Timage) private //hier wird die Methode, die gestartet werden soll in einer Variablen gespeichert FonVisibleChange:TnotifyEvent; //Die Funktion überschreiben wir mal, um das Ereignis auszulösen procedure visiblechanging; override; published //Und noch ein schönes Property drumrum, nicht zwingend notwendig, aber schöner ;-) property onVisibleChange:TNotifyEvent read FOnvisibleChange write FOnVisibleChange; end; //zum Testen type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Image1.TImage; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ImageVisibleChange(sender:Tobject); private { Private-Deklarationen } x:integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TmyImage.visiblechanging; //Diese Funktion wird bei setvisible aufgerufen und ist im Original leer begin //unser neues Ereignis auslösen FOnVisibleChange(self); //falls sie doch nicht leer ist inherited visiblechanging; end; procedure TForm1.Button1Click(Sender: TObject); //Ereignis auslösen ;-) begin image1.visible:=not image1.visible; end; procedure TForm1.ImageVisibleChange(sender:Tobject); //Die Ereignisbehandlungsroutine begin inc(x); edit1.Text:=inttostr(x); end; procedure TForm1.FormCreate(Sender: TObject); //Erstellen des Objektes und Ereigniszuweisung begin image1.FonVisibleChange:=ImageVisibleChange; end; end. Edit2: Nach "Hinweis" von NG verbessert (funktioniert übrigens für alle TControls) |
Re: Auf Visible reagieren
Ich behaupte mal ganz frech, dass das, was du willst, mit Standardmitteln nicht geht. Du hast hier, glaube ich, dein Buch völlig falsch interpretiert. So etwas kannst du machen, wenn du deine eigene Klasse von TImage ableiten willst, aber die Fragestellung sieht nicht danach aus. Die Timerlösung ist aber auch nicht das Wahre. Was willst du denn erreichen? Vielleicht gibts einen anderen Weg.
[Edit] @Sirius: Ich dachte, er wolle das mit dem normalen TImage machen. [/Edit] |
Re: Auf Visible reagieren
Hi,
Ich habe dir mal ein Beispiel für einen Button geschrieben:
Delphi-Quellcode:
Ich hoffe das erklärt sich von selbst ansonsten frag ruhig. Aber ich hab ab 22 Uhr kein Internet mehr das heißt du musst dich eventuell gedulden ;)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type // Das Event definieren TVisibleEvent = procedure(Sender: TObject; Visible: Boolean) of object; // Button neu definieren TButton = class(StdCtrls.TButton) private FOnVis: TVisibleEvent; function GetVis: Boolean; procedure SetVis(const Value: Boolean); public property Visible: Boolean read GetVis write SetVis; // Alte Visible Property überschreiben property OnVisible: TVisibleEvent read FOnVis write FOnVis; // Die Event-Property end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public procedure Test(Sender: TObject; Visible: Boolean); // Die procedure für das Event end; var Form1: TForm1; implementation {$R *.dfm} { TButton } function TButton.GetVis: Boolean; begin Result := inherited Visible; end; procedure TButton.SetVis(const Value: Boolean); begin inherited Visible := Value; if Assigned(FOnVis) then // Wenn Event gesetzt dann FOnVis(Self,Value); // ausführen end; procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnVisible := Test; // Event zuweisen end; procedure TForm1.Test(Sender: TObject; Visible: Boolean); begin ShowMessage('ALARM!'); // Alarm anzeigen wenn Sichtbarkeit geändert wurde end; procedure TForm1.Button2Click(Sender: TObject); begin Button1.Visible := false; // zum testen end; end. PS: Das sollte für Images analog funktionieren. Der Vorteil ist hierbei das die VCL Komponenten aus der IDE direkt diese neuen Properties haben und du nicht alles zur Runtime erstellen musst nur wegen dem Event. Gruß Neutral General |
Re: Auf Visible reagieren
Zitat:
|
Re: Auf Visible reagieren
Danke sirius,
jetzt hab ich mal was zum tippen, also die Lösung mit eigener Klasse, aber kapiert hab ichs nicht ganz. Ich hoff es ist nicht zu viel verlangt mir noch zu erleutern wo/wie jetzt mein ONvisible "merkt" das sich die Eigenschaft image.visible geändert hat. Ich möchte das eigentlich ja auf ein Standard TImage anwenden. Zur erläuterung: Ich habe also ein Bild das ich in Meinem Spielchen ab und zu einblende(Karte). Wenn ich dieses Bild einblende hätte ich dazu gern ein paar aktionen ausgeführt. genauso wenn das ganze ausgeblendet wird. Das stelle ich mir ungefähr so vor.
Delphi-Quellcode:
Hat irgendwie nicht so ganz geklingelt bei mir...
procedure Form1.Image1Visiblechange;
begin; shape1.visible:= not shape1.visible; memo1.visible:= not memo1.visible; end; Gruß Matthias |
Re: Auf Visible reagieren
Nachdem was NG gemacht hatte, sehe ich, dass es auch für das TImage geht :zwinker:
Einfach so ändern, wie ichs nochmal geändert habe Edit: Was verstehst du denn an einer eigenen Klasse nicht? |
Re: Auf Visible reagieren
Hallo
Puuuhhh... also jetzt hab ichs kapiert, irgendwie erklärt das keine Buchquelle die ich besitze. Also zur wiederholung damit ichs verstanden hab. Ich muß also TImage redefinieren und die Visible-Eigenschaft überschreiben hier lös ich dann mein Ereignis aus, das ich wie sirius schon beschrieben selber definiere. Jetzt ist mir auch klar, woher dann mein Ereignis das "weis", ich sags dem Ereignis selber über die Eigenschaft. Danke zusammen, wäre ich selber nie drauf gekommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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