AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

FreeAndNil Problem

Ein Thema von Andidreas · begonnen am 11. Apr 2012 · letzter Beitrag vom 11. Apr 2012
Antwort Antwort
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.089 Beiträge
 
Delphi XE Professional
 
#1

FreeAndNil Problem

  Alt 11. Apr 2012, 10:09
Hallo zusammen,

wir verwenden in unserer Firma die Labelling Software Codesoft.
Codesoft bietet eine Typenbibliothek (ActiveX) an die man sich in Delphi integrieren kann (als Komponente).
Hierzu hat vor einiger Zeit ein Kollege (der mittlerweile die Firma verlassen hat) noch zusätzlich eine Unit Programmiert über die man auf die Codesoft Funktionen zugreifen kann.

Gestern habe ich auf meinem Rechner eine neue Version von Codesoft installiert. Alles funktioniert wunderbar bis auf das Beenden meines Programmes.
Beim Start meines Programmes wird Codesoft wie folgt mitgestartet:
Delphi-Quellcode:
    //Create Codesoft Proxy
    Try
      Codesoft := TCodesoftProxy.create(sDefaultFieldList, sDefaultFieldDSC , sDefaultBMP);
      Bitmap := TPicture.Create;
    Except
      On E:Exception Do
      Begin
        MessageDlg(E.Message, mtError, [mbOK], 0);
      End;
    End;
    //Initialize Codesoft
    Try
      Codesoft.initialize;
    Except
      On E:Exception Do
      Begin
        MessageDlg(E.Message, mtError, [mbOK], 0);
      End;
    End;
  End;
Beim schließen meines Programmes wird Codesoft wie folgt beendet:
Delphi-Quellcode:
  //Free Codesoft
  If Codesoft <> nil Then
  Begin
    Try
      //Codesoft.Free;
      FreeAndNil(Codesoft);
    Except
      fnCloseProgram('Lppa.exe');
      MessageDlg('Could not release Codesoft! Check your TaskManager!!!', mtError, [mbOK], 0);
    End;
  End;
Im angehängten Bild seht ihr den Fehler den ich beim Schließen meines Programmes erhalte...


Das kuriose ist, ich habe ein Test Tool das auf die selbe Art & Weise Codesoft startet und beendet, hier erhalte ich diesen Fehler nicht !
Anbei der Code...
Codesoft starten:
Delphi-Quellcode:
  try
    codesoftProxy := TcodesoftProxy.create(edit3.text, Edit4.text, edit5.text);
    Label1.Caption := 'Created';
  except
    on e : Exception do
      messageDLG(e.Message, mtInformation, [mbOk], 0);
  end;
  try
    codesoftProxy.initialize;
    Label1.Caption := 'Initialized';
  except
    on e : Exception do
      messageDLG(e.Message, mtInformation, [mbOk], 0);
  end;
Codesoft schließen:
Delphi-Quellcode:
  try
    freeandnil(codesoftProxy);
    Image1.Picture := nil;
    Label1.Caption := 'Freed';
  except
    on e : Exception do
      messageDLG(e.Message, mtInformation, [mbOk], 0);
  end;
Hat jemand eine Idee was falsch laufen könnte?
Miniaturansicht angehängter Grafiken
codesofterror.jpg  
Andreas Schulze
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
34.941 Beiträge
 
Delphi XE2 Professional
 
#2

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:15
Was steht im Destruktor der Proxy-Klasse?
Die ActiveX-Klase scheint nicht richtig beendet zu werden
Der Unterschied zum Testprogramm wird sein, das dieses nichts weiteres macht.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.089 Beiträge
 
Delphi XE Professional
 
#3

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:18
Was meinst Du mit Destruktor Klasse?
Sorry für die doofe Frage, aber mit Active X Steuerelementen hab ich mich noch nie wirklich auseinander gesetzt....

