|
One could go totally overkill and implement an IFormatProvider/ICustomFormatter
that automatically trims the string (using Convert.ToString(Intxx, IFormatProvider)).
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
hi guys,
i am writing a directory scanning program.. my program will scan the entire directory and list down the file names. i am using a listbox to show the filenames.
Currently the program will do the entire searching then will list down the file names after complete. the program should show the filenames one by one while searching the directory.
how can i do that guys..help me plz..
Below is my coding :-
wstring directory =(L"C:\\Windows\\system32");
if (ListFiles(directory, L"*", files)) {
for (vector<wstring>::iterator it = files.begin();
it != files.end();
++it) {
std::string filename = WStringToString(it->c_str());;
std::string s=filename;
String ^someString= gcnew String(s.c_str());
listBox1->Items->Add(String::Concat(someString));
}
}
listBox1->EndUpdate();
Regards,
Thilek
|
|
|
|
|
Maybe try updating the control after each item is added, something like:
listBox1->Items->Add(String::Concat(someString));
listBox1->SelectedIndex = index;
listBox1->Update();
I'm curious - why all the string conversions in there?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
what should i replace the index with..
when i compile it its showing :-
error C2065: 'index' : undeclared identifier
Help me plz and thanks ya.
|
|
|
|
|
Oops , sorry...
int index = listBox1->Items->Add(String::Concat(someString));
listBox1->SelectedIndex = index;
listBox1->Update();
listBox1->SelectedIndex = index; is optional - without it the added items won't
automatically scroll into view.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
its scrolling down.. i notice on the scroll bar, its blinking.
but the list only visible after its finish scanning :P
Do i need to do anything to the form or any other options i need to add ??
|
|
|
|
|
hmm it worked for me.
I'm assuming you're using Windows Forms for UI, and your code is running on the UI thread...
Maybe try an Application::DoEvents(); call after (or instead of) the Update() call.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I'm not sure what you were doing with those string conversions, but
if you don't need them, this should work:
wstring directory =(L"C:\\Windows\\system32");
if (ListFiles(directory, L"*", files))
{
for (vector<wstring>::iterator it = files.begin(); it != files.end(); ++it)
{
int index = listBox1->Items->Add(String::Concat(gcnew String(it->c_str())));
listBox1->SelectedIndex = index;
listBox1->Update();
}
}
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
well i were collecting the codes there and here, so to match them i keep converting but ur code made it look short and nice
thanks ya. but the listbox showing the list after complete scanning..
|
|
|
|
|
Here's the code I'm testing with - I can see all the items get added...
for (int i = 0; i < 1000; i++)
{
int index = listBox1->Items->Add(i.ToString());
listBox1->SelectedIndex = index;
listBox1->Update();
}
Using the Update() or the DoEvents() method yields the same results.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
below is the full coding of my form :-
#pragma once
#include "Mainmenu.h"
#include "Scanner.cpp"
using namespace std;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
namespace trialcpp {
public ref class Autoscanner : public System::Windows::Forms::Form
{
public:
Autoscanner(void)
{
InitializeComponent();
}
protected:
~Autoscanner()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Button^ start_button;
private: System::Windows::Forms::Button^ close_button;
protected:
private:
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->label1 = (gcnew System::Windows::Forms::Label());
this->start_button = (gcnew System::Windows::Forms::Button());
this->close_button = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
this->label1->AutoSize = true;
this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(0)));
this->label1->Location = System::Drawing::Point(22, 22);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(176, 16);
this->label1->TabIndex = 0;
this->label1->Text = L"Scanning.... Please Wait";
this->start_button->Location = System::Drawing::Point(324, 231);
this->start_button->Name = L"start_button";
this->start_button->Size = System::Drawing::Size(75, 23);
this->start_button->TabIndex = 2;
this->start_button->Text = L"Start";
this->start_button->UseVisualStyleBackColor = true;
this->start_button->Click += gcnew System::EventHandler(this, &Autoscanner::start_button_Click);
this->close_button->Location = System::Drawing::Point(405, 231);
this->close_button->Name = L"close_button";
this->close_button->Size = System::Drawing::Size(75, 23);
this->close_button->TabIndex = 3;
this->close_button->Text = L"Close";
this->close_button->UseVisualStyleBackColor = true;
this->close_button->Click += gcnew System::EventHandler(this, &Autoscanner::close_button_Click);
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(515, 266);
this->Controls->Add(this->close_button);
this->Controls->Add(this->start_button);
this->Controls->Add(this->label1);
this->Name = L"Autoscanner";
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"Sparta AV : Auto Scanning";
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void close_button_Click(System::Object^ sender, System::EventArgs^ e) {
Application::Exit();
}
private: System::Void start_button_Click(System::Object^ sender, System::EventArgs^ e) {
ListBox^ listBox1 = gcnew ListBox;
listBox1->Size = System::Drawing::Size( 400, 160 );
listBox1->Location = System::Drawing::Point( 50, 50 );
this->Controls->Add( listBox1 );
listBox1->MultiColumn = false;
listBox1->SelectionMode = SelectionMode::MultiExtended;
listBox1->BeginUpdate();
vector<wstring> files;
wstring directory =(L"C:\\Windows");
if (ListFiles(directory, L"*", files))
{
for (vector<wstring>::iterator it = files.begin(); it != files.end(); ++it)
{
int index = listBox1->Items->Add(String::Concat(gcnew String(it->c_str())));
listBox1->SelectedIndex = index;
listBox1->Update();
Application::DoEvents();
}
}
listBox1->EndUpdate();
#if defined(DEBUG)
System::Diagnostics::Debug::WriteLine( listBox1->SelectedItems[ 1 ] );
System::Diagnostics::Debug::WriteLine( listBox1->SelectedIndices[ 0 ] );
#endif
}
};
}
Did i miss anything in the form ya ??
|
|
|
|
|
You need to get rid of the BeginUpdate() and EndUpdate() calls.
Those are for when you DON'T want to see the listbox update until
all items have been added.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
thanks ya.. its working now... but jus that every file is selected.. but its ok for now.. thanks a lot..
|
|
|
|
|
Thilek wrote: every file is selected
You can handle selection the way you want....I was just using a
single-selection control to test.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
okies thanks ya... i try to add string matching function to it but the program exit with error msg :-
Managed' has exited with code -1073741819 (0xc0000005).
But it works if i scan directory will less files (about 160 files).
hm... confusing....
|
|
|
|
|
one more problem bro.. when i run the same program on my frieds laptop its n0t listing the file names and no error found... wierd
|
|
|
|
|
Thilek wrote: i am writing a directory scanning program..
Since you are using C++/CLI, I don't see any need of using standard C++ for directory search. There is Directory::GetDirectories() method which will help you on this. Read this[^] article which talks about how to do it recursively.
Thilek wrote: the program should show the filenames one by one while searching the directory.
Thilek wrote: listBox1->EndUpdate();
Problem here is you are calling EndUpdate only after finishing the loop. So control is redrawing only after completing the full loop. You need to change this so that control will draw immediatly once the item is added.
|
|
|
|
|
Hi,
I have 7 forms in my project. Form 6 has a text box, I wish for the text entered in Form 6 to be passed to a label in Form 7. I am new to C++ and would really appreciate any advice. I have posted the code I am trying to work with but i keep getting error C2248. Please Help!! Thanks.
public ref class Form6 : public System::Windows::Forms::Form
{
public:String^str1;
public:
Form6(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Application::Exit();
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
Application::Exit();
}
private: System::Void label2_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
this->textBox2->Text = this->textBox1->Text;
this->textBox1->Text = "";
this->textBox1->Text = "Saved";
}
private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
public: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
str1 = this->textBox2->text;
Form6::Hide();
Form7 myForm;
if(myForm.ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
//Do stuff
}
}
private: System::Void Form6_Load(System::Object^ sender, System::EventArgs^ e) {
str1 = "str1default";
}
private: System::Void textBox2_TextChanged(System::Object^ sender, System::EventArgs^ e) {
str1=textBox2->Text;
}
};
}
|
|
|
|
|
liverpoolfan wrote: I wish for the text entered in Form 6 to be passed to a label in Form 7
There are many ways to do this.
1 - Use delegates.
2 - Pass value via constructor
3 - Create a public method on Form7 which updates the control.
|
|
|
|
|
I originally posted this in the other C++ forum. The only reply I got suggested this was a better place. Its been a pain in the rear for OVER A YEAR so far!!
I have opened a Windows Forms Application in VS2005 and have added 2 forms – Form1 and Form2.
Each form generates code as follows:
[code]
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
namespace DCAMwfa {
public ref class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
...
[/code]
I have tried to use a button on Form1 to display a Form2 but consistently failed, being told one way or another that Form2 does not exist in DCAMwfa:
‘Form2’ is not a member of ‘DCAMwfa’
Syntax error: identifier ‘Form2’
This is in spite of the above generated code defining Form2 and the fact that ??intellisense?? tells me that Form1 and Form2 are included in DCAMwfa as I type DCAMwfa::
Using VB and C# I have no problems, yet using C++ I can get nowhere. I need to use C++ because I use one .dll which produces large unsigned integers and function pointers.
Code such as:
[code]
Form CAMERAfrm ^ = gcnew Form();
CAMERAfrm->ShowDialog(this);
[/code]
allows me to display a new blank form but not a new Form2. The same happens with Show and ShowForm
Can someone please tell me what is going wrong?
Ron G
|
|
|
|
|
You need to include the second form's header file to use it. Something like #include "Form2.h" on form1.
|
|
|
|
|
Thanks for your very rapid reply.
However, I confess I love VB and C#, and the more I explore C++ the more that love grows - despite the 'limitations'
I included the include statement at the beginning of Form1.h - under the #pragma once section. Then:
Form2 DCAM = gcnew Form2();
DCAM.ShowDialog(this);
//error c3673: 'DCAMfrma::Form2': class does not have a copy constructor
Form2 DCAM;
DCAM.ShowDialog(this);
//OK at last
I confess I still do not comprehend the rationale. I'm so unused to 'defining' relationships so many times. When VB first came out it was hailed as a real G4 language. Programming languages should be getting simpler. All my text work is done by voice. Programming should be going that way.
I would relish the day I can talk to my computer as Dillon talks to Andromeda (and Rommy) but if C++ dominates and VB drifts more in that direction, it would become hell - like the Atreides guru talking to his computer in Dune.
But truly, thanks
Ron
|
|
|
|
|
regnwald wrote: Form2 DCAM = gcnew Form2();
This is incorrect. C++/CLI uses handles to access managed types. You should use handle(^ ) symbol. Like,
Form2^ DCAM = gcnew Form2();
DCAM->ShowDialog(); or use stack semantics
Form2 form2;
form2.ShowDialog(); regnwald wrote: despite the 'limitations'
Limitations? What limitations are you seeing?
It looks like you are just getting started with C++/CLI. I recommend this[^] book.
|
|
|
|
|
You are, of course, correct. I am new to C++/CLI - in fact to any dialect of C++. I checked that link you gave and will have to take the plunge. Going back to school at 72 at least keeps me alive.
I note in that link that C++/CLI is supposed to be less twisted!! But then why:
private: System::Void dSLRToolStripMenuItem1_Click(System::Object^ sender, System::EventArgs^ e) {
dslrfrm DSLR; // DSLR is a particular implementation of the dslrfrm class
DSLR.Width =293; // This works OK
DSLR.panel2->Location.X=30; //No error: Does nothing - intellisense OK
DSLR.panel2->Location.Y=30; //No error: Does nothing - intellisense OK
DSLR.Refresh(); //No improvement
DSLR.ShowDialog(this); // DSLR is shown as a child of cppPOSTERwfa::Form1
}
All these "::" and "." and "->" and "^" and "*" that speak volumes yet do they really make talking to Rommy (I mean ...) so much more usefully precise?? Limitations? Not many really. I stayed with VB1 to VB5 then VB5 to VS2005 and I think I wish I had stayed with VB5. I write snippets of assember (I grew up on that and DOS) But a .dll I want to use puts out function pointers and unsigned long. Perhaps I'll restrict my exposure to C++ to making a small library that calls the .dll functions I need and containig the pointer work and call that from VB5. Home-Sweet-Home.
But I will give that book a go. Oh, I just remembered using that hat symbol once, just as you said. Senior moments don't help.
Kind regards
Ron
_
|
|
|
|
|
I'm developing a tic tac toe multiplayer game, the game is up and it is working on a single pc, I want it to be playable across two computers in LAN, I'll be using TCP/IP for this and I have already set up a chat server program. So I know how to do communication. The concern is that I have a GameBoard class which does everything, from making a move, to restarting the game and checking for winner etc. It is independent of the form except of the mouse clicks, the form just reads in the GameBoard's properties, attributes and updates itself. How may I expand it into a
multiplayer game, I want to establish a client to client architecture, should I expand the GameBoard class, should I serialize the GameBoard class and deserialize it on the other side, or just send the specific move done?
Whats good, please tell me and help me out how it will be done. I mean just the head up
|
|
|
|