AGB  ·  Datenschutz  ·  Impressum  







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

OOP: Object als Wrapper

Ein Thema von Shaman · begonnen am 1. Mai 2006 · letzter Beitrag vom 3. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#1

OOP: Object als Wrapper

  Alt 1. Mai 2006, 14:28
Hey there

Als ich wieder einmal eine Wrapperklasse schreiben wollte, kam mir die Idee, anstatt wie üblich TObject als Basisklasse zu verwenden, object zu nehmen:

Delphi-Quellcode:
type
  Wrapper = object
  end;
Obwohl das ja veraltet ist, sehe ich einige Vorteile: Man kann damit ganz einfach Funktionen kapseln, hat jedoch kein Overhead von TObject (vorallem wenn man eh nur ein einziges Feld wie z.B. ein Handle hat) und die Verwendung ist ein wenig praktischer, da das Instantiieren wegfällt. (Oder? )

Ein Beispiel:

Delphi-Quellcode:

interface

type
  WWindow = object(Wrapper)
  private
    FHandle: HWND;
    function GetTopMost: Boolean;
    procedure SetTopMost(const Value: Boolean);
  public
    function Find(const Caption: string): Boolean;
    property Handle: HWND read FHandle write FHandle;
    property TopMost: Boolean read GetTopMost write SetTopMost;
  end;

implementation

function WWindow.Find(const Caption: string): Boolean;
begin
  FHandle:= FindWindow(nil, PChar(Caption));
  Result:= FHandle <> 0;
end;

function WWindow.GetTopMost: Boolean;
begin
  Result:= (GetWindowLong(FHandle, GWL_EXSTYLE) and WS_EX_TOPMOST) <> 0;
end;

procedure WWindow.SetTopMost(const Value: Boolean);
const
  InsertAfter: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST);
begin
  SetWindowPos(FHandle, InsertAfter[Value], 0, 0, 0, 0,
    SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
end;
Anwendung:
Delphi-Quellcode:
var
  Window: WWindow;
begin
  assert(Window.Find('Unbenannt - Editor'));
  Window.TopMost:= True;
end
Ich finde, das sieht eigentlich ganz praktisch aus... Nur gibt es bei der Zuweisung von TopMost eine AV, wenn er in SetTopMost auf FHandle zugreifen will. ABER: Wenn ich SetTopMost direkt aufrufe, funktioniert alles tadellos...

Woran kann das liegen? Ich meine, es wird wohl schon ein Grund geben, warum object veraltet ist...

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 20:18
*schwupps*
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 20:27
wo ist jetzt eigentlich der Unterschied ob du Object oder TObject nimmst (außer das eines wohl veraltet ist)? Hast du eventuell vergessen mit Create die Instanz zu erzeugen.
[Edit]Ich zieh meinen Beitrag zurück. Ich finde zwar nix richtighes zu Object in der Hilfe was das richtige sein könnte aber es scheint kein TObject zu sein sondern nur ein Record mit Funktionen.[/Edit]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 20:41
Hallo Shaman,

ich habe mir den erzeugten Assemblercode einmal angesehen. Obwohl beide Varianten (Zugriff über Property und Aufruf des Setters) eigentlich das gleiche bewirken, wird für den Property-Zugriff ein falscher Code erzeugt, der im schlimmsten Fall Speicherinhalte an ungewollten Stellen überschreibt.

Da Borland die Verwendung von Properties im alten Objektmodell nicht offiziell dokumentiert hat, ist von einer Verwendung abzuraten, auch wenn der Compiler die Konstrukte ohne Fehlermeldung übersetzt. Der direkte Aufruf der Setter-Methoden sollte ohne Probleme möglich sein.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:00
@Hawkeye: Danke dir, das ist schon mal aufschlussreich. Kennst Du denn irgend eine Doku für dieses Objektmodell? Es stammt wahrscheinlich noch von Object Pascal, nehme ich an? Es würde mich nämlich schon interessieren...
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:04
Das "alte" Objektmodell aus Turbo Pascal kennt keine Konstruktoren/Destruktoren und keine Referenzen d.h.
Man hat die Möglichkeiet ein Objekt statisch anzulegen oder dynamisch mit Hilfe eines Zeigers. In diesem Fall muß man sich dann um die entsprechende Referenzierung/Dereferenzierung mit Hilfe von ^ kümmern.
Es gibt keine Zwangserbschema ( allss erbt von TObject) und keine Referenzzählung.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:13
D.h. es ist eigentlich ein Recordtyp, welches ebenfalls Methoden beinhalten kann. Deshalb würde es sich IMHO hervorragend für Fälle wie im obigen Beispiel eignen... Aber wieso funktionieren Properties nicht richtig?
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:17
Hallo Shaman,

das Objektmodell wurde mit "Turbo Pascal 5.5" eingeführt. Borland bietet den Compiler im Museum zum kostenlosen Download an. Im Text findest du unter dem Bild ("Be Objektive") auch einen Link zu einem PDF-Dokument, welches eine Beschreibung des Objektmodells enthält.

Gruß Hawkeye
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:24
Zitat:
Aber wieso funktionieren Properties nicht richtig?
Vielleicht weil diese Borland eigentlich erst mit dem neuen Objektmodell in Delphi eingeführt hat.
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

Re: OOP: Object als Wrapper

  Alt 2. Mai 2006, 21:52
Zitat von mkinzler:
Das "alte" Objektmodell aus Turbo Pascal kennt keine Konstruktoren/Destruktoren
Von wegen:
Delphi-Quellcode:
type
  PBase = ^TBase;
  TBase = object
    constructor Init;
    destructor Done; virtual;
  end;

constructor TBase.Init;
begin
end;

destructor TBase.Done;
begin
end;

var
  b: TBase;
  p: PBase;
begin
  b.Init;
  b.Done;

  p := New(PBase, Init);
  Dispose(p, Done);
end.
  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 01:04 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