Funkcja aktualizująca profressbar MyCallback

0

Witam, mam problem nie potrafię zintegrować progressbar z funkcja MyCallback:

kod programu:

#pragma once
#include "MyCallback.h"
namespace Downloader {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::ProgressBar^  progressBar1;
	private: System::Windows::Forms::Button^  button1;
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// progressBar1
			// 
			this->progressBar1->Location = System::Drawing::Point(56, 36);
			this->progressBar1->Name = L"progressBar1";
			this->progressBar1->Size = System::Drawing::Size(345, 37);
			this->progressBar1->TabIndex = 0;
			this->progressBar1->Value = 1;
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(147, 103);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(129, 23);
			this->button1->TabIndex = 1;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(459, 163);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->progressBar1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);

		}
#pragma endregion
	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
			 {

			 }
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
			 {

				// Tutaj chcem wywołać MyCallback, która ma aktualizowac Progressbar
				MyCallback pCallback;
				URLDownloadToFile(NULL, L"http://hosting.pl/zdjecie.jpg", L"c:\\zdjecie.jpg", 0, &pCallback);
			 }
	};
}



 

kod MyCallback.h



#include "stdafx.h"
#include <urlmon.h>
#include <iostream>

#pragma comment (lib, "urlmon.lib")

using namespace std;

class MyCallback : public IBindStatusCallback
{
public:
MyCallback() {}

~MyCallback() { }

// This one is called by URLDownloadToFile
STDMETHOD(OnProgress)(/* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText)
{
	//cout << "Downloaded " << ulProgress << " of " << ulProgressMax << " byte(s), " << " Status Code = " << ulStatusCode << endl;
	// w tym miejscu musze jakos aktualizować progressbar
return S_OK;
}

// The rest don't do anything...
STDMETHOD(OnStartBinding)(/* [in] */ DWORD dwReserved, /* [in] */ IBinding __RPC_FAR *pib)
{ return E_NOTIMPL; }

STDMETHOD(GetPriority)(/* [out] */ LONG __RPC_FAR *pnPriority)
{ return E_NOTIMPL; }

STDMETHOD(OnLowResource)(/* [in] */ DWORD reserved)
{ return E_NOTIMPL; }

STDMETHOD(OnStopBinding)(/* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError)
{ return E_NOTIMPL; }

STDMETHOD(GetBindInfo)(/* [out] */ DWORD __RPC_FAR *grfBINDF, /* [unique][out][in] */ BINDINFO __RPC_FAR *pbindinfo)
{ return E_NOTIMPL; }

STDMETHOD(OnDataAvailable)(/* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC __RPC_FAR *pformatetc, /* [in] */ STGMEDIUM __RPC_FAR *pstgmed)
{ return E_NOTIMPL; }

STDMETHOD(OnObjectAvailable)(/* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown __RPC_FAR *punk)
{ return E_NOTIMPL; }

// IUnknown stuff
STDMETHOD_(ULONG,AddRef)()
{ return 0; }

STDMETHOD_(ULONG,Release)()
{ return 0; }

STDMETHOD(QueryInterface)(/* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{ return E_NOTIMPL; }
};
 

Proszę o pomoc :)

0

w konstruktorze MyCallbacka przekazuj instancję formy

MyCallback pCallback(this);

i trzymaj ten parametr (typu Form1) jako pole klasy.

MyCallback będzie musiało się stać klasą zarządzaną (ref class), albo w przeciwnym razie skorzystaj z auto_gcroot do trzymania zarządzanego pola w klasie natywnej.

0

error:

1>c:\users\piotrek\documents\visual studio 2010\projects\downloader\downloader\Form1.h(98): error C2664: 'MyCallback::MyCallback(const MyCallback &)' : cannot convert parameter 1 from 'Downloader::Form1 ^const ' to 'const MyCallback &'
1>          Reason: cannot convert from 'Downloader::Form1 ^const ' to 'const MyCallback'
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

;/

0

bo musisz stworzyć sam konstruktor, który będzie przyjmował parametr typu Form1.

0

Nie za bardzo wiem jak to zrobić aby działało ;/
Podeślesz przykład?
Z góry dzięki.
Pozdrawiam

0

A nie łatwiej było by stworzyć zmienną globalną i tam zapisywać value progressbaru, wtedy bez problemy można by było modyfikować ta zmienną z innych plików.
Klasa mycallback mogła by chyba bez problemu modyfikować wartość tej zmiennej a co za tym idzie zmieniać status progressbaru.
Dobrze kombinuję czy to jest zły pomysł ??

0

To bardzo zły pomysł, bo za chwilę będziesz miał miliony zmiennych globalnych i nikt nigdy się już w tym nie połapie.
Tak przejrzałem parę Twoich tematów i potwierdza się moje przekonanie, że zaczynianie zabawy z programowaniem od okienek (i to jeszcze C++\CLI) to mocno zły pomysł.
Najpierw wypadałoby się nauczyć języka, dowiedzieć co to obiektowość, hermetyzacja, enkapsulacja. Nauczyć się korzystać z google i dokumentacji. Bez tego imho nic z tego nie będzie.

0

Tak, zgadzam się z Tobą - zle że zacząłem od WinAPI bo nie za bardzo jeszcze rozumiem obiektowe programowanie, ale zanim wrócę do "Podstaw OOP" muszę rozwiązac ten problem bo on mi spać nie daje, już od tygodni próbuję go rozwiązać.

Dlatego proszę o ostateczne rozwiązanie ostatniego z moich problemów.
Sam zanim do tego dojdę minie dużo czasu...
Jak możesz przedstaw mi na przykładzie jak mam przekazywać parametry miedzy obiektami - a dokładnie parametr typu Form1
To jest moja ostatnia prośba na tym forum.
Po rozwiązaniu tego problemu biorę się za podstawy OOP :)
Z góry dziękuje osobie, która mi pomoże.
Pozdrawiam
Piotr

0

Azarien już Ci napisał dokładnie jak to zrobić, to jest podstawa podstaw (konstruktory i przekazywanie parametrów). Dodatkowo nawet nie bardzo wiesz w czym piszesz.

  1. nie piszesz w C++, a w C++\CLI
  2. nie używasz WinAPI, a Windows Forms
    Jakby na to nie patrzeć to 1) i 2) to zupełnie różne bajki. Radzę zacząć od C++, bo na początek mieszanie kodu zarządzanego z natywnym raczej proste i przyjazne nie jest.
0

Przy wstawieniu parametru:

MyCallback(Form1^ formatka) 
{ 
	form = formatka;
}

wywala error:

1>c:\users\piotrek\documents\visual studio 2010\projects\downloader\downloader\MyCallback.h(12): error C2061: syntax error : identifier 'Form1'
1>c:\users\piotrek\documents\visual studio 2010\projects\downloader\downloader\MyCallback.h(14): error C2065: 'form' : undeclared identifier
1>c:\users\piotrek\documents\visual studio 2010\projects\downloader\downloader\MyCallback.h(14): error C2065: 'formatka' : undeclared identifier
1>c:\users\piotrek\documents\visual studio 2010\projects\downloader\downloader\Form1.h(98): error C2664: 'MyCallback::MyCallback(const MyCallback &)' : cannot convert parameter 1 from 'Downloader::Form1 ^const ' to 'const MyCallback &'
1>          Reason: cannot convert from 'Downloader::Form1 ^const ' to 'const MyCallback'
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

W czym problem ?

0

poucz się podstaw C++.

0

Najpierw muszę rozwiązać ten problem, potrzebuję ten program...
Napisz co mam poprawić aby działało i daje wam spokój (ostatnia prośba na tym forum ) :)

#EDIT
Pomoże ktoś ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1