עבור לתוכן

צריך עזרה בC#, פרוייקט "צייר"

Featured Replies

פורסם
  • מחבר

ואללה תודה....

אני כבר יראה למרצה שלי על מה חשבתי ומה התחלתי לעשות, כי אני לא ממש מצליח לממש את זה.

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

וזה מתחיל לתסכל קצת...

בקיצר, ביומיים הקרובים אין לי ברירה אלא לשים את הפרוייקט בצד.

אני אעדכן ברגע שייצא עוד משהו מזה, שזה יתקדם. :) (עוד בערך שבוע)

אגב, פונקציה וירטואלית = 0 זה דריסה (Override), בדקתי את זה, ואכן צריך אותם פרמטרים...

צריך איכשהו להתגבר על זה.

  • תגובות 36
  • צפיות 7.4k
  • נוצר
  • תגובה אחרונה
פורסם

אני מתכנת כבר 8 שנים ב- C++, ג'אוה ודלפי. אני חושב שיש לי מושג על מה אני מדבר.

ל- RK:

ב- C++, כל מה שההגדה "=0" (pure virtual) אומרת היא שהמחלקה היא אבסטרקטית, וחייבים לדרוס את הפונקציה במחלקות הבנים.

לי זה נראה כאילו פונקציות הציור שלך התנהגות כמו פונקציות סטטיות - כלומר - הן לא משתמשות במידע שנמצא על האובייקט.

