פיתוח תוכנה – צעד אחר צעד, חלק א’ פרק שביעי

16 בפברואר 2014

5 תגובות

לפרק הקודם.

בפרק זה נלמד על:

  • המשך עבודה עם WPF.
  • התחלה של תנאים.

בפרק הקודם התחלנו לכתוב תוכנה שמדמה “פנקס רשימות”, (מומלץ לחזור על הפרק הקודם לפני ההמשך).

נרכז לרגע את קוד ה – xmal וקוד ה – cs שכתבנו בפרק הקודם.

Code Snippet
<Window x:Class="WpfApplication1.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <Menu Grid.Row="0">
            <MenuItem Header="File" Padding="5,1">
                <MenuItem Header="New" Click="New_Click"></MenuItem>
                <MenuItem Header="Open" Click="Open_Click"></MenuItem>
                <MenuItem Header="Save" Click="Save_Click"></MenuItem>
                <Separator></Separator>
                <MenuItem Header="Exit" Click="Exit_Click"></MenuItem>
            </MenuItem>
        </Menu>

        <TextBox Grid.Row="1"
           ScrollViewer.VerticalScrollBarVisibility="Visible"
           TextWrapping="Wrap"
           AcceptsReturn="True"
           Name="txtData"
           FontSize="16"
           Padding="5"></TextBox>
    </Grid>
</Window>

 

כזכור, החלק של ה – xmal משפיע על הגרפיקה וה – UI (כיצד התוכנה תראה), ראשית יש ההגדרה של החלון שמוגדר עבור כותרת, רוחב וגובה.

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

לאחר מכן יש הגדרת של פקד Menu, אשר יישב בשורה הראשונה ובתוכו תת תפריט אחד המכיל מספר תת תפריטים.

לאחר מכן יש לנו תיבת טקסט עם מספר הגדרות UI שונות.

 

כעת נחזור על קוד ה – cs

Code Snippet
private void New_Click(object sender, RoutedEventArgs e)
{
    txtData.Text = string.Empty;
}

private void Open_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Text Document (*.txt)|*.txt";

    ofd.ShowDialog();

    string userSelectedFile = ofd.FileName;
    string text = File.ReadAllText(userSelectedFile);

    txtData.Text = text;
}

private void Save_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "Text Document (*.txt)|*.txt";

    sfd.ShowDialog();

    string userSelectedFile = sfd.FileName;
    File.WriteAllText(userSelectedFile, txtData.Text);
}

private void Exit_Click(object sender, RoutedEventArgs e)
{
    Close();
}

 

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

 

נרצה לשכלל את הקוד עם מספר אפקטים.

  • לפני סגירת התוכנה, לוודא שאין שינויים בתוכנה – במידה וכן, לוודא מול המשתמש האם הוא בטוח.
  • לוודא שהתוכנה לא תקרוס, במידה והמשתמש לחץ על Cancel בחלון שמירה או טעינה.
  • נוסיף שמירה בשם – כדי לאפשר בכל זאת שמירה של עותקים.
  • במידה והמשתמש בחר ב – Open או לחץ פעם אחת על Save, השמירות הבאות (עד ללחיצה על “חדש”) ישמרו לאותו קובץ ללא שאלה נוספת.

 

את שני האספקטים הראשונים נראה כרגע, את השאר בפרק הבא:

שני הדרישות הראשונות דורשות מאיתנו להשתמש ביכולת שלא הכרנו עד היום – תנאים.

תנאי מאפשר לנו לכתוב קוד שיבוצע “רק אם”, כלומר רק בתנאי שמה שאנחנו בודקים הינו נכון, רק אז הקוד יבוצע, נלך על הדוגמא הפשוטה – בזמן שהמשתמש לוחץ על Close אנחנו רוצים לשאול אותו האם האו בטוח שברצונו לסגור את התוכנה, ורק אם הוא ענה כן – נסגור את התוכנה.

כדי לשאול שאלות, אנחנו משתמשים ב – MessageBox, הקוד יראה כך:

Code Snippet
private void Exit_Click(object sender, RoutedEventArgs e)
{
    MessageBoxResult mbr = MessageBox.Show("Close the app", "notepad", MessageBoxButton.YesNo);
    if (mbr == MessageBoxResult.Yes)
    {
        Close();
    }
}

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

נשתמש במילה השמורה if כדי לבדוק נכונות של משפט כלשהו (שימו לב לשימוש ב == ולא ב = אחד המשמש להשמה)

רק במידה והמשפט החזיר true (כן) סגירת החלון תבוצע.

 

כדי לוודא שהתוכנה לא תקרוס במידה והמשתמש לחץ על Cancel בזמן טעינה או שמירה, עלינו לוודא זאת, הקוד יהיה גם כן בשימוש עם if.

הקוד הבא,

Code Snippet
private void Open_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Text Document (*.txt)|*.txt";

    ofd.ShowDialog();

    string userSelectedFile = ofd.FileName;
    string text = File.ReadAllText(userSelectedFile);

    txtData.Text = text;
}

 

יוחלף בקוד הבא:

Code Snippet
private void Open_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Text Document (*.txt)|*.txt";

    if (ofd.ShowDialog().Value == true)
    {
        string userSelectedFile = ofd.FileName;
        string text = File.ReadAllText(userSelectedFile);

        txtData.Text = text;
    }
}

 

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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

5 תגובות

  1. לא משנה27 בפברואר 2014 ב 14:01

    ממש תודה, לומד ממך 🙂
    תמשיך כבר.. 😉

    הגב
  2. שלמה29 באפריל 2014 ב 12:22

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

    הגב
  3. מאיר9 ביוני 2014 ב 22:21

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

    הגב
  4. black13 בדצמבר 2014 ב 19:14

    מתי ואם יצא חלק ב'?
    האם אתה כותב גם למתקדמים? כאלו שלמדו כמה שנים ועדיין צריכים הדרכה?

    הגב
  5. אברהם14 באפריל 2015 ב 12:59

    תודה רבה רבה על המדריך הזה!! הוא ממש ממש עוזר!!
    עשיתי כמו שהסברת. ויש לי בעיה קטנה:
    אחרי שהוא פותח לי חלון של שמירה או של פתיחה ואני לוחץ על אישור או ביטול, הוא סוגר את החלון ופותח שוב. ואז אחרי שאני בוחר שוב פעם הוא מתפקד כרגיל.
    יש לך מושג למה זה קורה?
    בהתחלה זה לא עשה את זה (כלומר לפני שהכנסתי את משפט הIF)

    תודה רבה רבה!
    אברהם

    הגב