AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Override von Konstanten im Objekt - Alternative?
Thema durchsuchen
Ansicht
Themen-Optionen

Override von Konstanten im Objekt - Alternative?

Ein Thema von bernau · begonnen am 25. Dez 2017 · letzter Beitrag vom 30. Dez 2017
Antwort Antwort
Benutzerbild von bernau
bernau

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

AW: Override von Konstanten im Objekt - Alternative?

  Alt 25. Dez 2017, 16:27
Da habe ich auch schon dran gedacht.

Wobei das natürlich unnötigen Code erzeugt. Im Beispiel nicht ist es viel. Aber es ist ja nur ein Beispiel. Da sollen zukünftig mehrere abgeleitete Objekte vorkommen und mehrere Konstanten im Objekt. Das macht den Code unübersichtlich.

Aber danke für die Idee!
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 09:48
warum kann ich die Methode MachwasmitTestvalue auch nach der Freigabe von ObjectA aufrufen?
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var ObjectA:TObjectA;
begin
  ObjectA := TObjectA.Create;
  try
    lblA.Caption:=ObjectA.testvalue;
    //ObjectA.MachWasMitTestValue;
  finally
    ObjectA.Free;
  end;
  ObjectA.MachWasMitTestValue;
end;
eigentlich gehört sie doch in den try... finaly-Abschnitt, wie auskommentiert dargestellt.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

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

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:12
warum kann ich die Methode MachwasmitTestvalue auch nach der Freigabe von ObjectA aufrufen?
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var ObjectA:TObjectA;
begin
  ObjectA := TObjectA.Create;
  try
    lblA.Caption:=ObjectA.testvalue;
    //ObjectA.MachWasMitTestValue;
  finally
    ObjectA.Free;
  end;
  ObjectA.MachWasMitTestValue;
end;
eigentlich gehört sie doch in den try... finaly-Abschnitt, wie auskommentiert dargestellt.
Ähm. Deinen Post verstehe ich nicht. Ist der Code von dir, oder von einem ggf. gelöschten Post?

Natürlich gehört die Anweisung in den Try...finally Block und muss aufgerufen werden bevor das Objekt wieder freigegeben wird.

Wenn es doch funktioniert, ist es Zufall, weil der Speicherbereich, in dem sich das instanzierte Objekt befunden hatte, noch nicht überschrieben wurde.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:21
ich habe einfach mit dem Beispiel von Uwe Rabe gespielt und folgenden code vervollständigt:
Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    lblA: TLabel;
    lblB: TLabel;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TObjectA = class
  strict private const
    cTestValue = 'aaa';
  public
    Function testvalue: String; virtual;
    Procedure MachWasMitTestValue;
  end;

  TObjectB = class(TObjectA)
  strict private const
    cTestValue = 'bbb';
  public
    Function testvalue: String; override;
  end;

procedure TObjectA.MachWasMitTestValue;
begin
  ShowMessage(testvalue);
end;

function TObjectA.testvalue: String;
  begin
    Result := cTestValue;
  end;

  function TObjectB.testvalue: String;
  begin
    Result := cTestValue;
  end;

procedure TForm1.btn1Click(Sender: TObject);
var ObjectA:TObjectA;
begin
  ObjectA := TObjectA.Create;
  try
    lblA.Caption:=ObjectA.testvalue;
    //ObjectA.MachWasMitTestValue;
  finally
    ObjectA.Free;
  end;
  ObjectA.MachWasMitTestValue;
end;

procedure TForm1.btn2Click(Sender: TObject);
var ObjectB: TObjectB;
begin
  ObjectB:=TObjectB.create;
  try
    lblB.Caption:=ObjectB.testvalue;
    ObjectB.MachWasMitTestValue;
  finally
    ObjectB.free;
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  close;
end;

end.
Dann habe ich wie geschrieben die Methode MachwasmitTestValue versehentlich nach der Freigabe des ObjectA aufgerufen und es geht. Es geht wie es gehen soll innerhalb des try...finaly-Blocks, aber ach Wunder: auch hinter diesem, aber warum?
Norbert
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:39
Es geht wie es gehen soll innerhalb des try...finaly-Blocks, aber ach Wunder: auch hinter diesem, aber warum?
Das ist als würde man fragen warum es immer klappt wenn man bei grün über die Ampel fährt, aber es die letzten beiden male auch keinen Zusammenprall gab als man bei rot drüber fuhr. Das Freigeben eines Objekts löscht seine Daten nicht zwangsläufig aus dem Speicher. Es gibt sie "zur weiteren Verwendung frei". Es kann klappen. Schreibst du deine Prozedur ein wenig anders klappt es vielleicht schon nicht mehr.

Lange Rede, kurzer Sinn: Tu es nicht
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:48
na gut, Ich fahre also immer ordentlich über die Kreuzung. War ja nur mal so ein Gespiele mit dem Beispiel. Danke
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.232 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:54
Bau mal in deinem Testprogramm FastMM4 (https://github.com/pleriche/FastMM4) bzw. aktiviere über Compilerdefines die Checks in dem in Delphi (abgespeckten) FastMM4.
Dann wird entsprechend Meckern das du versuchst auf ein freigegebenes Objekt zuzugreifen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


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