AGB  ·  Datenschutz  ·  Impressum  







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

Prüfen und Casten auf einen Rutsch

Ein Thema von sx2008 · begonnen am 18. Jul 2012 · letzter Beitrag vom 19. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 21:24
Ist Delphi 5 wirklich zwingend, oder hast du das nur als minimal Version angegeben?

Denn ansonsten würde ich das über einen Class Helper erledigen:
Delphi-Quellcode:
TObjectHelper = class helper(TObject)
public
  function TryCast<TCastType>(out Object: TCastType): Boolean;
end;


function TObjectHelper.TryCast<TCastType>(out Object: TCastType): Boolean;
begin
  Result := Self is AClass;
  if Result then
    Object := Self
  else
    Object := nil;
end;
Ich hoffe, der Code ist korrekt... Ist gerade einfach mal schnell aus dem Kopf runter geschrieben...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 21:54
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton absolute Sender;
begin
  if Sender is TButton then
    Button.Caption := 'ich bin ein Button';
end;

Bei solchen Funktionen kenn ich es oft, daß sie den Ausgabewert nur setzen, wenn die Prüfung erfolgreich war.
Delphi-Quellcode:
function TObjectHelper.TryCast<TCastType>(out Object: TCastType): Boolean;
begin
  Result := Self is AClass;
  if Result then
    Object := Self;
end;
Aber ich glaub es könnte fehlerunanfälliger sein, wenn man den Wert dennoch initialisiert (nil).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jul 2012 um 21:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 22:03
Nachdem es eh ein out-Parameter ist und man nach einem False-Rückgabewert eh tunlichst nicht darauf zugreifen sollte, ists eigentlich egal. Die Frage ist nur, was ist gute Praxis?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 23:04
Kleine Korrektur:

Delphi-Quellcode:
function TObjectHelper.TryCast<TCastType: Class>(out Instance: TCastType): Boolean;
begin
  Result := Self is TCastType;
  if Result then
    Instance:= Self
  else
    Instance:= nil;
end;
Allerdings könnte ein public sichtbarer helper for TObject das ganze übrige Helper Szenario obsolet machen.

Besser wäre vielleicht ein Record:

Delphi-Quellcode:
type
  TCaster = record
    function TryCast<TCastType: Class>(Source: TObject; out Target: TCastType): Boolean;
  end;

function TCaster.TryCast<TCastType>(Source: TObject; out Target: TCastType): Boolean;
begin
  Result := Source is TCastType;
  if Result then
    Target := Source
  else
    Target := nil;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (19. Jul 2012 um 07:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.307 Beiträge
 
Delphi 12 Athens
 
#5

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 00:55
Nennt mich altmodisch, aber was ist gegen eine "einfache" Funktion, wie sx2008 es gezeigt hat, auszusetzen.

Was ist der Vorteil von Class-Helper. In den Beiträgen sehe ich zwar, wie der Classhelper definiert ist. Aber wie wird er angewendet?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 01:03
Ein ClassHelper erweitert eine Klasse um Methoden, die dann einfach benutzt werden können.
In diesem Beispiel also so
Delphi-Quellcode:
if Sender.TryCast<TEdit>( Edit ) then
  Edit.Text := 'tut';
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.307 Beiträge
 
Delphi 12 Athens
 
#7

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 01:34
Ein ClassHelper erweitert eine Klasse um Methoden, die dann einfach benutzt werden können.
In diesem Beispiel also so
Delphi-Quellcode:
if Sender.TryCast<TEdit>( Edit ) then
  Edit.Text := 'tut';
Danke. Wieder was gelernt.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 07:19
Ein ClassHelper erweitert eine Klasse um Methoden, die dann einfach benutzt werden können.
In diesem Beispiel also so
Delphi-Quellcode:
if Sender.TryCast<TEdit>( Edit ) then
  Edit.Text := 'tut';
Delphi-Quellcode:
if TryCast<TEdit>(Sender, Edit) then
  Edit.Text := 'tut';
wäre aber auch OK und käme ohne class helper aus. Leider kann Delphi (noch) keine globalen generischen Routinen. (Warum eigentlich?)
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 07:57
Delphi-Quellcode:
if TryCast<TEdit>(Sender, Edit) then
  Edit.Text := 'tut';
Leider kann Delphi (noch) keine globalen generischen Routinen. (Warum eigentlich?)
Das wüste ich auch gerne, dazumal ich sogar mal eine "Lösung" genannt hatte, wie man es dennoch umgehn könnte.
Einfach eine implizite Klasse drum, um die Funktion, und schon ginge es ohne große Änderung des Compilers.

Nja, aber wenn du OOP mit arbeitest, und diese "Funktion innerhalb von Methoden verwendest, dann kannst du immernoch den ClassHelper verwenden.
Und im Notfall kombiniert man einfach Beides.
Delphi-Quellcode:
  TCastHelper = class helper for TObject
    class function TryCast<TCastType: Class>(Source: TObject; out Target: TCastType): Boolean; overload;
    function TryCast<TCastType: Class>(out Target: TCastType): Boolean; overload;
  end;
Delphi-Quellcode:
// z.B. im ButtonClick:
if x.TryCast(y) or TryCast(x, y) then
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 11:46
Leider kann Delphi (noch) keine globalen generischen Routinen. (Warum eigentlich?)
Das wüste ich auch gerne, dazumal ich sogar mal eine "Lösung" genannt hatte, wie man es dennoch umgehn könnte.
Einfach eine implizite Klasse drum, um die Funktion, und schon ginge es ohne große Änderung des Compilers.
Globale Prozeduren und Funktionen sind ja sowas von out - man nimmt dafür jetzt statische Klassenmethoden in Records.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (19. Jul 2012 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:34 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