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/)
-   -   Delphi operator is und as (https://www.delphipraxis.net/11963-operator-und.html)

DelphiDeveloper 17. Nov 2003 20:45


operator is und as
 
ich habe folgendes Problem

FormA mit Property Blabla
FormB mit Property Blabla

Beide Formulare rufen FormC auf, in der das property Blabla gesetzt wird

mit dem "is" und "as" Operator bzw. "self.owner" kann ich zwar festellen welchem formular
ich das Property fülle aber ich suche nach einer eleganteren Lösung als die folgende:

in FormC:
if self.owner is TFormA then
with self.owner as TFormA do begin
BlaBla := irgendwas;
...

end;

if self.owner is TFormB then
with self.owner as TFormB do begin
BlaBla := irgendwas;
...

end;

Kennt jemand eine elegantere Möglichkeit?

mfg
DelphiDeveloper

Rumpi 17. Nov 2003 20:52

Re: operator is und as
 
Hi,

versuche doch
Delphi-Quellcode:
procedure FormC.SetBLABLA( Sender: TObject; xxxx ? );
begin
  if Sender is FormA then
  begin
    with Sender as FormA do
    begin



    end;
  end
  else if Sender is FormB then
    with Sender as FormB do
    begin



    end;
end;
du musst schon den Sender übergeben.

Delphi-Quellcode:
FormA ...
   FormC.SetBLABLA( Self, xxxx ?
Ich hoffe es Hilft.

mfg Rumpi

DelphiDeveloper 17. Nov 2003 20:58

Re: operator is und as
 
Danke für die schnelle Antwort aber ob nun
"self.owner" oder "sender" die haessliche if Verzweigung bleibt.

Es muss doch über ein typecasting irgendwie eleganter gehen.

Es könnten ja viele Formulare und viele Properties sein.

SirThornberry 17. Nov 2003 21:02

Re: operator is und as
 
width TFormB(Sender) do
begin

end;

Rumpi 17. Nov 2003 21:03

Re: operator is und as
 
Ups,

zu schnell geantwotet :wall:

Du erzeugst also FormC aus FormA oder FormB heraus???

Delphi-Quellcode:
procedure FormA. ...
begin
  if Not Assigned( FormC ) then
    FormC := TFormC.Create( Self );
  try
    FormC.ShowModal;

    ...
  finally
    FreeAndNil( FormC );
  end;
end;

//oder

procedure FormB. ...
begin
  if Not Assigned( FormC ) then
    FormC := TFormC.Create( Self );
  try
    FormC.ShowModal;

    ...
  finally
    FreeAndNil( FormC );
  end;
end;
Hab ich das nun richtig verstanden ?
Dann ist das was du da machst genau richtig.

mfg Rumpi

Rumpi 17. Nov 2003 21:13

Re: operator is und as
 
Hi,

OK ich glaube jetzt hab ich's.
Bedingt aber oben genannte Erzeugung!

Delphi-Quellcode:
 
// musst du in eine ander unit stellen !
  TXForm = class( TForm )
    procedure BLABLA; virtual; abstract; //
  end;

  TFormA = class( TXForm )
    procedure BLABLA; override;
  end;

  TFormB = class( TXForm )
    procedure BLABLA; override;
  end;


  ...
  FormC

  TXForm(Owner).BLABLA; // ruft automatisch TFormA.BLABLA. oder TFormB.BLABLA;
mfg Rumpi

DelphiDeveloper 17. Nov 2003 21:20

Re: operator is und as
 
Delphi-Quellcode:
procedure FormA. ...
begin
  if Not Assigned( FormC ) then
    FormC := TFormC.Create( Self );
  try
    FormC.ShowModal;

    ...
  finally
    FreeAndNil( FormC );
  end;
end;

//oder

procedure FormB. ...
begin
  if Not Assigned( FormC ) then
    FormC := TFormC.Create( Self );
  try
    FormC.ShowModal;

    ...
  finally
    FreeAndNil( FormC );
  end;
end;
ja genau so rufe ich FormC auf, den Gedanken mit dem gemeinsamen Parentformular hatt ich auch schon,
schien mir aber ein bisserl zu heftig als Lösung.

Trotzdem danke Rumpi für die schnelle Hilfe

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

Leuselator 17. Nov 2003 23:13

Re: operator is und as
 
Variation zum Thema:
Delphi-Quellcode:
type
  TFormA = class;
  TFormB = class;
  TFormC = class;

  TFormA = class(TForm)
    private
      DasCForm : TFormC;
    ...
    procedure MachBlaBlaMitMir(Sender:TObject);
    ...
  end;

  TFormB = class(TForm)
    ...
    procedure MachBlaBlaMitMir(Sender:TObject);
    ...
  end;
 
  TFormC = class(TForm)
  private
    FTuDochWas : TNotifyEvent;
    ...
  public
    property TuDochWas : TNotifyEvent read FTuDochWas write FTuDochWas;
    ...
  end;
iplementation

procedure TFormA.ErzeugeFormC
begin
  if not Assigned(TFormC) then begin
    DasCForm := TFormC.Create(self);
    DasCForm.TuDochWas := MachBlaBlaMitMir;
    DasCForm.Show;
  end;
end;

procedure TFormA.MachBlaBlaMitMir(Sender:TObject);
begin
  ...
end;

procedure TFormB.MachBlaBlaMitMir(Sender:TObject);
begin
  ...
end;

TFormC.MachAktionMitMutterForm
begin
  if Assigned(FTuDochWas) then begin
    FTuDochWas; // funzt mit jeder art von Mutterform, egal ob TFormA,-B,D,EFGHIJKLM...
    // wenn das nur einmal passieren soll, dann:
    FTuDochWas := nil;
  end;
end;
Code nicht getestet/so nicht funktional/nur sinngemäßer Richtungshinweis :-)

Gruß

Bernd Ua 17. Nov 2003 23:35

Re: operator is und as
 
Zitat:

den Gedanken mit dem gemeinsamen Parentformular hatt ich auch schon,
schien mir aber ein bisserl zu heftig als Lösung.
Da bieten sich doch interfaces an und können in diesem Fall die Basisklasse ersetzen

Delphi-Quellcode:
type
  IBlaBla = interface
    ['{D277B854-3DFF-4838-B8B9-A87EF5C55B1F}']
    procedure SetBla(Value: Integer);
    function GetBla : Integer;
    property Blabla : Integer read GetBla write SetBla;
  end;

  TFormA = class(Tform,IblaBla)
  public
    function GetBla: Integer;
    procedure SetBla(Value: Integer);
  end;

  TFormB = class(TForm,IblaBla)
  public
    function GetBla: Integer;
    procedure SetBla(Value: Integer);
  end;
und beim Zugriff ginge das dann so:

Delphi-Quellcode:
var
  aForm : TForM;
...
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Supports(aForm,IBlaBla) then // vorher prüfen um Exception zu vermeiden
    (aForm as IblaBla).Blabla := 12;
end;

janz ohne if else
(BTW - geht so (ohne weiteren Code) erst ab Delphi 6 , bei D5 etc müsste noch IUnknown implementiert werden)

Bernd

Rumpi 18. Nov 2003 10:37

Re: operator is und as
 
Hi Bernd,

Zitat:

Delphi-Quellcode:
type
  IBlaBla = interface
    ['{D277B854-3DFF-4838-B8B9-A87EF5C55B1F}']
    procedure SetBla(Value: Integer);
    function GetBla : Integer;
    property Blabla : Integer read GetBla write SetBla;
  end;

  TFormA = class(Tform,IblaBla)
  public
    function GetBla: Integer;
    procedure SetBla(Value: Integer);
  end;

  TFormB = class(TForm,IblaBla)
  public
    function GetBla: Integer;
    procedure SetBla(Value: Integer);
  end;

muss da nicht in TFormA und B SetBla vor GetBla kommen so wie in IBlaBla?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Seite 1 von 2  1 2      

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