Einzelnen Beitrag anzeigen

SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: EAccessViolation mit StringListe

  Alt 17. Mai 2017, 09:49
Hallo.

Ich habe eine Situation die ich leider nicht nachvollziehen kann.
Es geht um eine Access Vialotion in eine Quelcode Zeile die nur ab und zu kommt.
Ich konnte den Fehler noch nicht nachstellen. Nur Nachträglich im LogFile auslesen.

Die abgekürzte fassung der Funktion:

Delphi-Quellcode:
Function TDMAng.CheckRV(RD:TStringList;var errlist:TStringList):boolean;
begin
  result:=true;
  if not assigned(errlist) then errlist:=TStringList.Create;
  errlist.Clear;
  
  //viele Prüfungen ...
  
  if bPasstNicht then
    errlist.Add('"215","'+'Hinweis: '+'Passt nicht!')

  //viele Prüfungen...
   
  result:= errlist.count=0;
end;
Wie schon gesagt wurde, wird hier die Liste mit free vorderbei freigegeben.
Ich würde die Liste nicht als Var-Parameter übergeben. Dadurch ist nicht mehr ersichtlich wer die Hoheit über die Liste hat, und wer sie freizugeben hat.

Sauberer wäre aus meiner Sicht, du baust eine lokale Liste auf, gibst nur den String zurück, und fügst den String dann in die eigentliche Liste ein.

Also so in etwa:

Delphi-Quellcode:
function CheckRV(RD:TStringList; out ErrorText: String): Boolean;
var
  ErrorList: TStringList;
begin
  ErrorList := TStringList.Create;
  try
    result:=true;
  
    //viele Prüfungen ...
  
    if bPasstNicht then
      ErrorList.Add('"215","'+'Hinweis: '+'Passt nicht!')

    //viele Prüfungen...
   
    result:= ErrorList.count=0;
    ErrorText := ErrorList.Text;
  finally
    FreeAndNil(ErrorList);
  end
end;


procedure foo;
var
  lstError: TStringList;
  ErrorText: String;
begin
  lstError := TStringList.Create;
  try
    if not CheckRV(dummy, ErrorText) then
      lstError.Text := lstError.Text + ErrorText;

  finally
    FreeAndNil(lstError);
  end

end;
  Mit Zitat antworten Zitat