שמירת קובץ ע"י תפריט - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שמירת קובץ ע"י תפריט


cold fire

Recommended Posts

שלום לכולם

אני בונה משחק(ב VC++ 2008) , ויש בו עורך שלבים כעקרון בניתי אותו פחות או יותר עכשיו החלק הבעייתי בסיפור הוא שמירה/טעינה של השלב שהמשתמש

ערך/יצר לשם כך חשבתי לפתוח חלון כמו שיש בכל תוכנה של שמירה (של השלב) בכל מקרה ראיתי שאפשר להשתמש באובייקט SaveFileDialog

הבעיה היחידה שחרשתי על האינטרנט ולא מצאתי דוגמא אחת שעובדת כמו שצריך(או שפשוט לא הבנתי איך זה אמור לעבוד)

משהו כזה http://www.functionx.com/vccli/controls/save.htm

תודה

קישור לתוכן
שתף באתרים אחרים

הצורה הכי פשוטה:

SaveFileDialog file_save=new SaveFileDialog();
if (file_save.ShowDialog() == DialogResult.OK)
{
//שמירת הקובץ
//הכתובת של המיקום לקובץ הנבחר:
MessageBox.Show(file_save.FileName);
}
else
MessageBox.Show("פעולה לביצוע אם לחצו על ביטול");

יש עוד אופציות שניתן לשנות כמו שם קובץ ברירת מחדל, תקית ברירת מחדל, סיומות וכו'...

אבל זה יספיק לך.

אותו דבר בפתיחת קובץ, רק עם OpenFileDialog

אוי סליחה, מה שכתבתי זה ל C#. אבל אני מניח שזה די דומה.

קישור לתוכן
שתף באתרים אחרים

כעקרון זה משהו בסגנון שאתה רשמת ( יש לי הרגשה שרשמת את הקוד בC# או בVB) בכל מקרה

יש לי את הקוד הבא

SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
saveFileDialog1->CreatePrompt = true;
saveFileDialog1->OverwritePrompt = true;

saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialog1->FilterIndex = 2;

if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
{
איך אני מקבל את שם הקובץ שבו המשתמש רוצה לשמור את הקבוץ
myStream->Close();
}

גם קורא דבר מוזר בלי החלק של השמירה התוכנית מתרסקת בשורה של הshoeDialog הודעה שקשורה לthreads או משהו כזה

קישור לתוכן
שתף באתרים אחרים

כן כתבתי בטעות C#, לא מכיר VC++.

גם אני נתקלתי בבעיה שלך כשהתנסתי עם זה.

זורק EXCEPTION על משהו ככמו CROSS THREADING... לא זוכר.

זה קורה כאשר מנסים לפתוח את החלון הזה מ THREAD שהוא לא ראשי.

אם אתה עושה את זה מ THREAD אחר, צריך להגדיר אותו כ STA, אני לא ממש זוכר מה זה ולמה זה, ככה פתרתי את זה.

עשיתי משהו כזה (שוב, ב C#):

clientThread.SetApartmentState(ApartmentState.STA);

שם הקובץ עם הניתוב אמור להיות פה:

saveFileDialog1->Filename

אסור לכתוב או לקרוא לקבצים מ THREAD אחר עד כמה שאני הבנתי. איך ה STA הזה מתקן את זה? אין לי מושג.

טוב, חבל על הזמן איזה נכה אני, אני כותב את ההודעה הזאת כאילו זה היה צ'אט, כל שניה נכנס עורך ומוסיף משהו.

סיימתי אז אל תחכה לעוד עדכון שלי :)

----------------------------------------------------------

טוב, יצאתי נכה פעם שניה.... עוד עדכון:

(והפעם ב ++VC)

בהנחה שאתה עושה את זה מ THREAD אחר, תגדיר אותו ככה ל STA לפני שאתה מפעיל אותו:


Thread^ t = gcnew Thread(gcnew ThreadStart(ThreadProc));
t->SetApartmentState(ApartmentState::STA);

קישור לתוכן
שתף באתרים אחרים

כולנו נכים לפעמים לא נורא... ;)

בכל אופן לא הבנתי כל כך את הקטע של הפתיל, אני אמור להריץ את החלון ע"י הפתיל(thread)?

עריכה:

איך אני משתמש בthreads בC++, איזה אינקלודים צריך?

