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 sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 22:05
Delphi-Version: 5
Bin gerade aus Zufall auf folgende Idee gekommen, dass man die Prüfung mit is und eine anschliesende Cast-Operation zusammenfassen könnte:
Delphi-Quellcode:
function IsKindOf(obj:TObject; AClass:TClass; var x):Boolean;
begin
  Result := obj is AClass;
  if Result then
    TObject(x) := obj
  else
    TObject(x) := nil;
end;

// Mit Hilfsfunktion
procedure TForm1.Button1Click(Sender: TObject);
var
  b : TButton;
begin
  if IsKindOf(Sender, TButton, b) then
    b.Caption := 'ich bin ein Button';
end;

// Ohne Hilfsfunktion
procedure TForm1.Button1Click(Sender: TObject);
var
  b : TButton;
begin
  if Sender is TButton then
  begin
    b := TButton(Sender);
    b.Caption := 'ich bin ein Button';
  end;
end;
Falls das jemand gut findet, darf er die Funktion behalten.
  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
 
#2

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 22: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.033 Beiträge
 
Delphi 12 Athens
 
#3

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 22: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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Jul 2012 um 22: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
 
#4

AW: Prüfen und Casten auf einen Rutsch

  Alt 18. Jul 2012, 23: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.442 Beiträge
 
Delphi 12 Athens
 
#5

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 00: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 08:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 01: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
 
#7

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 02: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.294 Beiträge
 
Delphi 12 Athens
 
#8

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 02: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.746 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 08:14
Nennt mich altmodisch, aber was ist gegen eine "einfache" Funktion, wie sx2008 es gezeigt hat, auszusetzen.
Das einzige, was mich stört, ist die fehlende Typsicherheit (siehe Parameter var x ).
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: Prüfen und Casten auf einen Rutsch

  Alt 19. Jul 2012, 08: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
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 09:00 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