![]() |
Klasse als parameter übergeben Const, Var, ...
Hallo zusammen,
bisher wurde in einer Anwednung, die ich betreue folgendes verwendet
Delphi-Quellcode:
Das heißt die Klasse wurde in der Function erstellt und als Result zurück gegeben. Das funktioniert so weit auch fehlerfrei auch wenn es unschön ist, dass die Klasse "fremderzeugt" wird.
function LoadFromDB(iID:Integer):TMyClass;
begin Result := TMyClass.Create; ... Result.ID = dbQuery.FieldByName('ID').AsInteger; ... end; function GetMyClass(iID:Integer):TMyClass begin Result := nil; for i:= 0 to MyClassList.Count-1 do begin if MyClassList[i].ID = iID then begin Result := MyClassList[i]; break; end; end; if Result = nil then begin Result := LoadFromDB(iId); if Result <> nil then MyClassList.Add(Result); end; end; Ich möchte jetzt aber z.B. ein Refresh einbauen und muss damit der LoadFromDB sagen, dass die Klasse schon existiert und diese auch übergeben. Mein Konstrukt sähe also eher so aus
Delphi-Quellcode:
Zwei Fragen:
function LoadFromDB(aMyClasse:TMyClass; iID:Integer):Boolean; // oder besser LoadFromDB(var/const aMyClasse:TMyClass; iID:Integer) ????????
begin ... SQL um Datensatz zu finden Result := not sql.IsEmpty; ... aMyClasse.ID = dbQuery.FieldByName('ID').AsInteger; ... end; function GetMyClass(iID:Integer; bRefresh:Boolean):TMyClass begin Result := nil; for i:= 0 to MyClassList.Count-1 do begin if MyClassList[i].ID = iID then begin Result := MyClassList[i]; break; end; end; if (Result = nil) or bRefresh then begin bNew := False; if Result := nil then begin Result := TMyClass.Create; bNew := True; end; if not LoadFromDB(Result, iId) then // Wenn nichts gefunden wieder Free FreeAndNil(Result); if bNew and (Result <> nil) then MyClassList.Add(Result); end; end;
Ich habe mal irgendwo gefunden, wie sich das unterscheidet, finde es aber leider nicht mehr. Bei Variablen ist es klar, aber bei dem Pointer?? Ich meine es war so was wie
Gerd |
AW: Klasse als parameter übergeben Const, Var, ...
Zitat:
Delphi-Quellcode:
bar wird als wert übergeben
procedure foo(bar)
Delphi-Quellcode:
bar wird als referenz übergeben
procedure foo(var bar)
Ich hoffe es hilft. |
AW: Klasse als parameter übergeben Const, Var, ...
Hier ist die vermisste Erklärung zu den
![]() |
AW: Klasse als parameter übergeben Const, Var, ...
Solange man nicht versucht, innerhalb der Routine die übergebene Instanz zu ändern, gibt es funktional eigentlich keinen Unterschied. Falls aber doch:
Delphi-Quellcode:
procedure Wuppdi(MyClass: TMyClass);
begin MyClass := TMyClass.Create; // funktioniert, die Originalinstanz bleibt unberührt end;
Delphi-Quellcode:
procedure Wuppdi(var MyClass: TMyClass);
begin MyClass := TMyClass.Create; // funktioniert, die Originalinstanz wird überschrieben end;
Delphi-Quellcode:
procedure Wuppdi(const MyClass: TMyClass);
begin MyClass := TMyClass.Create; // kompiliert nicht, und das ist auch gut so end; |
AW: Klasse als parameter übergeben Const, Var, ...
Klassen sind im Prinzip Pointer, also ihr Inhalt kann auch ohne VAR und sogar bei CONST geändert werden.
Eine Art "real const" ist auch nicht möglich, da der Compiler garnicht entscheiden/wissen kann, ob z.B. beim Zugriff auf Property/Methoden sich etwas ändert. prinzipiell halte ich es so
Code:
VAR obj = es kann/wird das komplette Objekt durch eine andere Instanz getauscht/erstellt/freigegeben
OUT obj = es geht nie etwas (gültiges) rein und es kommt immer was Neues raus, oder NIL obj = die Instanz bleibt gleich, aber ihr inhalt könnte sich ändern CONST = prinzipiell der Inahlt der Klasse ändert sich nicht (auch wenn es eigentlich nichts mit dem CONST zu tun hat, da sich der Zeiger so oder so nicht ändert, also nur als Dokumentation) (ok, Meistens lasse ich es auch in diesem Fall oft weg, also gemischt mit OHNE) CONST [Ref] obj = Ist wie CONST, aber der Zeiger selbst wird dennoch als Referenz auf die Variable übergeben, nicht nur der Wert des Pointers. Syntaktisch hat es für mich aber keine Beziehung zu Objekten. Bei der Benamung hab ich dann ich noch ein paar Conventionen (so in etwa): GetIrgendwas gibt ein Objekt zurück, aber es kümmert sich jemand um die Freigabe (es bleibt in dessen Besitz). CreateIrgendwas oder GenerateIrgendwas erzeugt etwas und der Aufrufer hat sich um die Freigabe zu kümmern. Und ansonsten wird Abweichendes brav im
Delphi-Quellcode:
erwähnt.
/// <returns> ... </returns>
|
AW: Klasse als parameter übergeben Const, Var, ...
[QUOTE=KodeZwerg;1518261]
Zitat:
|
AW: Klasse als parameter übergeben Const, Var, ...
Zitat:
|
AW: Klasse als parameter übergeben Const, Var, ...
Kann es sein, dass du die Instanz beim Refresh noch aus der Liste entfernen musst, wenn LoadFromDB fehlschlägt? Der Datensatz kann ja vielleicht zwischenzeitlich gelöscht worden sein.
Da die Reihenfolge in der Liste offenbar keine Rolle spielt, wäre vielleicht ein
Delphi-Quellcode:
für MyClassList die geschicktere Wahl. Dann schrumpft das GetMyClass etwas zusammen:
TObjectDictionary<Integer, TMyClass>
Delphi-Quellcode:
function GetMyClass(iID: Integer; bRefresh: Boolean): TMyClass;
begin if MyClassList.TryGetValue(iID, Result) then begin if not LoadFromDB(Result, iID) then begin MyClassList.Remove(iiD); Result := nil; end; end else begin Result := TMyClass.Create; if LoadFromDB(Result, iID) then MyClassList.Add(iID, Result) else FreeAndNil(Result); end end; |
AW: Klasse als parameter übergeben Const, Var, ...
Nach meinem beschränkten Verständnis ist eine
![]() Dermaßen mit semantischen Grundlagen bewaffnet wird hoffentlich einiges klarer. Sherlock -der fast schon enttäuscht ist, daß keiner auf diesen Umstand aufmerksam gemacht hat |
AW: Klasse als parameter übergeben Const, Var, ...
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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