Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Komponentenentwicklung - Fehler beim Beenden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.04.2005, 13:07 Uhr
insaint



Hallo zusammen:

Ich versuche mich gerade mal daran, eine eigenen Komponente zu schreiben.
Zum ausprobieren, möchte ich eine TForm in ein Panel bringen.

Zuerst habe ich also ein neues Panel angelegt, von TPanel abgeleitet, ...

den Quellcode verändert, kompiliert, installiert, gespeichert.

Bis dahin alles wunderbar! Sobald ich das neue Panel auf eine Form in einem neuen Projekt ziehe, zeigt er alles so an, wie er soll. Auch wenn das Projekt dann läuft, gibt es keinerlei Probleme!

Wenn ich die Form dann aber schließe, also das Projekt beende, gibt er mir einen Fehler in einem Popup aus, dass ich irgendeine Speicherverletzung bei Adresse [irgendwas] habe, und schmiert dann ab!

Also, weiss jemand eine Lösung für mein Problem?
Freue mich über jede Antwort.

Hier mein Code:

.cpp


C++:
//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "O_Panel.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Mit ValidCtrCheck wird sichergestellt, daß die erzeugten Komponenten
// keine rein virtuellen Funktionen besitzen.
//
  TForm *ONForm;


static inline void ValidCtrCheck(TOPanel *)
{
  new TOPanel(NULL);
}
//---------------------------------------------------------------------------
__fastcall TOPanel::TOPanel(TComponent* Owner)
        : TPanel(Owner)
{
  ONForm = new TForm(this);
  ONForm->Parent = this;
  //ONForm->BorderStyle = bsNone;
  ONForm->WindowState = wsMaximized;

}
//---------------------------------------------------------------------------

__fastcall TOPanel::~TOPanel()
{
  delete ONForm;
}

void __fastcall TOPanel::Paint(void)
{
  TPanel::Paint();
  ONForm->Show();
}
//---------------------------------------------------------------------------


namespace O_panel
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TOPanel)};
                 RegisterComponents("KOPanel", classes, 0);
        }
}
//---------------------------------------------------------------------------




und die .h


C++:
//---------------------------------------------------------------------------

#ifndef O_PanelH
#define O_PanelH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TOPanel : public TPanel
{
private:
protected:
public:
        __fastcall TOPanel(TComponent* Owner);
        __fastcall ~TOPanel();
        void __fastcall Paint(void);
__published:
};
//---------------------------------------------------------------------------
#endif



--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.04.2005, 13:55 Uhr
Th



Es könnte daran liegen, daß ein "delete" doppelt ausgeführt wird, einmal in deinem Destruktor und einmal im Destruktor des Panels, da du das OPanel als Owner der Form "ONForm" definierst hast.
Entferne mal einfach den delete im Destruktor.

Außerdem solltest du "TForm *ONForm" als Member von OPanel definieren, ansonsten könntest du keine zwei OPanel erzeugen...

Es ist außerdem nicht gut, ein Form als eingebettetes Objekt zu verwenden.
Wenn du eine Komponenten zum Anzeigen (selbst zeichnen) brauchst, dann verwende lieber die TPaintBox.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.04.2005, 16:19 Uhr
insaint



Danke erstmal für die Antwort!

Das mit dem doppelten Löschen sehe ich ein.
Funktioniert jetzt auch ohne Fehlermeldung!

Allerdings zeigt er das Fenster im Panel erst beim Start an.
Gut, dass könnte ich noch verkraften...
( schöner wäre es natürlich, wenn es angezeigt wird, sobald es auf der Form ist )

Allerdings verstehe ich das mit dem "Member" gerade nicht!
Das berühmte Brett, was da stört!

Wie würde der Code also aussehen, wenn ich


C++:
TForm *ONForm



als Member von OPanel setzten soll ???
--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.04.2005, 17:14 Uhr
insaint



*brett abreiß*

ok, als member setzten:

also in public in .h!!!

ich glaube ich geh besser schlafen!!!

also danke nochmal!
--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.04.2005, 17:26 Uhr
Th



Lieber in den "private"-Bereich setzen, außer du willst von außen Zugriff darauf gestatten...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.04.2005, 17:38 Uhr
insaint



oh... höhmmm ... ja *rot_werd*
--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: