Hallo,
habe mich gerade mal wieder mit dem
DEC beschäftigt, und bin zufällig auf die Möglichkeit gestoßen, den Fortschritt in einer Progress Bar anzeigen zu können. So weit, so gut. Dachte ich zumindest.
Das implementieren des benötigten Interfaces IDECProgress im BCB stellt sich leider als schwieriger heraus, als es sich anhört.
Um der Problematik aus dem Weg zu gehen, für jede Mögliche ProgressBar (
JEDI,mbTBXLib,
Win32,...) eine Klasse für das IDEC Interface abzuleiten, wollte ich das ganze über eine Wrapper Klasse realisieren, die als Parameter die Progressbar erhält und diese dann entsprechend bedient...
Um nicht die Methoden des IUnknown Interfaces implementieren zu müssen (oder einfacher gesagt, weil ich es nicht kann
), habe ich die Wrapper Klasse also von TInterfacedObject und IDECProgress ableiten wollen, bekam dann aber ich eine Fehlermeldung "
VCL Klassen dürfen nicht mehrere Basisklassen haben". Bei einem Blick in die Hilfe für TInterfacedObject fiel mir dann folgende Passage auf: "TInterfacedObject darf in C++Builder-Anwendungen nicht eingesetzt werden"...
Hier mal der zu verwendende Code:
Code:
//---------------------------------------------------------------------------
#ifndef DECProgressBarWrapperH
#define DECProgressBarWrapperH
//---------------------------------------------------------------------------
#include "DECUtil.hpp"
//---------------------------------------------------------------------------
class DECProgressBarWrapper: public TInterfacedObject, IDECProgress
{
private:
TProgressBar *Bar;
bool Initialized;
protected:
public:
DECProgressBarWrapper( void * ProgressBar );
void __stdcall Process( __int64 Min, __int64 Max, __int64 Pos );
};
//---------------------------------------------------------------------------
#endif
sowie
Code:
//---------------------------------------------------------------------------
#include <
vcl.h>
#pragma hdrstop
#include "DECProgressBarWrapper.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
DECProgressBarWrapper( void * ProgressBar )
{
this->Bar = NULL;
this->Initialized = false;
if( dynamic_cast <TProgressBar *> ProgressBar )
{
this->Bar = dynamic_cast <TProgressBar *> ProgressBar;
}
//else if( dynamic_cast <TJvProgressBar *> ProgressBar )
//{
// this->Bar = dynamic_cast <TJvProgressBar *> ProgressBar;
//}
//
// ...
//
if( this->Bar != NULL )
{
this->Bar->Position = 0;
}
}
void __stdcall Process( __int64 Min, __int64 Max, __int64 Pos )
{
if( this->Bar != NULL )
{
if( !this->Initialized )
{
this->Bar->Min = Min;
this->Bar->Max = Max;
this->Initialized = true;
}
this->Bar->Position = Pos;
}
}
Jetzt natürlich meine Frage, kann das so funktionieren, wie ich mir das vorstelle?
Kann mir jemand erklären, wie ich das ganze in C++ realisieren kann, oder ist vielleicht jemand so freundlich mir den Code nach Delphi zu übersetzten?