Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Klasse nicht registriert"-Fehlermeldung abfangen? (https://www.delphipraxis.net/58969-klasse-nicht-registriert-fehlermeldung-abfangen.html)

CG2003 15. Dez 2005 07:01


"Klasse nicht registriert"-Fehlermeldung abfangen?
 
Hallo liebe DP-Gemeinde,

ich wusste leider nicht, in welchen Bereich ich diesen Thread erstellen sollte, deshalb ist er bei "Sonstige Fragen zu Delphi" gelandet.

Ich nutze in Delphi eine importierte ActiveX-Typbibliothek, welche es mir ermöglicht, per SDK aud meinem Dymo-Etikettendrucker zu drucken.
Nun habe ich ein Problem. Wenn das SDK nicht installiert ist, bricht das Starten meines Programmes mit einer Exception ab, das irgendwelche Klassen nicht registriert sind. Soweit normal und okay.

Doch, wie kann ich das abfangen? Wie kann ich es machen, das mein Programm "prüft", ob es installiert ist oder nicht, und mir keine Fehlermeldung ausspuckt?
Habe sonst noch nie mit ActiveX etc. gearbeitet....

Für Hilfe (und ist sie auch noch so klein), bin ich sehr dankbar.

Bernhard Geyer 15. Dez 2005 07:05

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Ganz normal wie sonst auch: Mit try...except

Delphi-Quellcode:
try
  MyIntf := CoTlbInterface.Create
except
  ShowMessage('Nicht installiert');
end;

CG2003 15. Dez 2005 11:34

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Hmm, mag sein das ich jetz einen Denkfehler habe, aber mit .Create muss ich da nichts machen. Es handelt sich dabei um eine Art "Komponente", welche in der Komponentenpalette unter "ActiveX" importiert wurde. Die ziehe ich auf mein TForm, und kann Sie ohne einen .Create Aufruf benutzen.

zecke 15. Dez 2005 11:38

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Das mit Create war auch nur ein Beispiel soweit ich das verstanden habe. Die Struktur try ...except sollte Abhilfe schaffen meinte Bernhard Geyer.

(Angaben ohne *peng* :mrgreen:)

tomsel 15. Dez 2005 11:42

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Zitat:

Hmm, mag sein das ich jetz einen Denkfehler habe, aber mit .Create muss ich da nichts machen. Es handelt sich dabei um eine Art "Komponente", welche in der Komponentenpalette unter "ActiveX" importiert wurde. Die ziehe ich auf mein TForm, und kann Sie ohne einen .Create Aufruf benutzen.
dann setze doch das Erzeugen des betreffenden Formulars in einen try-except-Block

Flocke 15. Dez 2005 11:43

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Du solltest dann das Formular, auf dem du die Komponente benutzt, nicht automatisch erzeugen lassen sondern von Hand (Form17 = TForm17.Create(Application)). Diesen Aufruf kannst du dann in ein try..except packen.

Wenn die Komponente auf deinem Hauptformular liegt (das immer automatisch geladen wird), dann musst du sie wohl entweder auf einem anderen Formular platzieren (s.o.) oder du musst sie dynamisch zur Laufzeit erzeugen und dies in try..except fassen. Ist natürlich mühselig wenn du viele Eigenschaften im OI eingestellt hast, die musst du dann alle von Hand zuweisen.

So könntest du aber über "Assigned(FDruckKompo)" prüfen, ob das SDK installiert ist und entsprechend die Menüpunkte deaktivieren.

//Edit: Kasten ignoriert

CG2003 15. Dez 2005 11:45

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Zitat:

Zitat von Flocke
Du solltest dann das Formular, auf dem du die Komponente benutzt, nicht automatisch erzeugen lassen sondern von Hand (Form17 = TForm17.Create(Application)). Diesen Aufruf kannst du dann in ein try..except packen.

