PDA-applikationer med .NET: Lösningar till tentamen 2005-12-17

Observera att detta är förslag på lösningar. Det kan finnas andra lösningar som också är korrekta, och det kan hända att en del av lösningarna är mer omfattande än vad som krävs för full poäng på uppgiften. En del av lösningarna är kanske inte fullständiga, utan hänvisar bara till var man kan läsa svaret.

Uppgift 1 (10 p)

a) (1p)

Det betyder att fönstret inte minimeras när man klickar där, utan det stängs och förstörs. Om det är applikationens huvudfönster, avslutas hela applikationen, i stället för att (som för det mesta) bara minimeras och ligga vilande i bakgrunden. Man får en sån ok-knapp, i stället för ett minimeringskryss, genom att sätta egenskapen MinimizeBox i formuläret till false.

b) (9p)

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;

namespace Tenta_1
{
        /// 
        /// Summary description for Form1.
        /// 
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.TextBox textBox1;
                private System.Windows.Forms.Button button1;
                private System.Windows.Forms.Label label2;
                private System.Windows.Forms.MainMenu mainMenu1;

                public Form1()
                {
                        //
                        // Required for Windows Form Designer support
                        //
                        InitializeComponent();

                        //
                        // TODO: Add any constructor code after InitializeComponent call
                        //
                }
                /// 
                /// Clean up any resources being used.
                /// 
                protected override void Dispose( bool disposing )
                {
                        base.Dispose( disposing );
                }
                #region Windows Form Designer generated code
                /// 
                /// Required method for Designer support - do not modify
                /// the contents of this method with the code editor.
                /// 
                private void InitializeComponent()
                {
                        this.mainMenu1 = new System.Windows.Forms.MainMenu();
                        this.label1 = new System.Windows.Forms.Label();
                        this.textBox1 = new System.Windows.Forms.TextBox();
                        this.button1 = new System.Windows.Forms.Button();
                        this.label2 = new System.Windows.Forms.Label();
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(8, 8);
                        this.label1.Size = new System.Drawing.Size(224, 32);
                        this.label1.Text = "Skriv ett ord i rutan, och tryck sen på knappen!";
                        // 
                        // textBox1
                        // 
                        this.textBox1.Location = new System.Drawing.Point(8, 56);
                        this.textBox1.Size = new System.Drawing.Size(224, 20);
                        this.textBox1.Text = "svampkorg";
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(160, 96);
                        this.button1.Text = "Knappen";
                        this.button1.Click += new System.EventHandler(this.button1_Click);
                        // 
                        // label2
                        // 
                        this.label2.Location = new System.Drawing.Point(8, 136);
                        this.label2.Size = new System.Drawing.Size(224, 24);
                        this.label2.Text = "Ordet var: svampkorg";
                        // 
                        // Form1
                        // 
                        this.Controls.Add(this.label2);
                        this.Controls.Add(this.button1);
                        this.Controls.Add(this.textBox1);
                        this.Controls.Add(this.label1);
                        this.Menu = this.mainMenu1;
                        this.MinimizeBox = false;
                        this.Text = "Meningslöshet";

                }
                #endregion

                /// 
                /// The main entry point for the application.
                /// 

                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void button1_Click(object sender, System.EventArgs e)
                {
                        label2.Text = "Ordet var: " + textBox1.Text;
                }
        }
}

Rättningskommentarer:
Man måste ha en MainMenu för att få en SIP. Annars -1p.
Man måste sätta MinimizeBox till false. Annars -1p.
Man måste ha metoden InitializeComponent, och den måste heta så, för att koden ska "fungera" i den betydelsen att det går att redigera formuläret i Designern. Annars -1p.

Uppgift 2 (2 p)

Bild a är den rätta: Programmet går att köra även under Windows XP (och andra Windows-varianter, om man installerat .NET Framework). EXE-formatet med IL (Intermediate Language) för hanterad kod ("managed code") är detsamma, och .NET Compact Framework är (nästan i alla fall) en delmängd av vanliga skrivbords-.NET (som heter .NET Framework), vilket betyder att alla klasser och annat som finns i .NET Compact Framework också kan användas i vanliga .NET Framework.