קישור לתוכן
שתף באתרים אחרים

פתיל... זה חדש לי.

לא, אתה לא אמור לעשות את זה, אבל במידה וזה המצב, אז אתה צריך להגדיר את הפתיל כ STA.

האם הפונקציה שממנה אתה מפעיל את החלון רצה על THREAD אחר מאשר הראשי??

קישור לתוכן
שתף באתרים אחרים

פתיל שקול לthread באנגלית בכל מקרה הוא נותן את השגיאות הבאות:

1>.\Controller.cpp(105) : error C2065: 'ThreadProc' : undeclared identifier
1>.\Controller.cpp(105) : error C3350: 'System::Threading::ThreadStart' : a delegate constructor expects 2 argument(s)
1>Generating Code...

קישור לתוכן
שתף באתרים אחרים

לא התכוונתי שתעתיק לתכנית שלך את מה שכתבתי.

נתתי לך דוגמא לשנות את המצב של ה THREAD במידה וכבר הגדרת אחד כזה.

בוא נחזור כמה צעדים אחורה.

מה השגיאה המלאה שאתה מקבל כשאתה קורא ל SAVEFILEDIALOG??

ובבקשה תענה לי על השאלה, האם הגדרת בתכנית שלך THREADS כלשהם? אם אתה לא בטוח, אז כנראה שלו.

יעזור גם אם תצרף את קטע הקוד המלא (מספיק אולי רק הפונקציה שממנה אתה קורה לחלון של שמירת הקבצים).

קישור לתוכן
שתף באתרים אחרים

לא השתמשתי בשום threads

זאת הפונקציה שלי

void Controller::saveLevel()
{

SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
saveFileDialog1->CreatePrompt = true;
saveFileDialog1->OverwritePrompt = true;

saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialog1->FilterIndex = 2;

if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
{
//FileStream^myStream = File::Create(saveFileDialog1->FileName);
//myStream->Close();
}
}

וזאת השגיאה שאני מקבל

[attachment deleted by admin]

קישור לתוכן
שתף באתרים אחרים

אצלך נפתח התפריט של שמירה בשם?

עכשיו יצרתי פרוייקט חדש ועדיין הוא נותן את אותה שגיאה, אולי צריך לקנפג את הויזואל כדי שזה יעבוד?

עכשיו אני נזכר שהייתי צריך לקנפג אותו שיתמוך ב /clr אם אתה תחת מאפייני פרוייקט (בלי זה הוא לא מתקמפל)

קישור לתוכן
שתף באתרים אחרים

תנסה להוסיף או את השורה הראשונה, או את השורה השנייה, מעל הפונקציה MAIN, כמו פה.

(אל תוסיף את שתי השורות עם הסוגריים, רק אחת מהן)

[STAThreadAttribute]
[STAThread]
int main(array<System::String ^> ^args)

כולל הסוגריים המרובעים...

אני פשוט פתחתי פרוייקט חדש, מסוג FORM APPLICATION.

וכן, החלון נפתח.

כבר היה רשום אצלי בפרוייקט החדש את ה [sTAThreadAttribute], מחיקה שלו גורמת לאותה שגיאה שציינת.

קישור לתוכן
שתף באתרים אחרים

שחקת אותה :xyxthumbs:

עכשיו איך אני אמור לשמור את הקובץ?

אני מגדיר משתנה מסוג ifstream וכותב ישירות לקובץ כמו בprompt רגיל?

ועוד שאלה קטנה כשאני פותח קובץ אני אמור להוסיף עוד משהו למעל הmain כי אמרת שצריך להשתמש בopenFileDialog?

קישור לתוכן
שתף באתרים אחרים

כן, צריך את זה גם לגבי ה OPENFILEDIALOG.

אני ממליץ לך לחפש קצת חומר באינטרנט... זה לא אמור להיות מסובך.

כתיבה לקובץ אמורה להיות באותה צורה כמו שכתבת עד היום.

ה SAVEFILEDIALOG הוא בסך הכל דיאלוג שמביא לך את הכתובת של הקובץ שהמשתמש בחר....

אני לא בקיא ב C++.

חפש מידע על FileStream זה מה שאני מכיר מ C#.

אולי גם יש fprintf למצביע לקובץ אין לי מושג....

בהצלחה!

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...