Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TImage Objekt als Sender nutzen (https://www.delphipraxis.net/162002-timage-objekt-als-sender-nutzen.html)

Nightblade 1. Aug 2011 19:08

TImage Objekt als Sender nutzen
 
Hallo.

Durch die Hilfe des Forums habe ich eine Procedur bekommen, mit der ich alle Bilder eines Form auf einmal unsichtbar machen kann. Nun spreche ich die Procedur wie folgt an:

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin

leiterauswahl.OnChange := ShowImageHideOther;
end;
 {Durch diesen aufruf soll folgende Procedur gestartet werden}

procedure TLeitern.ShowImageHideOther(Image: TImage);
var
  i: Integer;
begin
  for i := 0 to Pred(ControlCount) do
    if (Controls[i] is TImage) then
      TImage(Controls[i]).Visible := Controls[i] = Image;
end;
Nun bringt delphi aber den Fehler:

[Error] Leiter.pas(367): Incompatible types: 'TObject' and 'TImage'

Ich habs schon mit

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
var ShowImageHideOther:timage;
begin
  if Sender is TImage then
BEGIN
ShowImageHideOther:= TImage(Sender);
END;
probiert klappt aber auch nicht
[Error] Leiter.pas(371): Incompatible types: 'TNotifyEvent' and 'TImage'

Kann mir hier noch mal einer auf die Sprünge helfen? Damit hätte ich dann alle meine Probleme gelöst und könnte das Programm endlich vollständig fertig stellen.

Bitte um Hilfe. Ich weiß nicht mal, ob ich die Procedur korrekt anspreche.

Vielen Dank.

haentschman 1. Aug 2011 19:24

AW: TImage Objekt als Sender nutzen
 
Hallo...

du mußt jedesmal Controls nach TImage casten...
Delphi-Quellcode:
TImage(Controls[i]).Visible := TImage(Controls[i]) = Image;
...vorausgesetzt Image ist auch ein TImage

mkinzler 1. Aug 2011 19:55

AW: TImage Objekt als Sender nutzen
 
Oder dir die gecastetet Referenz in einem entsprechenden typ zwischenspeichern:

Delphi-Quellcode:
procedure ...
var
   imgSender: TImage;
...
begin
...
  try
    imgSender := (Sender as Timage);
    ...
  except
      ...
  end;
   ...
end;

Nightblade 1. Aug 2011 19:58

AW: TImage Objekt als Sender nutzen
 
Das verstehe ich leider nicht. Ich bin blutigster Anfänger was Delphi angeht.
Image sollte tatsächlich ein Bild sein, da durch den Befehl nur alle TImages unsichtbar gemacht werden sollen. Ohne jedesmal xxx.visible:= false; etc. einzutragen.

Wo genau soll ich
Code:
TImage(Controls[i]).Visible := Controls[i] = Image;
noch eintragen.

Hab´s jetzt mal so probiert:

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
var ShowImageHideOther:timage;
begin
  if Sender is TImage(Controls[i]).Visible := Controls[i] = Image; then
BEGIN
ShowImageHideOther:= TImage(Controls[i]).Visible := Controls[i] = Image;(Sender);
END;
leiterauswahl.OnChange := ShowImageHideOther;
{Also hinter jedes TImage den Befehl dahinter geschrieben.}
Jetzt kommt fehlermeldung:
[Error] Leiter.pas(367): Undeclared identifier: 'Image'
[Error] Leiter.pas(369): Incompatible types
[Error] Leiter.pas(371): Incompatible types: 'TNotifyEvent' and 'TImage'
[Hint] Leiter.pas(99): Private symbol 'ShowImageHideOther' declared but never used

Ich will doch bloss alle Bilder verschwinden lassen.:pale:

Nightblade 1. Aug 2011 20:24

AW: TImage Objekt als Sender nutzen
 
Wenn ich´s richtig umgesetzt habe.

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
var{Zwischenspeichervorschlag von mkinzler}
   imgSender: TImage;
begin
  try
    imgSender := (Sender as Timage);
    leiterauswahl.OnChange := ShowImageHideOther;
finally
{geht leider auch nicht}
if leiterauswahl.Items[leiterauswahl.ItemIndex] = 'Stahlrohleiter Ecco' then
BEGIN
memo1.clear;
memo1.lines.Add('Holme weiß lackiert, mit Kunststoffstufen (max. Belastung ca. 90 kg)');
lp.Text := '79,95';
hbk.Visible := true;
END
else
[Error] Leiter.pas(371): Incompatible types: 'TObject' and 'TImage'
[Error] Leiter.pas(464): Statement expected but 'PROCEDURE' found

Geht also leider auch nicht.

himitsu 1. Aug 2011 21:07

AW: TImage Objekt als Sender nutzen
 
Und wo ist Zeile 371?

Zitat:

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
var ShowImageHideOther:timage;
begin
  if Sender is TImage(Controls[i]).Visible := Controls[i] = Image; then
BEGIN
ShowImageHideOther:= TImage(Controls[i]).Visible := Controls[i] = Image;(Sender);
END;
leiterauswahl.OnChange := ShowImageHideOther;

Ich weiß ja nicht in wie weit du mit der Delphi-Syntax zurecht kommst, aber hier sollte doch nahezu jeder sehn, daß es so nicht gehn kann?
Schon alleine der Zuweisungsoperator
Delphi-Quellcode:
:=
ist in Booleanischen Abfragestatements (ala IF) nicht erlaubt.

Aber eigentlich was es so gemeint
Delphi-Quellcode:
TImage(Controls[i]).Visible := Controls[i] = Image;
(Controls[i] ist sichtbar, wenn es ein der Image-Instanz entspricht)
oder eventuell
Delphi-Quellcode:
(Sender as TImage).Visible := Sender is TImage;
(Sender ist sichtbar, wenn es ein TImage ist)
oder?
Delphi-Quellcode:
(Sender as TImage).Visible := False;
(Sender sollte ein TImage sein und wird nun unsichtbar.


Für dich würde ich aber empfehlen, besser aus weiche Casts ala
Delphi-Quellcode:
(Sender as TImage)
zu setzen,
anstatt auf harte Casts ala
Delphi-Quellcode:
TImage(Sender)
, denn ersterer prüft den Typ und meldet sich, wenn etwas nicht stimmt.
> siehe IS und AS in der OH

Blup 2. Aug 2011 08:48

AW: TImage Objekt als Sender nutzen
 
Noch mal zurück auf Anfang:
Zitat:

Zitat von Nightblade (Beitrag 1114530)
Durch die Hilfe des Forums habe ich eine Procedur bekommen, mit der ich alle Bilder eines Form auf einmal unsichtbar machen kann. Nun spreche ich die Procedur wie folgt an:

Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin

leiterauswahl.OnChange := ShowImageHideOther;
end;
 {Durch diesen aufruf soll folgende Procedur gestartet werden}

procedure TLeitern.ShowImageHideOther(Image: TImage);
var
  i: Integer;
begin
  for i := 0 to Pred(ControlCount) do
    if (Controls[i] is TImage) then
      TImage(Controls[i]).Visible := Controls[i] = Image;
end;

Die Prozedur "ShowImageHideOther" macht mit einer Ausnahme alle Images auf dem Formular unsichtbar. Die Prozedur erwartet das Ausnahme-Image als Parameter, z.B. so:
Delphi-Quellcode:
// alle anderen Bilder unsichtbar
ShowImageHideOther(Image_das_sichtbar_bleiben_soll);
In deinem OnChange-Ereignis bekommst du das Image als Sender übergeben, allerdings als unspezifizierten Typ TObject. Durch einen Cast kann man ein unspezifiziertes Object einer Variablen oder einem Parameter zuweisen, der eine konkrete Klasse verlangt.
Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin
  // mache nichts wenn Sender kein TImage ist
  if Sender is TImage then
    ShowImageHideOther(TImage(Sender)); // hard cast
end;
oder
Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin
  // zeige einen Fehler wenn Sender kein TImage ist
  ShowImageHideOther(Sender as TImage); // soft cast
end;

DeddyH 2. Aug 2011 09:05

AW: TImage Objekt als Sender nutzen
 
Und um den Unterschied zwischen dem gezeigten Hard- und Soft Cast zu erklären:
Delphi-Quellcode:
if Sender is TBla then
  TBla(Sender).MachWas;
Hier wird zunächst geprüft, ob Sender vom Typen TBla ist bzw. abstammt. Nur wenn das zutrifft wird die Methode MachWas von Sender aufgerufen, nachdem dieser als TBla interpretiert (gecastet) wird. Ist Sender nicht vom Typ TBla, passiert gar nichts, auch keine Fehlermeldung oder dergleichen. Letzteres aber auch nur deswegen, weil die Typ-Prüfung bereits erfolgt ist. Lässt man die Abfrage weg sieht das schon anders aus.
Delphi-Quellcode:
(Sender as TBla).MachWas;
//Dummy-Zeile für den Highlighter der DP
Hier wird versucht, Sender als TBla zu interpretieren. Stimmt der Typ nicht, so wird automatisch eine Exception geworfen (EInvalidCast heißt die IIRC).
Welche Vorgehensweise man nun bevorzugt, lässt sich nicht pauschal sagen, es kommt eben darauf an, wie man im Fehlerfall reagieren möchte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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