Arbeiten mit unterschiedlichen c++builder Versionen
-
Hallo,
ich habe ein Projekt mit einem StringGrid in c++builder v11.3 erstellt. Wenn ich das Projekt mit v12.1 bearbeite, bekomme ich eine Fehlermeldung "Die Methode StringGrid1DrawCell enthält eine inkompatible Parameterliste".
Im *.h und *.cpp habe ich folgende Änderung mit Präprozessorvariablen gemacht und dann #define V12 oder V11 im Unit Code. Ist das der richtige Weg oder wie geht man damit um ? Es scheint so zu funktionieren, aber ob das so auf Dauer problemlos läuft bin ich mir nicht sicher.*.h #ifdef V12 void __fastcall StringGrid1DrawCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, TRect &Rect, TGridDrawState State); #else void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State); #endif *.cpp #ifdef V12 void __fastcall TCSV_Box::StringGrid1DrawCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, TRect &Rect, TGridDrawState State) #else void __fastcall TCSV_Box::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) #endif { //... }
-
Dieser Beitrag wurde gelöscht!
-
Du kannst auch Vordefinierte Makros benutzen, z.B.
#if _BCPLUSPLUS__ >= 0x0770 #else #endif
Edit: Sehe gerade, daß in der deutschen Wiki der Eintrag für "Athens" fehlt, aber im englischen Original C++ Compiler Versions in Predefined Macros vorhanden ist.
-
@Th69 Vielen Dank für den Hinweis und den Link !
-
Du kannst auch gegen die Delphi Version prüfen, was vllt genauer ist, da die VCL in Delphi geschrieben wurde:
Delphi Compiler Versionen
-
@DocShoe OK, danke dir. Ich werde beides ausprobieren. Hauptsache der Weg stimmt, da war ich mir nicht sicher.
-
Die
VerXXX
Makros sind aber nicht in einem C++ Projekt, sondern nur bei einem Delphi-Projekt (bzw. genauer, wenn der Delphi-Compiler eine Unit kompiliert) verfügbar.
-
@Th69 sagte in Arbeiten mit unterschiedlichen c++builder Versionen:
Die
VerXXX
Makros sind aber nicht in einem C++ Projekt, sondern nur bei einem Delphi-Projekt (bzw. genauer, wenn der Delphi-Compiler eine Unit kompiliert) verfügbar.Ach, echt? Wusste ich noch nicht, danke für die Info.
-
Das war leider zu früh gefreut. Das Programm lässt sich zwar starten, aber wenn ich an der Form was ändern will und auf Design klicke, bekomme ich folgende Fehlermeldung:
"Fehler im Modul Unit2: Falsche Methodendeklaration in Klasse TForm2"
//Unit2.cpp #if __BCPLUSPLUS__ >= 0x0770 void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, TRect &Rect, TGridDrawState State) #else void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) #endif { //... } //Unit2.h #if __BCPLUSPLUS__ >= 0x0770 void __fastcall StringGrid1DrawCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, TRect &Rect, TGridDrawState State); #else void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State); #endif
-
Der Designer kann dann wohl nicht mit der bedingten Kompilierung umgehen.
Steht der Code im Header dazu unter dem__published:
-Abschnitt?
Dann könntest du diesen Code in denprivate:
-Abschnitt verschieben und das Ereignis im Konstruktor zuweisen (anstatt vom Designer aus):StringGrid1->DrawCell = StringGrid1DrawCell;
(Evtl. mußt du vorher deinen Code noch mal auf den vorherigen Stand zurücksetzen, und dann im Designer die Ereigniszuweisung zu
StringGrid1DrawCell
wieder zurücknehmen, d.h. entfernen).
-
@Th69 sagte in Arbeiten mit unterschiedlichen c++builder Versionen:
StringGrid1->DrawCell = StringGrid1DrawCell;
Hallo Th69, vielen Dank für deine Hilfe. Ich denke ich habe die Änderungen so gemacht wie du sie beschrieben hast, aber jetzt sagt er:
[bcc32c Fehler] Unit2.cpp(34): 'DrawCell' is a protected member of 'Vcl::Grids::TStringGrid'
[bcc32c Fehler] Unit2.cpp(34): expression is not assignableIch will da jetzt auch keinen großen Aufwand betreiben, dann muss ich halt immer neu auskommentieren, oder habe ich bei deiner Änderung etwas falsch gemacht ?.
(Zeile 34 ist hier 48)*.h class TForm2 : public TForm { __published: // Von der IDE verwaltete Komponenten TStringGrid *StringGrid1; TStatusBar *StatusBar1; TButton *btnClose; void __fastcall FormShow(TObject *Sender); void __fastcall btnCloseClick(TObject *Sender); void __fastcall StringGrid1SelectCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, bool &CanSelect); void __fastcall StringGrid1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall btnKEClick(TObject *Sender); void __fastcall btnKIClick(TObject *Sender); void __fastcall btnSaveClick(TObject *Sender); private: // Benutzer-Deklarationen bool KE, KI; int rows; #if __BCPLUSPLUS__ >= 0x0770 void __fastcall StringGrid1DrawCell(TObject *Sender, System::LongInt ACol, System::LongInt ARow, TRect &Rect, TGridDrawState State); #else void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State); #endif public: // Benutzer-Deklarationen __fastcall TForm2(TComponent* Owner); }; *.cpp __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { SetBounds( 16, 16, 1440, 680 ); TBorderIcons tempBI = BorderIcons; tempBI >> biMaximize >> biMinimize; BorderIcons = tempBI; BorderStyle = bsSingle; Position = poDesigned; FormStyle = Vcl::Forms::fsNormal; StringGrid1->DrawCell = StringGrid1DrawCell; StringGrid1->FixedRows = 1; StringGrid1->FixedCols = 1; StringGrid1->Options = TGridOptions() << goEditing << goThumbTracking << goTabs << goColSizing; }
-
Sorry, hatte mich verschrieben - das Ereignis heißt OnDrawCell:
StringGrid1->OnDrawCell = StringGrid1DrawCell;
Edit: Müßtest du für
StringGrid1SelectCell
nicht auch dasselbe noch durchführen?
-
@Th69 Mit dieser Änderung kommt folgende Meldung:
[bcc32c Fehler] Unit2.cpp(35): assigning to 'Vcl::Grids::TDrawCellEvent' (aka 'void ((__closure *))(System::TObject *, System::LongInt, System::LongInt, const System::Types::TRect &, Vcl::Grids::TGridDrawState) attribute((fastcall))') from incompatible type 'void (__closure *)(System::TObject *, System::LongInt, System::LongInt, System::Types::TRect &, Vcl::Grids::TGridDrawState) attribute((fastcall))'Selbst wenn ich in beiden Dateien (h und cpp) die # Variablen rausnehme und nur die Methode für v12 noch drin ist, bring er folgende Meldung beim Speichern von Unit2:
Die Methode StringGrid1DrawCell, auf die StringGrid1.OnDrawCell verweist, existiert nicht. Soll der Verweis entfernt werden?Mit SelectCell hat er nie gemeckert, aber ich habe das auch mal rausgenommen, keine Änderung.
-
Beim 4. Parameter fehlt ein
const
bei deiner Methode:const TRect &Rect
(s. Athens: TDrawCellEvent)Das sollte auch in der Alexandria (V11)-Version so sein: Alexandria: TDrawCellEvent
Evtl. liegt es also gar nicht an der Änderung
System::LongInt
<->int
, sondern an dem fehlendenconst
.
Wenn der Designer allerdings diesen Code so erzeugt hat, dann ist dieser fehlerhaft.
-
@Th69 Die Sache mit const habe ich ausprobiert, aber dann hat meine Textausgabe nicht mehr funktioniert. Das Makro wäre eine schnelle und einfache Änderung gewesen, aber ich habe mich jetzt für das Auskommentieren entschieden. Ist auch nicht so viel Aufwand. Definitiv ist aber, dass beim Anlegen der OnDrawCell Methode weder bei der Version 11 noch bei der 12er Version vom OI ein const gesetzt wird, das muss manuell gemacht werden. Nochmals vielen Dank für deine Hilfe.