Wenn die Komponente auf deinem Hauptformular liegt (das immer automatisch geladen wird), dann musst du sie wohl entweder auf einem anderen Formular platzieren (s.o.) oder du musst sie dynamisch zur Laufzeit erzeugen und dies in try..except fassen. Ist natürlich mühselig wenn du viele Eigenschaften im OI eingestellt hast, die musst du dann alle von Hand zuweisen.

So könntest du aber über "Assigned(FDruckKompo)" prüfen, ob das SDK installiert ist und entsprechend die Menüpunkte deaktivieren.

//Edit: Kasten ignoriert

Ja, das wäre eine sehr gute Möglichkeit/Idee. Nur (sorry für die peinliche Frage), wie erzeuge ich diese dynamisch zur Laufzeit? :oops:

tomsel 15. Dez 2005 11:50

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Zitat:

... Hauptformular liegt (das immer automatisch geladen wird),...
das wird nicht automatisch geladen, sondern der zum Laden erforderliche Programmcode wird automatisch erzeugt. Sieh dir die *.dpr - Datei des Projekts an, dort findest Du etwas wie
Delphi-Quellcode:
Application.Createform(tForm1, Form1)
Mach daraus etwas in der Art wie
Delphi-Quellcode:
try
  Application.Createform(tForm1, Form1);
  ...
  Application.Run;
except
  ShowMessage('Shit');
end;

Flocke 15. Dez 2005 11:54

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Zitat:

Zitat von CG2003
Ja, das wäre eine sehr gute Möglichkeit/Idee. Nur (sorry für die peinliche Frage), wie erzeuge ich diese dynamisch zur Laufzeit? :oops:

Bei einem Formular ist's relativ einfach:
1. Nimm es über die Projektoptionen aus der automatischen Formularerstellung heraus.
2. Ich mache es ganz gerne so, dass ich es erzeuge wenn ich es das erste Mal brauche. Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Form17) then
    try
      Form17 := TForm17.Create(Application);
    except
      on E: Exception do
      begin
        MessageDlg('... die Laufzeitkomponente für den Ausdruck steht nicht zur Verfügung.' + E.Message);
        exit;
      end;
    end;

  Form17.ShowModal;
end;
Noch `schicker´ wird's, wenn du in der Unit für das Formular eine Prozedur dafür schreibst, z.B. "DruckFormularAnzeigen" und dort dann diesen Code hineinschreibst. Dann rufst du statt "Form17.ShowModal" einfach immer nur "DruckFormularAnzeigen" auf.


Bei einer Komponente noch einfacher:
1. Kopiere die Deklaration aus der Klasse in den public Teil.
Delphi-Quellcode:
FDruckKompo1: TDruckKomponente;
2. Lösche die Komponente vom Formular.
3. Erzeuge sie in Form.OnCreate selbst:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    FDruckKompo1 := TDruckKomponente.Create(Self);
    FDruckKompo1.Parent := Self; // falls nötig
    FDruckKompo1.Eigenschaft1 := false; // alle Eigenschaften setzen
  except
    on E: Exception do
      MessageDlg('... die Laufzeitkomponente für den Ausdruck steht nicht zur Verfügung.' + E.Message);
  end;

  // Menüeinträge steuern
  FDrucken1.Enabled := Assigned(FDruckKompo1);
end;
Waren jetzt alles ungetestete Beispiele.

// Edit: Noch mal roten Kasten ignoriert.

dfried 15. Dez 2005 12:03

Re: "Klasse nicht registriert"-Fehlermeldung abfan
 
Zitat:

Zitat von Flocke
Wenn die Komponente auf deinem Hauptformular liegt (das immer automatisch geladen wird), dann musst du sie wohl entweder auf einem anderen Formular platzieren (s.o.) oder du musst sie dynamisch zur Laufzeit erzeugen und dies in try..except fassen. Ist natürlich mühselig wenn du viele Eigenschaften im OI eingestellt hast, die musst du dann alle von Hand zuweisen.

Oder GExperts verwenden und "ComponentsToCode" benutzen :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz