|
Hello, I seen that this Refresh() should force the button to redraw itself, and I tested but it still didn't work. I then guessed that the button was disabled and I was right, because the button is disabled it couldn't show the new background image.
Thanks for your help!
|
|
|
|
|
Did you try enabling, refreshing, then disabling so that the refresh happens whilst it is enabled but the chances of someone clicking it in the brief time it is enabled is slim? If you wanted to eliminate its clickablity whilst it is briefly disabled, you could change the click action to do nothing before enabling it and then restoring the normal click action after disabling it.
Not tried any of this myself, so I am just guessing but it is worth a go. It may be that the disabled visual element overrides the selected background image.
|
|
|
|
|
Hello jsc42, yes I have done this part to prevent the user from ever mistakenly clicking the button . Thanks for the suggestion!
|
|
|
|
|
I am trying to call a function defined in the parent class via the object. But I am getting the error a pointer to member is not valid for a managed class. How can I achieve what I wanted? My expected output is to display the text "Called from child"
MyChild.h
ref class MyChild
{
System:Void(*my_func_ptr)(int, char*);
typedef System:Void(*MyFuncPtrType)(int, char*);
MyFuncPtrType my_func_ptr;
public: MyChild ( System:Void(*some_func)(int, char*)){
my_func_ptr = some_func;
}
public: System::Void Child_ButtonClicked(System::Object^ sender, System::EventArgs^ e){
my_func_ptr();
}
}
MyForm.h
#include "MyChild.h"
public ref class MyForm : public System::Windows::Forms::Form
{
.
.
.
private: static System:Void test(int, char*) {
MessageBox::Show("Called from child");
}
private: System::Void MyForm::MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
MyChild^ child= gcnew MyChild( MyForm::test);
child -> test(1,"random");
}
}
Update 2, Previous problem for //type incompatible error in this line is solved using the following way below.
MyChild.h
ref class MyChild
{
private: System::Void(*my_func_ptr)(int, char*);
public: System::Void doFunction(int A, char* B) {
(*my_func_ptr)(A,B);
}
public: MyChild ( System::Void(*func)(int A, char* B)){
my_func_ptr = func;
}
public: System::Void Child_ButtonClicked(System::Object^ sender, System::EventArgs^ e){
doFunction(1,"random");
}
}
MyForm.h
#include "MyChild.h"
public ref class MyForm : public System::Windows::Forms::Form
{
.
.
.
typedef System::Void (*callback_function)(int, char*);
private: static System:Void test(int, char*) {
MessageBox::Show("Called from child");
}
private: System::Void MyForm::MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
callback_function disc;
disc = (callback_function)(MyGUI::MyForm::test);
MyChild^ child= gcnew MyChild( disc);
child -> doFunction(1,"random");
}
}
For now, everything is solved but I am still unsure to the reason for incompatibility for argument and parameter having same type. I will do more trails and see if this is a stable way of implementation. Thanks for your help Richard Andrew x64 !
modified 25-May-21 0:07am.
|
|
|
|
|
In non-managed C/C++ you cannot use a pointer to a non-static member in that way. Make the test method to static , and it should work.
|
|
|
|
|
Hello, I have made to test() to static and now I have a new error at the same line that doesn't make sense to me.
argument of type "void (*)(int, char*)" is incompatible with parameter of type "void (*)(int, char*)"
Both the types are identical.
I have also tried to change all types to void, and the error message is still the same i.e.
argument of type "void (*)()" is incompatible with parameter of type "void (*)()"
latest update: problem solved. Please see the first post! thanks!
modified 25-May-21 0:06am.
|
|
|
|
|
|
I can't figure out how to convert a native string pointer to an IntPtr.
This is how I'm creating the native string pointer:
PCWSTR pFullUrl = static_cast<PCWSTR>(static_cast<void*>(Marshal::StringToHGlobalUni(S->pFullUrl))); Now, in the destructor, I need to convert the PCWSTR pointer back to an IntPtr so I can call Marshal::FreeHGlobal(pFullUrl).
Does anyone know how to perform the conversion from a native pointer to a managed IntPtr?
NOTE: FreeHGlobal() takes IntPtr not IntPtr^, so I don't want to convert to IntPtr^.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
|
Thanks Richard, I was just about to delete this post because I just realized that I could do FreeHGlobal(IntPtr(pFullUrl)) as long as pFullUrl is a LONGLONG.
Thank you for your response.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Backgammon Game (Classic Backgammon(known as Erkek Tavlası in Turkish) Programming using Files.
You will create and maintain 2 files, one for Backgammon table (name must be Table.dat)(figure 2), the second table
is for Dice history and play log
Kodu bilen var mı?
|
|
|
|
|
basel33 wrote: You will create and maintain Yes, you will, not anyone else.
basel33 wrote: Kodu bilen var mı? Yok.
|
|
|
|
|
Hello everyone,
I made a class that will do some additional configuration to the serial port. (Mainly to handle received data).
My issue is that SerialPort_DataReceived() is successfully triggered when it received data from device, however the BytesToRead is always 0. What could the reason be? I am sure the device is sending data because when I haven't use this ConfigSerialPort, everything works fine.
ConfigSerialPort.h
#pragma once
using namespace System::Windows::Forms;
ref class ConfigSerialPort: public System::Windows::Forms::Control
{
private: System::IO::Ports::SerialPort^ _serialPort;
public:
ConfigSerialPort(System::IO::Ports::SerialPort^ serialPort) {
_serialPort = serialPort;
_serialPort->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &ConfigSerialPort::SerialPort_DataReceived);
}
private: System::Void SerialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
unsigned int test = 0;
test = _serialPort->BytesToRead;
}
}
MyForm.h
#pragma once
#include <stdlib.h>
#include <string.h>
#include <cstdint>
#include <stdio.h>
#include "ConfigSerialPort.h"
namespace SerialPortGUI {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
}
.
.
.
void InitializeComponent(void)
{
.
.
.
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
this->MyForm_SerialPort = (gcnew System::IO::Ports::SerialPort(this->components));
.
.
.
}
private: ConfigSerialPort^ test;
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
test = gcnew ConfigSerialPort(MyForm_SerialPort);
}
}
}
|
|
|
|
|
What is the serial port connected to, and how can you tell there is data to be read?
|
|
|
|
|
Hello, my other device is an Arduino that connects to PC as Com port 8. Every time I press a button on Arduino, it will transmit a text over serial to the PC. I have verified the received text using Termite software.
|
|
|
|
|
It's impossible to guess why your receiver thinks there is no data to read, if it is being transmitted.
|
|
|
|
|
The only think I could think of is inside
ConfigSerialPort.h
I should use gcnew for _serialPort
_serialPort = gcnew (System::IO::Ports::SerialPort); , and then assign it the parameter
_serialPort = serialPort
|
|
|
|
|
I made a class myGroupbox to use SerialPort, and I'm trying to update a textbox from the serial port data. But the invoke function couldn't be used, the error message is "myGroupbox has no member invoke"
here's my code
myGroupbox.h
#pragma once
using namespace System::Windows::Forms;
ref class myGroupbox
{
private: System::IO::Ports::SerialPort^ _serialPort;
public:
myGroupbox( System::IO::Ports::SerialPort^ serialPort )
{
_serialPort=serialPort;
_serialPort->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &myGroupbox::SerialPort_DataReceived);
}
private: System::Void SerialPort_DataReceived(System::Object^ sender,System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
uint16_t test = 0;
test = _serialPort->BytesToRead;
if (test == 3U) {
this->Invoke(gcnew EventHandler(this, &myGroupbox::ProcessReceived));
}
else
{
_serialPort->DiscardInBuffer();
}
}
private: System::Void ProcessReceived(System::Object^ sender, System::EventArgs^ e)
{
}
}
|
|
|
|
|
Member 15150778 wrote: the invoke function couldn't be used, the error message is "myGroupbox has no member invoke"
Well, you hadn't defined any Invoke() method in your myGroupbox class. Therefore you got this error message.
|
|
|
|
|
Hello, I tried to copy my approach from the MyForm.cpp and it worked properly i.e. invoke wasn't define in MyForm.cpp but I could still call this invoke function since it's from System::Windows::Forms::Controls.
But in my own class myGroupBox, it couldn't do the same.
here's an snippet of MyForm.cpp that used the invoke and worked
using namespace System;
using namespace System::Windows::Forms;
[STAThreadAttribute]
void main(array<String^>^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
myGUI ::MyForm form;
Application::Run(% form);
}
namespace myGUI {
System::Void MyForm::serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
if (serialPort1->IsOpen) {
databufferA = serialPort1->ReadLine();
this->Invoke(gcnew EventHandler(this, &MyForm::DisplayText));
}
}
}
modified 20-May-21 2:41am.
|
|
|
|
|
Yes, because you have still not declared an Invoke method in your class, and your class is not a child of System.Windows.Forms.Control .
|
|
|
|
|
Hello, thank you very much for your help! I am able to compile after following your suggestion. I will test if this method works and update if this is the final solution.
Thanks again!
myGroupbox.h
#pragma once
using namespace System::Windows::Forms;
ref class myGroupbox: public System::Windows::Forms::Control
{
private: System::IO::Ports::SerialPort^ _serialPort;
.
.
.
|
|
|
|
|
Sorry if my question is unclear, but I shall explain a bit more in the following.
Suppose I am making a software to show ONLY 2 employee information (i.e. Bob and Tim), and my implementation method is to create 2 identical group box.
Each of this groupbox will have the same UI elements , textbox, checkbox, label and buttons.
In order to reduce duplicated codes , I want to create a common class for this groupbox.
Will this work?
Would there be memory leaks?
I did some google research and found something about using smart pointers instead of gcnew'ing a pointer, is it relevant to prevent memory leaks?
Thank you very much for reading, i appreciate any constructive help /example code to get this code properly working!
common_employee_groupbox.h
#pragma once
ref class common_employee_groupbox
{
private: System::Windows::Forms::CheckBox^ _cb_isAbsent = gcnew (System::Windows::Forms::CheckBox^ );
private: System::Windows::Forms::CheckBox^ _cb_isOverTime gcnew (System::Windows::Forms::CheckBox^ );
private: System::Windows::Forms::TextBox^ _tb_employeeName gcnew (System::Windows::Forms::TextBox^ );
private: System::Windows::Forms::TextBox^ _tb_employeeSalary gcnew (System::Windows::Forms::TextBox^ );
private: System::Windows::Forms::Button^ _btn_increaseSalary gcnew (System::Windows::Forms::Button^ );
private: System::Windows::Forms::Button^ _btn_decreaseSalary gcnew (System::Windows::Forms::Button^ );
public:
common_employee_groupbox(
System::Windows::Forms::CheckBox^ cb_isAbsent,
System::Windows::Forms::CheckBox^ cb_isOverTime,
System::Windows::Forms::TextBox^ tb_employeeName,
System::Windows::Forms::TextBox^ tb_employeeSalary,
System::Windows::Forms::Button^ btn_increaseSalary,
System::Windows::Forms::Button^ btn_decreaseSalary
) {
_cb_isAbsent = cb_isAbsent;
_cb_isOverTime= cb_isOverTime;
_tb_employeeName= tb_employeeName;
_tb_employeeSalary= tb_employeeSalary;
_btn_increaseSalary= btn_increaseSalary;
_btn_decreaseSalary= btn_decreaseSalary;
_btn_increaseSalary->Click += gcnew System::EventHandler(this,&common_employee_groupbox::increaseSalary_Click);
_btn_decreaseSalary->Click += gcnew System::EventHandler(this,&common_employee_groupbox::decreaseSalary_Click);
}
private: System::Void increaseSalary_Click() {
tb_employeeSalary->Text = "updatedsalary xxxx";
}
private: System::Void decreaseSalary_Click() {
tb_employeeSalary->Text = "updatedsalary xxxx";
}
};
MyForm.h
#include "common_employee_groupbox.h"
namespace MyEmployeeGUI {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;
public ref class MyForm : public System::Windows::Forms::Form
{
private: System::Windows::Forms::CheckBox^ cb_isAbsent_Tim;
private: System::Windows::Forms::CheckBox^ cb_isOverTime_Tim;
private: System::Windows::Forms::TextBox^ tb_employeeName_Tim;
private: System::Windows::Forms::TextBox^ tb_employeeSalary_Tim;
private: System::Windows::Forms::Button^ btn_increaseSalary_Tim;
private: System::Windows::Forms::Button^ btn_decreaseSalary_Tim;
private: System::Windows::Forms::CheckBox^ cb_isAbsent_Bob;
private: System::Windows::Forms::CheckBox^ cb_isOverTime_Bob;
private: System::Windows::Forms::TextBox^ tb_employeeName_Bob;
private: System::Windows::Forms::TextBox^ tb_employeeSalary_Bob;
private: System::Windows::Forms::Button^ btn_increaseSalary_Bob;
private: System::Windows::Forms::Button^ btn_decreaseSalary_Bob;
public:
MyForm(void)
{
InitializeComponent();
}
.
.
.
System::Void MyForm::MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
common_employee_groupbox^ tim_groupbox = gcnew common_employee_groupbox(
cb_isAbsent_Tim,
cb_isOverTime_Tim,
tb_employeeName_Tim,
tb_employeeSalary_Tim,
btn_increaseSalary_Tim,
btn_decreaseSalary_Tim
);
common_employee_groupbox^ bob_groupbox = gcnew common_employee_groupbox(
cb_isAbsent_Bob,
cb_isOverTime_Bob,
tb_employeeName_Bob,
tb_employeeSalary_Bob,
btn_increaseSalary_Bob,
btn_decreaseSalary_Bob
);
}
}
}
Update 1:
I have tried this code, and I'm having errors with this line (the bolded ampersand is highlighted as error) :
_btn_increaseSalary->Click += gcnew System::EventHandler(this,&common_employee_groupbox::increaseSalary_Click);
the error message:
invalid delegate initializer - function does not match the delegate type
How to fix this problem? Already tried googling, but the results aren't helpful
Update 2:
I have fixed the problem from update 1.
it turned out that I need to declare the increase/decrease salary function with the following arguments like below
private: System::Void increaseSalary_Click(System::Object^ sender, System::EventArgs^ e).
I have gotten the code to work as expected, however I'm still unsure if there will be any memory leaks.
Thanks all!
modified 19-May-21 22:45pm.
|
|
|
|
|
I have an pointer to an array of System::Byte pointers, and im trying to use the SerialPort.Write function that only accepts
array<unsigned char>^
It is necessary that I used System::Byte pointers because the value of byte array needs to be update from time to time during runtime.
heres my sample code
System::Void MyForm::button1_Click(System::Object^ sender, System::EventArgs^ e)
{
array<System::Byte^>^ myArray = gcnew array<System::Byte^>(10U);
myArray[0] = (System::Byte) 0x01;
myArray[1] = (System::Byte) 0x02;
myArray[2] = (System::Byte) 0x03;
myArray[3] = (System::Byte) 0x04;
myArray[4] = (System::Byte) 0x05;
myArray[5] = (System::Byte) 0x06;
myArray[6] = (System::Byte) 0x07;
myArray[7] = (System::Byte) 0x08;
myArray[8] = (System::Byte) 0x09;
myArray[9] = (System::Byte) 0x10;
SerialPort1->Write(myArray,0,10U);
object type is: System::IO::Ports::SerialPort ^
}
modified 13-May-21 0:27am.
|
|
|
|
|
|