AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Merkwürdiger Effekt bei TLabel

Ein Thema von Willie1 · begonnen am 29. Apr 2020 · letzter Beitrag vom 4. Mai 2020
Antwort Antwort
Seite 4 von 4   « Erste     234   
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#31

AW: Merkwürdiger Effekt bei TLabel

  Alt 3. Mai 2020, 21:08
Warum soll es eine geben? Nur weil es nil ist, bedeutet es nicht, dass man keinen Wert zuweisen kann.

Delphi-Quellcode:
  Lbl := TLabel(Nil);
  // Lbl := Nil funktioniert auch
  Lbl.Caption:='wuppdi';
  Showmessage(Lbl.Caption);

  Lbl := Label1;
  Showmessage(Lbl.Caption);
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#32

AW: Merkwürdiger Effekt bei TLabel

  Alt 3. Mai 2020, 21:16
Das hier gibt erwartungsgemäß eine Exception:
Delphi-Quellcode:
TMyClass = class
  caption: String;
end;
//
var myClass: TMyClass;
begin
    myClass := Nil;
    myClass.caption := 'foo';
end;
Definiere ich die Variable myClass aber als TLabel, gibt es keine. "Zaubert" die VCL da was, oder ist das eine versteckte Einstellung, die ich noch nicht kenne?

(Das ist ja nicht wirklich OT. Willie hatte gewissermaßen "toten" Code im Projekt, der eigentlich Fehler verursachen sollte, der aber einfach "nichts" tat und erst "aktiv" wurde, als ein passendes Label auf der Form war.)
The angels have the phone box.

Geändert von Gausi ( 3. Mai 2020 um 21:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#33

AW: Merkwürdiger Effekt bei TLabel

  Alt 3. Mai 2020, 21:46
Da muss ich mich jetzt aber auch mal einklinken. Wenn FindComponent Nil zurückliefert, wenn die Komponente nicht gefunden ist, dann ist Lbl ja klar definiert. Warum knallt das denn nicht, wenn man auf die Caption von "Nil" zugreift?
Weil das ganze über Windows Messages läuft. Diese werden in TControl.Perform erzeugt und an die WindowProc übergeben. Davor wird aber Self auf nil geprüft und in dem Fall die WindowProc schlicht gar nicht aufgerufen.

"Zaubert" die VCL da was, oder ist das eine versteckte Einstellung, die ich noch nicht kenne?
Zaubern ist etwas zu viel gesagt, aber ja, es wird abgefangen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#34

AW: Merkwürdiger Effekt bei TLabel

  Alt 3. Mai 2020, 22:07
Da muss ich mich jetzt aber auch mal einklinken. Wenn FindComponent Nil zurückliefert, wenn die Komponente nicht gefunden ist, dann ist Lbl ja klar definiert. Warum knallt das denn nicht, wenn man auf die Caption von "Nil" zugreift?
Uff, ja da war ich etwas neben der Spur. Sorry. Natürlich ist Lbl nach dem Aufruf klar definiert! Weiß auch nicht, was für ein Effekt da durch meinen Kopf ging.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#35

AW: Merkwürdiger Effekt bei TLabel

  Alt 3. Mai 2020, 23:56
Dass nil bei Nichtfund zurückgegeben wird, steht sogar in der Hilfe zu FindComponent(). Also sollte man das auch beachten.
Ja, das dacht ich auch. Ein kurzer Blick hat mich eines Besseren belehrt. Ich kann im Hilfetext von FindComponent keine Erläuterung des Rückgabewerts, wenn die Komponten nicht gefunden wird, nicht entdecken.
Zitat:
Gibt an, ob der Komponente eine bestimmte Komponente untergeordnet ist.

FindComponent gibt diejenige Komponente im Array Components zurück, deren Name mit dem String im Parameter AName übereinstimmt. Mit Hilfe von FindComponent können Sie feststellen, ob eine bestimmte Komponente einer anderen Komponente untergeordnet ist.

Bie den Komponentennamen wird die Groß-/Kleinschreibung nicht berücksichtigt.
Wobei das allerdings auch ohne weitere Erwähnung in OH klar sein sollte.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#36

AW: Merkwürdiger Effekt bei TLabel

  Alt 4. Mai 2020, 00:23
Ja, das dacht ich auch. Ein kurzer Blick hat mich eines Besseren belehrt. Ich kann im Hilfetext von FindComponent keine Erläuterung des Rückgabewerts, wenn die Komponten nicht gefunden wird, nicht entdecken.
Mir war so, als hätte ich das mal irgendwann vor Jahren da gelesen. Aber das ist genau so ein Mist, weshalb ich die Hilfe in Delphi so scharf kritisiere. So etwas muss da stehen! Mögliche Rückgabewerte sind geradezu das Minimum, was eine Funktionsbeschreibung machen muss. Und dann auch gern kleine Best-Practice Beispiele der Art
Delphi-Quellcode:
var
  edit: TEdit;
begin
  edit := FindComponent('Edit1') as TEdit;
  if Assigned(edit) then
  begin
    // your code here
  end;
end;
(Wobei ich jetzt gerade nicht sicher bin, ob "as" nicht auch schon implizit auf nil prüft, bzw. es als ungültige TEdit Instanz ablehnt. Steht bestimmt in der Hilfe dazu ) Und dann auch die Gefahren abgrenzen, die z.B. bei einem harten Cast entstehen können. Mag für viele offensichtlich sein, aber den meisten, die die Hilfe oft beanspruchen müssen gerade vielleicht nicht.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#37

AW: Merkwürdiger Effekt bei TLabel

  Alt 4. Mai 2020, 00:32
(Wobei ich jetzt gerade nicht sicher bin, ob "as" nicht auch schon implizit auf nil prüft, bzw. es als ungültige TEdit Instanz ablehnt. Steht bestimmt in der Hilfe dazu
  1. tut es
  2. tut es nicht
  3. tut es

Ein TObject(nil) as TEdit ist immer noch nil . In der Hilfe steht explizit:
Zitat:
Zur Laufzeit muss Objekt eine Instanz von Klasse oder einem ihrer Nachkommen bzw. nil sein. Andernfalls wird eine Exception ausgelöst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Merkwürdiger Effekt bei TLabel

  Alt 4. Mai 2020, 00:41
as knallt, wenn es ein falscher/inkompatibler Typ ist,
und nil ist kein Typ, also ein gültiger Wert.

is prüft dagegen, ob es ein kompatibler Typ ist, also nil oder was Anderes ergeben False.


Bei nil reagieren die beiden Funktionen also unterschiedlich.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Mai 2020 um 00:52 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#39

AW: Merkwürdiger Effekt bei TLabel

  Alt 4. Mai 2020, 17:04
Zitat:
Gausi: (… Willie hatte gewissermaßen "toten" Code im Projekt, der eigentlich Fehler verursachen sollte, der aber einfach "nichts" tat und erst "aktiv" wurde, als ein passendes Label auf der Form war.)
So ist es. Aber ich bleibe dabei, mit einer Exception an dieser Stelle hätte ich das nicht übersehen.

Willie.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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:28 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