[Gelöst] Exception in Package abfangen

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

[Gelöst] Exception in Package abfangen

Beitrag von Michl »

Hallo wertes Forum,

ich habe eine eigene Komponente, die mittels Property Active := True ein externes Programm starten soll. Dieses Programm sollte üblicherweise über den Systempfad zu finden sein. Wie kann ich es erreichen, dass, falls dieses Programm nicht auf dem Rechner vorhanden ist, Lazarus eine Meldung ausgibt, anstatt sich per Zugriffsverletzung zu beenden?

Ich kann mir zwei Lösungen vorstellen, deren Ansatz ich nicht gefunden habe:
1. Die Exception bei Active := True abfangen und per ShowMessage ausgeben (siehe Bsp)
2. Den Systempfad durchsuchen, ob das auszuführende Programm gefunden wird

Bsp (stark vereinfacht):

Code: Alles auswählen

  TMyComponent = class(TComponent)
  private
    FActive: Boolean;
    procedure SetActive(AValue: Boolean);
    function TryStartTestExcutable: Boolean;
  published
    property Active: Boolean read FActive write SetActive;
  end;
...
procedure TMyComponent.SetActive(AValue: Boolean);
begin
  if FActive = AValue then Exit;
  FActive := AValue;
  if FActive then
    FActive := TryStartTestExcutable;
end;
 
function TMyComponent.TryStartTestExcutable: Boolean;
var
  aProcess: TProcess;
begin
  Result := False;
  try
    aProcess := TProcess.Create(nil);
    aProcess.Executable := 'TestExecutable.exe';
    aProcess.Execute;
    Result := True;
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end; 
gestartet z.B. so (per Code geht es, die Exception auszugeben, in der IDE nicht):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  MyComponent: TMyComponent;
begin
  MyComponent := TMyComponent.Create(Self);
  MyComponent.Active := True;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: [Gelöst] Exception in Package abfangen

Beitrag von Michl »

:evil: ...so ist das, wenn man über seine eigene Dummheit stolpert. Die Exception geht genauso abzufangen. Man darf nur nicht irgendwann später bei einer erfolglosen Initialisierung ein Application.Terminate schreiben :oops:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten