AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia TImage Objekt als Sender nutzen

TImage Objekt als Sender nutzen

Ein Thema von Nightblade · begonnen am 1. Aug 2011 · letzter Beitrag vom 2. Aug 2011
Antwort Antwort
Nightblade

Registriert seit: 19. Jul 2011
6 Beiträge
 
#1

TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 19:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#2

AW: TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 19:24
Hallo...

du mußt jedesmal Controls nach TImage casten...
TImage(Controls[i]).Visible := TImage(Controls[i]) = Image; ...vorausgesetzt Image ist auch ein TImage
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 19:55
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Nightblade

Registriert seit: 19. Jul 2011
6 Beiträge
 
#4

AW: TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 19:58
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.
  Mit Zitat antworten Zitat
Nightblade

Registriert seit: 19. Jul 2011
6 Beiträge
 
#5

AW: TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 20:24
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 Eccothen
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#6

AW: TImage Objekt als Sender nutzen

  Alt 1. Aug 2011, 21:07
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 := ist in Booleanischen Abfragestatements (ala IF) nicht erlaubt.

Aber eigentlich was es so gemeint
TImage(Controls[i]).Visible := Controls[i] = Image; (Controls[i] ist sichtbar, wenn es ein der Image-Instanz entspricht)
oder eventuell
(Sender as TImage).Visible := Sender is TImage; (Sender ist sichtbar, wenn es ein TImage ist)
oder?
(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 (Sender as TImage) zu setzen,
anstatt auf harte Casts ala TImage(Sender) , denn ersterer prüft den Typ und meldet sich, wenn etwas nicht stimmt.
> siehe IS und AS in der OH
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TImage Objekt als Sender nutzen

  Alt 2. Aug 2011, 08:48
Noch mal zurück auf Anfang:
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TImage Objekt als Sender nutzen

  Alt 2. Aug 2011, 09:05
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 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