| Autor |
Beitrag |
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 13.08.11 18:54
dummzeuch hat folgendes geschrieben : | | Wobei "aeltere Delphis" bedeutet: Delphi 1 bis XE (zu XE2 kann ich noch nichts sagen, aber es wuerde mich nicht wundern, wenn selbst die 64 Bit Version noch compatibel dazu waere). |
Ja, genau.
Ich wöllte das gerne gelesen haben als "es ist rückwärtskompatibel, Record-Methoden sind das nicht".
Übrigens: der generierte Code ist exakt der gleiche (Getestet: D7,D10). MethodenRecord ist also nur eine neue Syntax für object. Es würde mich nicht wundern, wenn das von Delphi intern auf eine einheitliche Form abgebildet wird.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 17.08.11 14:53
Prinzipiell sind Objects von der Speicherverwaltung mit den Klassen in C++ vergleichbar vom Layout. Möchte man Cross Language haben, ist man mit COM/DCOM und anderen Schnittstellen aber oft besser bedient.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Stephan.Woebbeking 
      
Beiträge: 97
|
Verfasst: Di 22.05.12 10:48
Oha, schon lange her, lange nicht reingeschaut... Soweit ich das für mich zusammenfassen kann, ist so etwas schönes wie der Garbage Collector unter Java nicht mit Bordmitteln in Delphi erreichbar. Interfaces sind in dedizierten Situationen eine Alternative, aber klassisches, eigenes Memory Management ist State-of-the-Art, habe ich das soweit richtig verstanden? Damit wird auch die an sich sehr bequeme Vorgehensweise aus einer Funktion eine Instanz zurück zu liefern etwas bedenklich, weil der Rufer ja vielleicht nicht dran denkt die Instanz freizugeben - er hat sie ja nicht angelegt.
Das ist für mich die Essenz, wenn ich falsch liege, dürft ihr mich natürlich gern korrigieren, sonst schließe ich das Thema in den nächsten Tagen.
Danke, Stephan
|
|
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 22.05.12 11:02
Vielleicht sind auch Smartpointers passend an dieser Stelle:
members.adug.org.au/...2/05/smart-pointers/
|
|
Stephan.Woebbeking 
      
Beiträge: 97
|
Verfasst: Mi 23.05.12 08:10
Sieht definitiv interessant aus! Allerdings durchblicke ich es nicht soweit, dass ich - ohne es erstmal anzuwenden - die Grenzen verstehen würde. Nutzt du das? Was sind die Nachteile? Der zusätzliche Implementierungaufwand ist ja nicht so groß, soweit ich das sehen kann, oder? Man muss halt bloß dran denken, beim Anlegen der Instanzen die veränderte Form zu nutzen. Den Beitrag von Stefan Meisner finde ich auch interessant, leider ist da nur ein Teil des Mechanismus abgebildet soweit ich das sehen kann.
vG,
Stephan
|
|
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 23.05.12 08:17
Ja, ich nutze das. Ich bevorzuge den ObjectGuard, da ich das andere z.Zt. Overkill finde
Ein Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var sl: TStringList begin TObjectGuard.Guard(sl, TStringList.Create); sl.add('123'); sl.add('456'); end; |
Ich nutz das sogar fast täglich...
Solche Dinge hab ich mir auch für BeginUpdate und EndUpdate gebaut, falls Du daran interessiert bist.
Zuletzt bearbeitet von rd3 am Mi 23.05.12 12:17, insgesamt 1-mal bearbeitet
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 23.05.12 12:10
Was ist denn der Sinn von dem Guard? Der funktioniert doch nur innerhalb der gleichen Funktion, dort würde doch auch ein try/finally reichen. Wenn man Guard wie in der Funktion vom Threadersteller als Rückgabewert verwendet (TObjectGuard.Guard(Result, TStringList.Create)), knallt es doch spätestens beim Zugriff der aufrufenden Funktion, da das Objetc wieder freigegeben wurde. Oder hab ich das jetzt falsch verstanden?
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 23.05.12 12:12
Ja. Der Scope geht bis zum "end"
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 23.05.12 12:20
Verwendet man bei der Implementation eines Object ein Interface dann kann das Interface auch als Rückgabeparameter verwendet werden und ist ausserhalb der Funktion verwendbar. Der ObjectGuard löst dieses Problem nicht (da dort die StringList und der Guard als Rueckgabe weitergegeben werden muesste), es ist somit keine Lösung auf die Ausgangsfragestellung von Stephan (Object als Rückgabewert). Zumal sowas dann bei einem "Mischmasch" einfach nur total unübersichtlich wird (muss ich die StringList nun freigeben oder nicht?) was bei einer IInterface Implementierung des Objektes eindeutig zu erkennen ist. Welchen Vorteil hat man also, ausser einer Zeile die man sich beim der Programmierung einspart? (oder 3 mit Try/Finally?)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|