Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf Visible reagieren (https://www.delphipraxis.net/96445-auf-visible-reagieren.html)

matashen 24. Jul 2007 20:03


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:
TVisibleEvent=procedure(visiblestate:boolean)
Anschließend sollte ich die Variable definieren...wie?
Delphi-Quellcode:
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;
So und dann sollte dann noch das Ereignis ausgelöst werden, aber da häng ich jetzt komplett...

Dank im Voraus für die Hilfe

Matthias

dajuhsa 24. Jul 2007 20:11

Re: Auf Visible reagieren
 
Zitat:

Was das soll kapier ich nicht hab diese definition ausm Buch gelesen
du könntest auch z.B.
Delphi-Quellcode:
TVisibleEvent = ??? 
  private
    FOnVisible: TVisibleEvent;
    FBlubberdifasel: TVisibleEvent;
  published
    property OnVisible: TVisibleEvent read FBlubberdifasel write FOnVisible
  end;
schreiben dann wird beim lesen das blubberdifasel zurückgegeben und beim schreiben das visibleevent verändert.
zu dem anderen kann ich nix sagen würd mich auch mal interessieren

matashen 24. Jul 2007 20:38

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

sirius 24. Jul 2007 20:40

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:
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.
Edit: Der Clou war eigentlich nur die Methode "visiblechanging" zu überschreiben. Alles andere ist Zugabe.
Edit2: Nach "Hinweis" von NG verbessert (funktioniert übrigens für alle TControls)

Apollonius 24. Jul 2007 20:43

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]

Neutral General 24. Jul 2007 20:50

Re: Auf Visible reagieren
 
Hi,

Ich habe dir mal ein Beispiel für einen Button geschrieben:


Delphi-Quellcode:
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.
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 ;)

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

sirius 24. Jul 2007 20:51

Re: Auf Visible reagieren
 
Zitat:

Zitat von Apollonius
[Edit] @Sirius: Ich dachte, er wolle das mit dem normalen TImage machen. [/Edit]

Na, wenn das so ist, muss man die WndProc subclassen und .... ähhm, geht nicht; ist kein TWinControl....hmmm :gruebel:

matashen 24. Jul 2007 20:53

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:
procedure Form1.Image1Visiblechange;
begin;
shape1.visible:= not shape1.visible;
memo1.visible:= not memo1.visible;
end;
Hat irgendwie nicht so ganz geklingelt bei mir...

Gruß Matthias

sirius 24. Jul 2007 20:57

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?

matashen 24. Jul 2007 21:04

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 16:36 Uhr.
Seite 1 von 2  1 2      

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