![]() |
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:
Nun bringt delphi aber den Fehler:
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; [Error] Leiter.pas(367): Incompatible types: 'TObject' and 'TImage' Ich habs schon mit
Delphi-Quellcode:
probiert klappt aber auch nicht
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
var ShowImageHideOther:timage; begin if Sender is TImage then BEGIN ShowImageHideOther:= TImage(Sender); END; [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. |
AW: TImage Objekt als Sender nutzen
Hallo...
du mußt jedesmal Controls nach TImage casten...
Delphi-Quellcode:
...vorausgesetzt Image ist auch ein TImage
TImage(Controls[i]).Visible := TImage(Controls[i]) = Image;
|
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; |
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:
noch eintragen.
TImage(Controls[i]).Visible := Controls[i] = Image;
Hab´s jetzt mal so probiert:
Delphi-Quellcode:
Jetzt kommt fehlermeldung:
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.} [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: |
AW: TImage Objekt als Sender nutzen
Wenn ich´s richtig umgesetzt habe.
Delphi-Quellcode:
[Error] Leiter.pas(371): Incompatible types: 'TObject' and 'TImage'
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(464): Statement expected but 'PROCEDURE' found Geht also leider auch nicht. |
AW: TImage Objekt als Sender nutzen
Und wo ist Zeile 371?
Zitat:
Schon alleine der Zuweisungsoperator
Delphi-Quellcode:
ist in Booleanischen Abfragestatements (ala IF) nicht erlaubt.
:=
Aber eigentlich was es so gemeint
Delphi-Quellcode:
(Controls[i] ist sichtbar, wenn es ein der Image-Instanz entspricht)
TImage(Controls[i]).Visible := Controls[i] = Image;
oder eventuell
Delphi-Quellcode:
(Sender ist sichtbar, wenn es ein TImage ist)
(Sender as TImage).Visible := Sender is TImage;
oder?
Delphi-Quellcode:
(Sender sollte ein TImage sein und wird nun unsichtbar.
(Sender as TImage).Visible := False;
Für dich würde ich aber empfehlen, besser aus weiche Casts ala
Delphi-Quellcode:
zu setzen,
(Sender as TImage)
anstatt auf harte Casts ala
Delphi-Quellcode:
, denn ersterer prüft den Typ und meldet sich, wenn etwas nicht stimmt.
TImage(Sender)
> siehe IS und AS in der OH |
AW: TImage Objekt als Sender nutzen
Noch mal zurück auf Anfang:
Zitat:
Delphi-Quellcode:
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.
// alle anderen Bilder unsichtbar
ShowImageHideOther(Image_das_sichtbar_bleiben_soll);
Delphi-Quellcode:
oder
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin // mache nichts wenn Sender kein TImage ist if Sender is TImage then ShowImageHideOther(TImage(Sender)); // hard cast end;
Delphi-Quellcode:
procedure TLeitern.LeiterauswahlChange(Sender: TObject);
begin // zeige einen Fehler wenn Sender kein TImage ist ShowImageHideOther(Sender as TImage); // soft cast end; |
AW: TImage Objekt als Sender nutzen
Und um den Unterschied zwischen dem gezeigten Hard- und Soft Cast zu erklären:
Delphi-Quellcode:
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.
if Sender is TBla then
TBla(Sender).MachWas;
Delphi-Quellcode:
Hier wird versucht, Sender als TBla zu interpretieren. Stimmt der Typ nicht, so wird automatisch eine Exception geworfen (EInvalidCast heißt die IIRC).
(Sender as TBla).MachWas;
//Dummy-Zeile für den Highlighter der DP 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 23:42 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-2025 by Thomas Breitkreuz