declaring TBitmap globally
I would like to declare a TBitmap Globally.
I tried as follows:
Locally within a method, this works fine
std::auto_ptr<Graphics::TBitmap> RenderGraphic(new Graphics::TBitmap());
OR
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
So to declare it globally I tried this in the header file
Graphics::TBitmap *RenderGraphic;
And this in the constructor
__fastcall TShipGraphic::TShipGraphic(TComponent* Owner)
: TForm(Owner)
{
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
}
Which compiles fine but when running, throws an access violation exception at the first occurrence of
RenderGraphic->Canvas->Pen->Color = clBlack;
Please advise, tks in advance.
The reference source I was using is C++ Builder Graphics Introduction
which suggested the declaration in the constructor
c++builder rad-studio
|
show 6 more comments
I would like to declare a TBitmap Globally.
I tried as follows:
Locally within a method, this works fine
std::auto_ptr<Graphics::TBitmap> RenderGraphic(new Graphics::TBitmap());
OR
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
So to declare it globally I tried this in the header file
Graphics::TBitmap *RenderGraphic;
And this in the constructor
__fastcall TShipGraphic::TShipGraphic(TComponent* Owner)
: TForm(Owner)
{
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
}
Which compiles fine but when running, throws an access violation exception at the first occurrence of
RenderGraphic->Canvas->Pen->Color = clBlack;
Please advise, tks in advance.
The reference source I was using is C++ Builder Graphics Introduction
which suggested the declaration in the constructor
c++builder rad-studio
1
In the constructor you are declaring and initializing a local variable and not the global variableRenderGraphic
– Kerem D
Nov 12 '18 at 12:39
Global to what? You got more than one Forms? usingGraphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you usestatic
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...
– Spektre
Nov 13 '18 at 4:38
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50
|
show 6 more comments
I would like to declare a TBitmap Globally.
I tried as follows:
Locally within a method, this works fine
std::auto_ptr<Graphics::TBitmap> RenderGraphic(new Graphics::TBitmap());
OR
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
So to declare it globally I tried this in the header file
Graphics::TBitmap *RenderGraphic;
And this in the constructor
__fastcall TShipGraphic::TShipGraphic(TComponent* Owner)
: TForm(Owner)
{
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
}
Which compiles fine but when running, throws an access violation exception at the first occurrence of
RenderGraphic->Canvas->Pen->Color = clBlack;
Please advise, tks in advance.
The reference source I was using is C++ Builder Graphics Introduction
which suggested the declaration in the constructor
c++builder rad-studio
I would like to declare a TBitmap Globally.
I tried as follows:
Locally within a method, this works fine
std::auto_ptr<Graphics::TBitmap> RenderGraphic(new Graphics::TBitmap());
OR
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
So to declare it globally I tried this in the header file
Graphics::TBitmap *RenderGraphic;
And this in the constructor
__fastcall TShipGraphic::TShipGraphic(TComponent* Owner)
: TForm(Owner)
{
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
}
Which compiles fine but when running, throws an access violation exception at the first occurrence of
RenderGraphic->Canvas->Pen->Color = clBlack;
Please advise, tks in advance.
The reference source I was using is C++ Builder Graphics Introduction
which suggested the declaration in the constructor
c++builder rad-studio
c++builder rad-studio
asked Nov 12 '18 at 9:44
BarryKBarryK
94
94
1
In the constructor you are declaring and initializing a local variable and not the global variableRenderGraphic
– Kerem D
Nov 12 '18 at 12:39
Global to what? You got more than one Forms? usingGraphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you usestatic
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...
– Spektre
Nov 13 '18 at 4:38
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50
|
show 6 more comments
1
In the constructor you are declaring and initializing a local variable and not the global variableRenderGraphic
– Kerem D
Nov 12 '18 at 12:39
Global to what? You got more than one Forms? usingGraphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you usestatic
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...
– Spektre
Nov 13 '18 at 4:38
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50
1
1
In the constructor you are declaring and initializing a local variable and not the global variable
RenderGraphic
– Kerem D
Nov 12 '18 at 12:39
In the constructor you are declaring and initializing a local variable and not the global variable
RenderGraphic
– Kerem D
Nov 12 '18 at 12:39
Global to what? You got more than one Forms? using
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you use static
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...– Spektre
Nov 13 '18 at 4:38
Global to what? You got more than one Forms? using
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you use static
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...– Spektre
Nov 13 '18 at 4:38
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50
|
show 6 more comments
1 Answer
1
active
oldest
votes
You need to implement a singleton. Consider read-only case (bitmap is created once, no setter function).
In MyGraphics.h define accessor function
#include <vcl.h>
TBitmap* GetRenderGraphic();
Implementation in MyGraphics.cpp
static std::unique_ptr<TBitmap> renderGraphic(new TBitmap());
TBitmap* GetRenderGraphic()
{
return renderGraphic.get();
}
Use it (required including of MyGraphics.h)
GetRenderGraphic()->Canvas->Pen->Color = clBlack;
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked asstatic
also as you use class method to access static member.
– serge
Nov 12 '18 at 14:15
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53259456%2fdeclaring-tbitmap-globally%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You need to implement a singleton. Consider read-only case (bitmap is created once, no setter function).
In MyGraphics.h define accessor function
#include <vcl.h>
TBitmap* GetRenderGraphic();
Implementation in MyGraphics.cpp
static std::unique_ptr<TBitmap> renderGraphic(new TBitmap());
TBitmap* GetRenderGraphic()
{
return renderGraphic.get();
}
Use it (required including of MyGraphics.h)
GetRenderGraphic()->Canvas->Pen->Color = clBlack;
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked asstatic
also as you use class method to access static member.
– serge
Nov 12 '18 at 14:15
add a comment |
You need to implement a singleton. Consider read-only case (bitmap is created once, no setter function).
In MyGraphics.h define accessor function
#include <vcl.h>
TBitmap* GetRenderGraphic();
Implementation in MyGraphics.cpp
static std::unique_ptr<TBitmap> renderGraphic(new TBitmap());
TBitmap* GetRenderGraphic()
{
return renderGraphic.get();
}
Use it (required including of MyGraphics.h)
GetRenderGraphic()->Canvas->Pen->Color = clBlack;
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked asstatic
also as you use class method to access static member.
– serge
Nov 12 '18 at 14:15
add a comment |
You need to implement a singleton. Consider read-only case (bitmap is created once, no setter function).
In MyGraphics.h define accessor function
#include <vcl.h>
TBitmap* GetRenderGraphic();
Implementation in MyGraphics.cpp
static std::unique_ptr<TBitmap> renderGraphic(new TBitmap());
TBitmap* GetRenderGraphic()
{
return renderGraphic.get();
}
Use it (required including of MyGraphics.h)
GetRenderGraphic()->Canvas->Pen->Color = clBlack;
You need to implement a singleton. Consider read-only case (bitmap is created once, no setter function).
In MyGraphics.h define accessor function
#include <vcl.h>
TBitmap* GetRenderGraphic();
Implementation in MyGraphics.cpp
static std::unique_ptr<TBitmap> renderGraphic(new TBitmap());
TBitmap* GetRenderGraphic()
{
return renderGraphic.get();
}
Use it (required including of MyGraphics.h)
GetRenderGraphic()->Canvas->Pen->Color = clBlack;
answered Nov 12 '18 at 13:09
sergeserge
59537
59537
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked asstatic
also as you use class method to access static member.
– serge
Nov 12 '18 at 14:15
add a comment |
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked asstatic
also as you use class method to access static member.
– serge
Nov 12 '18 at 14:15
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
Many Thanks @serge . I did as suggested, however I get a linker error [ilink32 Error] Error: Unresolved external 'TShipGraphic::GetRenderGraphic()' referenced from E:!STAB PROGRAMBARRACUDA 2018E - SG CODEBARRACUDA 2018E2WIN32DEBUGOSSSHIPGRAPHIC.OBJ [ilink32 Error] Error: Unable to perform link
– BarryK
Nov 12 '18 at 13:43
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked as static
also as you use class method to access static member.– serge
Nov 12 '18 at 14:15
TShipGraphic::GetRenderGraphic()
seems to be not implemented or the implementation is not included in the project. It should be marked as static
also as you use class method to access static member.– serge
Nov 12 '18 at 14:15
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53259456%2fdeclaring-tbitmap-globally%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
In the constructor you are declaring and initializing a local variable and not the global variable
RenderGraphic
– Kerem D
Nov 12 '18 at 12:39
Global to what? You got more than one Forms? using
Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap;
in main form cpp somwhere at the top usually works but ... if you are accessing it from different forms it might get duplicated unless you usestatic
. Much safer is to have it as a member and share its pointer when ever you need to. The access violation is usually at the start when you are accessing things not yet initialized. We need to know more about architecture of your app ... Hope you are not using threads ...– Spektre
Nov 13 '18 at 4:38
@Spektra In this instance global across all methods within ONE form.
– BarryK
Nov 13 '18 at 6:42
I placed Graphics::TBitmap * RenderGraphic = new Graphics::TBitmap; near the top of the .cpp, outside of the Constructor, or any other method, and now don't get Access Violation errors, however all my RenderGraphic->Canvas-> statements, like MoveTo, LineTo, Polygon appear to do nothing as no bitmap is drawn to the canvas, when using Canvas->Draw(10, 10, RenderGraphic); and when saving to a .bmp file, the file size is zero. Perhaps this is a different question.
– BarryK
Nov 13 '18 at 7:06
Ok I have worked the bitmap size was probably zero hence nothing appeared. I established this being to draw over an existing bitmap loaded from file. Rendergraphic->SetSize sorts out this problem. But in order to draw transparently over what is already on the form canvas, I still need to first load a bitmap, albeit a plain white one. RenderGraphic->Transparent = true, has no effect unless a bitmap has been loaded from file. Any advise here?
– BarryK
Nov 13 '18 at 12:50