Rättningskommentarer:
1 poäng för rätt bild, 1 poäng för förklaringen.
En förklaring som handlar om Windows i stället för .NET är fel.

Uppgift 3 (5 p)

a) (3p)

Några nackdelar med emulatorn:

Att provköra i emulatorn är alltså ett komplement till att provköra på en riktig handdator, snarare än en ersättning.

b) (2p)

Vanliga PC-datorer skiljer sig inte så mycket från varandra. Alla har en processor som följer 386-arkitekturen. De har ett tangentbord som ser ungefär likadant ut, och de har en skärm, även om storlek och upplösning på skärmen kan variera lite. De har ett pekdon av något slag, i form av mus, pekplatta eller styrkula.

Men handdatorer skiljer sig mer. Till exempel kan olika handdatorer ha helt olika typ av processor, och ibland kan det finnas processorberoende buggar som man inte märker förrän man provar med just den processortypen.

I handdatorprogram "pressar" man också hårdvaran mer, till exempel när det gäller vad man får plats med på skärmen. Ett vanligt skrivbordsprogram som öppnar ett fönster på skärmen har gott om plats, och det spelar inte så stor roll om man sen kör det på en 1024x768-skärm eller på en 1600x1200-skärm. Det får förmodligen gott och väl plats ändå. Men på handdatorns lilla skärm får man anstränga sig för att trycka in allt man vill få plats med, och om man sen plötsligt kör på en dator där skärmen är en liten aning mindre, så blir det kanske helt oläsligt. Eller om man utnyttjar färger för att visa saker (till exempel batteristatus), och sen kör man på en handdator med en skärm som ser grådaskig ut i dagsljus, så det blir svårt att se vad det egentligen är för färg. Såna problem, och skillnader mellan olika modeller och fabrikat, har man sällan på skrivbordsdatorer.

Uppgift 4 (3 p)

Uppgift 5 (2 p)

C# är ett språk som körs i .NET-miljön, och använder .NET-miljöns datatyper och typsystem. De särskilda datatyperna i C# (int, string osv) är alias för datatyper i .NET-miljön.

Uppgift 6 (2 p)

I den icke uppkopplade lösningen lagrar man en kopia av (relevanta) data i programmets arbetsminne, i form av ett DataSet som innehåller en eller flera DataTable. En DataTable kopplas till en databas med en SqlDataAdapter (som är specifik för just den databashanteraren). Tabellens innehåll hämtas respektiva sparas inte kontinuerligt (för vi är ju inte uppkopplade mot databashanteraren hela tiden), utan vid vissa tidpunkter.

I den uppkopplade lösningen behövs inte en sådan DataTable-kopia, utan man hämtar respektive sparar direkt i databasen, och uppdaterar databasen kontinuerligt allteftersom programmet ändrar sina lokala data. Man måste alltså ha en stabil uppkoppling mot databashanteraren.

Uppgift 7 (10 p)

a) (5p)

private void öppnaknappen_Click(object sender, System.EventArgs e)
{
        string filnamnet = filnamnsrutan.Text;
        if (!File.Exists(filnamnet)) 
        {
                MessageBox.Show("Filen finns inte.");
        }
        else 
        {
                StreamReader sr = null;
                try 
                {
                        sr = new StreamReader(filnamnet);
                        redigeringsrutan.Text = sr.ReadToEnd();
                }
                catch (Exception ex) 
                {
                        MessageBox.Show("Det gick inte att öppna filen: " + ex.Message);
                }
                finally 
                {
                        if (sr != null)
                                sr.Close();
                }
        }
}

b) (5p)

private void sparaknappen_Click(object sender, System.EventArgs e)
{
        string filnamnet = filnamnsrutan.Text;
        StreamWriter sw = null;
        try 
        {
                sw = new StreamWriter(filnamnet);
                sw.Write(redigeringsrutan.Text);
        }
        catch (Exception ex) 
        {
                MessageBox.Show("Det gick inte att spara: " + ex.Message);
        }
        finally 
        {
                if (sw != null)
                        sw.Close();
        }
}


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se) 29 december 2005