(כלומר אתה מצייר מלבן ע"י פונקציה כמו

CRectangle::Draw(int left, int top, int right, int bottom)

מה שאתה אמור לעשות, זה שהפרמטרים שספצפיים ל- class יישמרו על האובייקט.

למשל (אני אשתמש בתחביר של java כי אני לא לגמרי זוכר איך זה הולך ב- C#)- אתה יוצר מלבן ע"י

CRect myrect = new CRect(int width, int height)

ואז אתה יכול להכניס אותו לרשימה של CShape (בהנחה ש- CRect יורש מ- CShape).

כשאתה רוצה לצייר צורה, אתה אמור לעשות משהו כמו

CShape curShape = shapeList.getAt(i)

ואזלקרוא ל-

curShape.draw(x, y(
(כאשר x ו- y הוא המיקום של הצורה).

באותו אופן אתה יכול גם לשמור את המיקום (והצבע, ועובי הקו ומה שבא לך) של כל צורה בתוך CShape ואז פונקציית ה- draw לא צריכה לקחת פרמטרים בכלל.

נו, קיויתי שה- quotes יעזור נגד ההפיכה של הסוגריים, אבל זה לא עבד...

פורסם

היי.

אני במקומך קודם כל הייתי מסתכל על האובייקט Graphics. זה האובייקט שבעצם יודע "לצייר" בדוט נט.

שקלת אולי שימוש בReflection? נגיד ליצור קלאס שמה שהוא מכיל זה שם של פונקציה בתוך Graphics ואת הארגומנטים... תוכל לחסוך לך הרבה בלאגן.

בכל מקרה, אם יש לך שאלות, תרגיש חופשי לפנות אלי...

בהצלחה!

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

טוב, חברים

עבדתי עוד קצת על הפרוייקט הקטן שלי,

ואני דיי מתקדם.

(כבר ניתן לצייר כל מיני צורות על המסך, יש קלאסים יורשים מshape אבסטרקטי ועוד)

כרגע אני נתקעתי בבעיה קצת מעצבנת, אני רוצה להזיז צורה (ללחוץ עליה, ואז כל עוד העכבר לחוץ אני מזיז את הצורה)

אני מצליח לזהות את הצורה עליה לחצתי (אם יש צורות אחת על השניה - קצת בעייתי בינתיים)

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

הזה הקוד של ההזזה (כבר של הצורה שבחרתי)

				((Shape)Figures[figureIndex]).start.X = StartMove.X + e.X - W;
((Shape)Figures[figureIndex]).start.Y = StartMove.Y + e.Y - H;
((Shape)Figures[figureIndex]).end.X = EndMove.X + e.X - W;
((Shape)Figures[figureIndex]).end.Y = EndMove.Y + e.Y - H;

כש STARTMOVE היא הקואורדינטה הראשונית של הצורה, שאותה אני שומר, כנל גם ENDMOVE

e.Y/X היא האלמנט של העכבר (הנקודה שלו) , H גובה, W רוחב

תודה

פורסם

הממ, אני רואה שבכל זאת אתה עובד בלי מצביעים ומחמיץ את כל הקטע של פולימורפיזם.

בבעיה שאתה נתקל בה נתקל כל מי שמנסה לממש drag בפעם הראשונה (ובדר"כ גם בפעם השניה...)

הפונקציה שבה מוכל הקוד ששלחת נקראת תוך כדי הזזה או רק בסוף הזזה?

יש לך שתי דרכים לעשות את זה -

דרך אחת - בתחילת ההזזה לשמור את המיקום ההתחלתי של הצורה וגם את מיקום הלחיצה של העכבר, ואז בכל פעם שאתה רוצה לחשב את המיקום החדש, אתה לוקח את המיקום הישן ומחבר את ההפרש בין מיקום העכבר הנוכחי למיקום העכבר בתחילת הלחיצה.

דרך שניה (בלי לשמור את מיקום הצורה) - אתה שומר את מיקום העכבר, ובכל פעם אתה מחבר למיקום הצורה את ההפרש בין מיקום העכבר הנוכחי לזה ששמרת, ואז שומר את מיקום העכבר הנוכחי במקום זה ששמרת קודם.

בקוד שכתבת לא ממש הבנתי איך השתמשת ב- H ו- W ומה הם קשורים לעניין.

פורסם
  • מחבר

אתה דיי טועה

אני כן משתמש בפולימופיזם (זה למעשה הגדולה של C#...ואין פה מצביעים, הכל reference)

ביצירת צורה, יש לך יורשים, של מלבן, אליפסה וקו בינתיים.

הפרמטרים נמצאים בתוך הEVENT

pictureBox1_MouseMove

תחת תנאים מסויימים

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

ניסיתי את מה שהצעת (דרף שניה, נראת יותר אלגנטית) וזה עובד כמו גדול,

תודה!

(את H וW הייתי צריך מקודם... סתם ניסוי וטעיה, זה יצא הכי טוב)

זה הקוד המתוקן

				((Shape)Figures[figureIndex]).start.X += (e.X - P_start.X);
((Shape)Figures[figureIndex]).start.Y += (e.Y - P_start.Y);
((Shape)Figures[figureIndex]).end.X += (e.X - P_start.X);
((Shape)Figures[figureIndex]).end.Y += (e.Y - P_start.Y);

P_start.X = e.X;
P_start.Y = e.Y;

פורסם

יש אופשרות לראות משהו?

פורסם
  • מחבר

את הקוד אתה מתכוון?

שלח לי את האייסי או אימייל

פורסם

טוב, סליחה, חשבתי שזה C++.

אבל למה ה- casting בכל שורה ל- Shape? לא הוסיפו בגרסא של .NET 2003 משהו דומה ל- templates/generics שמאפשר לך להגדיר container של אובייקטים מסוג מסויים?

פורסם
  • מחבר

אם אני לא עושה את הcasting לbase class אני לא יכול להשתמש בשום מתוד או שדה שלוו.

Figures הוא container מסוג object, אוכל הכל, (סוג נתונים ArrayList אם אתה מכיר)

אבל אני צריך איכשהו לעשות לו unboxing.

פורסם

זהו, שאתה עושה downcasting (אתה ממיר מ- Object ל- Shape)

בתוכניות קטנות זה לא כזה קריטי, אבל לא כדאי להתרגל לזה.

בכלל, downcasting זה דבר שרצוי להימנע ממנו אם אפשר, כלומר - אם אתה יכול - תשתמש ב- container של Shape ולא של Objects.

פורסם
  • מחבר

ברור שזה פחות רצוי, אבל אחרת אני אצטרך לממש את ArrayList בעצמי, ואין לי ממש כח לזה.

פורסם

התכוונתי לEXE כשזה יהייה מוכן...

פורסם
  • מחבר

כן, סבבה...

קבל בינתיים גרסא התחלתית (של עכשיו)...

[attachment deleted by admin - 90 dayss]

פורסם

{שגיאת יישום} אתחול תקין של היישום נכשל (0xc0000135). לחץ על אישור כדי לסגור את היישום.

ארכיון

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

דיונים חדשים