Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

Klasse als parameter übergeben Const, Var, ...

  Alt 3. Feb 2023, 11:36
Hallo zusammen,

bisher wurde in einer Anwednung, die ich betreue folgendes verwendet
Delphi-Quellcode:
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;
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.

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:
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;
Zwei Fragen:
  • Gibt es ein grundsätzliches Strukturproblem bei dem neuen Aufbau
  • Wie unterscheidet sich bei einer Klasse ob ich die Klasse als Var, Const oder ohne Zusatz in der Parameterliste übergebe

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
  • Var MyClass könnte auch in LoadFromDB erstellt werden wenn NIL rein gegeben wird
  • Const MyClass muss schon erstellt sein
  • und ohne Zusatz?
Grüße
Gerd

Geändert von norwegen60 ( 3. Feb 2023 um 11:41 Uhr)
  Mit Zitat antworten Zitat