Zum Testprogramm... Stimmt so nicht ganz...
Bei meinem Programm was Produktiv eingesetzt wird, wird nach dem Start ein Etikett automatisch in der Preview angezeigt.
Das Gleiche habe im Testprogramm gemacht...
Wie gesagt der unterschied ist das im Testprogramm dann kein Fehler kommt, aber dafür in meinem Programm...
Andreas Schulze
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
319 Beiträge
 
Delphi XE3 Professional
 
#4

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:25
Was meinst Du mit Destruktor Klasse?
TcodesoftProxy ist ja wahrscheinlich nicht die eigentliche ActiveX-Klasse, sondern eine Klasse aus dieser Zwischenunit, die dein ehemaliger Kollege geschrieben hat, oder? Da TcodesoftProxy am Ende freigegeben wird, wird ja dessen Destruktor aufgerufen und der macht vielleicht dann irgendwas "komisches" mit der eigentlichen ActiveX-Klasse. Kurz: was also steht in TcodesoftProxy.Destroy ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
34.941 Beiträge
 
Delphi XE2 Professional
 
#5

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:25
FreeAndNil() ruft Object.Free() auf welches des Destruktor Object.Destroy() auf.

Diese muss dann dafür sorge, dass die ActiveX Instanz beendet wird. Meine Vermutung war/ist, da sich bei der neuen Version hier das Interface geändert hat.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.089 Beiträge
 
Delphi XE Professional
 
#6

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:29
Also Du meinst diese Code Stelle
Delphi-Quellcode:
destructor TcodesoftProxy.destroy();
begin
  slFormelList.free;
  slPicturesList.free;
  slDescriptionFields.free;
  try
    if bInizialized and not fTestMode then begin
      try
        closeDocuments();
      finally
        appCodesoft.Quit;
      end;
    end;
  finally
    if bInizialized and not fTestMode then
      appCodesoft.Free;
    appCodesoft := nil;
  end;
end;
Die befindet sich in der Unit die von dem Kollegen Programmiert wurde der gekündigt hat...

Aber wenn sich am Interface was geändert hat, warum krieg ich im Testprogramm den Fehler dann nicht?
Andreas Schulze
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
34.941 Beiträge
 
Delphi XE2 Professional
 
#7

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:31
Macht die eigentliche Anwendung noch mehr?
Schau dir mal die API-Beschreibung an.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.089 Beiträge
 
Delphi XE Professional
 
#8

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:35
Hmm glaub es liegt an dem CloseDocuments()
Im Testprogramm führt er die Stelle ohne Probleme aus...
In meinem richtigen Programm führt er die Stelle auch aus, bleibt dann aber beim Quit hängen...

Das mitm Destructor war schon mal ein guter Hinweis, Danke!
Andreas Schulze
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
110 Beiträge
 
Delphi XE4 Professional
 
#9

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:42
In Deinem Programm steht
Code:
fnCloseProgram('Lppa.exe');
drin. Im Testprogramm nicht. Was bedeutet dieser Unterschied?
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
319 Beiträge
 
Delphi XE3 Professional
 
#10

AW: FreeAndNil Problem

  Alt 11. Apr 2012, 10:48
Wenn sich an der Schnittstelle etwas geändert haben sollte, könntest du auch mal versuchen, die Typbibliothek neu zu importieren. Das ist die Unit, die Delphi aus einer ActiveX-DLL erstellt, damit man aus Delphi heraus auf die Schnittstelle bequem zugreifen kann. In der Zwischen-Unit deines Ex-Kollegen müsste eine weitere Unit eingebunden sein wie codesoft_TLB.pas oder so ähnlich.

Diese Datei könntest du, um sie zu sichern, umbenennen und dann unter Delphi den Menüpunkt "Komponente->Komponente importieren" wählen. Dort dann Typbibliothek auswählen und dann die Codesoft-Bibliothek aus der Liste suchen und auswählen. Das Ergebnis lässt du dann in eine Unit in dein Projekt schreiben, der du dann wieder den selben Namen wie vorher geben solltest.

Sollte sich dann an der Schnittstelle irgendwas geändert haben, bekommst du beim nächsten Compilieren wenigstens Fehlermeldungen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf