Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Konstrukt wie on...do für die allgemeine Nutzung? (https://www.delphipraxis.net/200287-konstrukt-wie-do-fuer-die-allgemeine-nutzung.html)

Redeemer 6. Apr 2019 15:43

Delphi-Version: 5

Konstrukt wie on...do für die allgemeine Nutzung?
 
Ganz grundlegende Frage: Mir gefällt das Konstrukt on...do im except-Block: Prüft, ob die Exception von einem bestimmten Typ ist, und wenn dann erhält man eine Variable von diesem Typ. Gibt es etwas Vergleichbares auch für die Nutzung außerhalb von except? Klar, es gibt
Delphi-Quellcode:
if X is Y then with X as Y do
, aber das würde ich gern vermeiden.

Uwe Raabe 6. Apr 2019 16:35

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Klingt irgendwie nach Generics.

Rudy Velthuis 6. Apr 2019 22:18

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Zitat:

Zitat von Redeemer (Beitrag 1429645)
Ganz grundlegende Frage: Mir gefällt das Konstrukt on...do im except-Block: Prüft, ob die Exception von einem bestimmten Typ ist, und wenn dann erhält man eine Variable von diesem Typ. Gibt es etwas Vergleichbares auch für die Nutzung außerhalb von except? Klar, es gibt
Delphi-Quellcode:
if X is Y then with X as Y do
, aber das würde ich gern vermeiden.

Nein, gibt es nicht. Nicht einmal im heutigen Delphi 10.3.1 Rio.

uligerhardt 6. Apr 2019 22:25

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1429654)
Klingt irgendwie nach Generics.

Oder nach virtuellen Methoden.

stahli 7. Apr 2019 22:16

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Bei Interfaces gibt es Supports:

Delphi-Quellcode:
if Supports(aIntf, IMyIntf, MyIntf) then
begin
  MyIntf.DoIt;
end;
Für Klassen gibt es das m.E. nicht.

Uwe Raabe 7. Apr 2019 22:50

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Vielleicht kommt
Delphi-Quellcode:
TValue.TryAsType<T>
dem noch am nächsten. Allerdings braucht man dann für jeden Fall eine entsprechend deklarierte Variable. Das ließe sich aber vielleicht wieder über Inline-Variablen lösen. Bleibt aber immer noch ziemlich unelegant:
Delphi-Quellcode:
  var V: TValue := TValue.From<TComponent>(FindComponent('MyName'));

  var btn: TButton;
  if V.TryAsType<TButton>(btn) then begin
    btn.Click;
  end;

  var edt: TEdit;
  if V.TryAsType<TEdit>(edt) then begin
    edt.Clear;
  end;

Uwe Raabe 8. Apr 2019 07:13

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Man kann es aber auch so machen, obwohl ich stark bezweifle, ob das wirklich sinnvoll ist:
Delphi-Quellcode:
  try
    if Odd(Random(2)) then
      raise TButton.Create(nil)
    else
      raise TEdit.Create(nil);
  except
    on instance: TButton do
      instance.Click;
    on instance: TEdit do
      instance.Clear;
  end;

Medium 8. Apr 2019 11:22

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Das nenne ich mal kreativ! Auch wenn es schon deutlich über Missbrauch hinaus geht :lol:

Andreas L. 9. Apr 2019 10:19

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1429793)
Man kann es aber auch so machen, obwohl ich stark bezweifle, ob das wirklich sinnvoll ist:
Delphi-Quellcode:
  try
    if Odd(Random(2)) then
      raise TButton.Create(nil)
    else
      raise TEdit.Create(nil);
  except
    on instance: TButton do
      instance.Click;
    on instance: TEdit do
      instance.Clear;
  end;

Wenn man im except- oder try- Abschnitt auf die Variable instance zugreift und Eigenschaften wie Parent, Visible, etc. setzt führt der Compiler laut Debugger zwar diese Zeilen aus aber die Controls (in meinem Test TButton) erscheint nirgendwo. Ich habe auch versucht instance in einer TObjectList abzulegen und später via ButtonClick Parent, etc. zu setzen. Leider ohne Erfolg. Warum ist das so?

Neutral General 9. Apr 2019 10:34

AW: Konstrukt wie on...do für die allgemeine Nutzung?
 
Zumindest bei Funktionsparametern gibt es etwas was du tun kannst:
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var form: TForm absolute Sender;
begin
  if Sender is TForm then
    form.Caption := 'Test';
end;
Weiß nicht ob dir das vllt. weiterhilft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Seite 1 von 2  1 2      

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