Om jag lagrar all COM-ports kod i en separat fil, com.cs, måste jag då inkludera den filen i designen på nåt sätt?
Förstod inte riktigt vart jag skulle slänga in koden. Eller hur designen ska förstå att den ska kolla i efter koden i en annan fil.
86 svar · 5 287 visningar · startad av Gildebrand · sida 2 av 5
Om jag lagrar all COM-ports kod i en separat fil, com.cs, måste jag då inkludera den filen i designen på nåt sätt?
Förstod inte riktigt vart jag skulle slänga in koden. Eller hur designen ska förstå att den ska kolla i efter koden i en annan fil.
Om du i ditt projekt skapar en ny fil, genom att högerklicka i solution explorer på ditt projekt och väljer "Add" sen "new item" sen "class" så skapas filen med samma namespace automatiskt och kommer att kompileras in automatiskt, plus att dom blir åtkomliga från alla andra filer i projektet direkt.
Hur gör man för att koppla en knapp så att den öppnar en annan design i samma fönster?
Nu har jag äntligen fått tid att försöka göra något av allt ni har visat mig.
Så jag tänkte först bara göra ett enkelt program som skickar ut "Hello World" på COM1 när jag trycker på en button.
Män när jag trycker på knappen sedan så får jag det trevliga felmeddelandet
Ett undantag som inte handeras har uppstått i ditt tillämpningsprogram. Om du klickar på Fortsätt ignoreras det här felet. Om du klickar på Avsluta avslutas tillämpningsprogrammet omedelbart.
Åtkomsten till porten COM1 nekades.
Förresten, jag hittade en funktion som kanske går att använda till det här för att göra det lite enklare. I verktygslådan under components, så finns det en som heter Serialport. Går det att använda den på något sätt?
EDIT: Jag klantade mig. Jag hade hyperterminal igång samtidigt på COM1 så det låste tydligen så att mitt program inte kunde göra något. Nu funkar det
Bra att det löste sig. Det är god sed att lägga saker som interagerar med hårdvara eller nätverk eller andra applikationer (SQL ex) i try/catch-block så att ditt program inte kraschar utan istället kanske kan ge en snäll varning om vad felet antagligen är :) Kolla in try / catch i kodhjälpen så förstår du vad jag menar!
När det gäller SerialPort att dra in så är det samma sak som att skriva den själv i koden, fast du gör den tillgänglig i hela applikationen som default. Inget konstigt, jag drar ofta in menyer, tooltip och lite annat, medans jag ofta skriver databas etc själv trots att jag skulle kunna göra samma sak där. Smaksak och vana, antar jag!
Funderade lite på kodraden
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
Berättar den bara att det är slutet på kommandot? Testade med och utan den koden, och när jag körde med den så vart det ett o med en pil uppåt efter texten, samt att den bytte rad, medans när jag körde utan den koden så fortsatte den på samma rad utan o-tecknet.
Undrar fortfarande över hur jag kopplar en knapp så att den öppnar konfigurera.cs i samma fönster.
Har inte heller fått riktigt häng på det här med classes. Jag skapar en class inom projektet som jag döper till com.cs.
Såhär ser koden till com.cs ut
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
class com
{
private void Hello()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("Hello");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Och Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Hello();
}
private void button2_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("World");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Verkar inte som att Form1.cs har rått häng på com.cs. Namespacen stämmer väl så det borde väl inte vara problemet? När jag försöker builda så får jag error
The name 'Hello' does not exist in the current context
Justja, går det att köra programmet i fulscreen?
Hej,
för att vara nybörjare så tycker jag du gör enorma framsteg! Kul!
När det gäller com.cs så har du där skapat din klass. Det kan man likna vid att du ritat upp en ritning över allt som ett com-objekt ska klara. Den ska ligga i namespaces si och så, och ha en metod Hello().
Det du sen måste göra är att skapa åtminstonde en instans av din ritning. Jämför bilfabriken - du har hittills skapat en blueprint, nu måste du bygga minst en bil också.
Vi behöver alltså byta ut ditt Hello() mot något annat.
Nu kan man "bygga" din com-klass lite var stans, beroende på vilket scope den ska få, men för att göra det enkelt så gör såhär istället:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
com myCom = new com();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
myCom.Hello();
}
private void button2_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("World");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Förresten - hittade det här:
När det gäller att byta fönster så finns det ett antal olika sätt att göra det på.
Jag skulle nog valt att skapa varje separat fönster i en Panel och så visar jag rätt panel beroende på vad jag klickar på.
Man kan också tänka sig att du använder tabbed panels, om man vill låta användaren switcha fram och tillbaka mellan fönster enkelt.
Men låt säga att du använder Panel - då gör du alla andra panels osynliga, alternativt lägger den aktiva överst och så gör du det i ditt klick event för respektive knapp...
Lite luddigt och inga kodexempel, men jag har aldrig gjort det du vill även om jag förstår precis vad du vill göra :)
Och hur man gör en WinForm riktigt fullscreen finns beskrivet här:
http://www.vesic.org/english/blog/winforms/full-screen-maximize/
Sådär, fick två fel nu, Ena var att den sa att den inte hade rättighet till Hello() i com.cs, men det verkade lösa sig när jag bytte ut private mot public. Ett fel kvar.
'WindowsFormsApplication1.Form1.Dispose(bool)': no suitable method found to override Form1.Designer.cs
Jag gillar idén att ha osynliga tabar med buttons som styr vilken tab man ska befinna sig i. Ska undersöka det lite mer.
Precis, du kan vilja ha privata klasser och properties i com.cs och då syns dom bara i det scopet - dvs i den klassen.
Vad ditt felmeddelande beror på har jag inte en susning om, dessvärre.
Det löste sig, fast har ingen aning om vad jag gjorde :D
Jag la till en thread.freeze.
Såhär ser det ut nu
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace WindowsFormsApplication1
{
class com
{
public void Hello()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("Hello");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
Thread.Sleep(2000);
port.Write("Tjosilosan");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
public void World()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("World");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Går det på något sätt göra så att klasserna Hello och world ligger i olika thread så att när jag kör Hello och World samtidigt så körs inte world först 2 sekunder efter att Hello är klar?
Jag skulle också behöva styra nån dvd-spelare, mjukvarubaserad alltså. Typ styra spola pause och playkontrollerna, samt dvd-navigering. alltså pilarna, enter och meny. Skulle det gå att skriva ett program som skickar låtsastangentnedtryckningar till ett program? då borde det gå att lösa gnaksa enkelt.
Hmm, om du vill att Hello och World skall ha en relation, framförallt tidsmässig, då är det ju en knasig lösning att använda threads vars idé är att i princip tillåta samtidig exekvering.
Jag skulle kanske istället skapa en metod HelloWorld() som innehåller all logik för att göra både och, med de timings som din hårdvara kräver.
När det gäller DVD etc så finns det inbyggt i .NET eller snarare ActiveX så du kan utan problem skicka play-kommando till din DVD-enhet.
Kolla in MSDN: http://msdn.microsoft.com/en-us/library/dd562851(VS.85).aspx
Har du någon idé om hur man kan säga åt tabcontrol1 att den ska ställa sig på tex tabPage1?
Man använder egenskapen SelectedTab
http://msdn.microsoft.com/en-us/library/system.windows.forms.tabcontrol.selectedtab.aspx
Hur gömmer jag TabControl?
Hello och World ska väl inte ha någon tidsmässig relation. De ska bara köras samtidigt. Och eftersom Thread.Sleep låser hela tråden, så tänkte jag dela in det i två trådar, så "Hello" ligger i en tråd och "World" i en annan.
Nu har jag gjort flera trådar och trodde det skulle lösa sig men icke. Samma sak som innan jag la upp två skilda trådar händer.
Såhär ser koden för com.cs ut
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace WindowsFormsApplication1
{
class com
{
public void Main(string[] args)
{
ThreadStart tsHello = new ThreadStart(Hello);
ThreadStart tsWorld = new ThreadStart(World);
Thread tHello = new Thread(tsHello);
Thread tWorld = new Thread(tsWorld);
tHello.Start();
tWorld.Start();
// Quite important. You won't get at all the behaviour you'd
// expect if you don't do this. See MSDN for details.
tHello.Join();
tWorld.Join();
}
public void Hello()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("Hello");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
Thread.Sleep(2000);
port.Write("Tjosilosan");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
public void World()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("World");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Och under knappen i designen har jag bara skrivit
myCom.Hello();
myCom.World();
Nu trodde jag att programmet skulle skriva Hello, World, (2sdelay) Tjosilosan men istället skriver det Hello, (2sdelay) Tjosilosan, World.
Hur var det du tyckte jag skulle göra, Headbug?
Använda methods? Hur gör man då? Skulle jag då kunna köra flera olika funktioner samtidigt trots att den några funktioner har ett delay inbyggt?
Prova att stänga porten med close innan delayet och sen öppna den igen efter. När du öppnar porten så låser du den.
Jag har nog inte riktigt fattat vad du försöker göra på comporten och varför du vill kunna köra saker över porten nästan samtidigt.
Kanske om du förklarar lite mer i detalj så är det möjligt att vi slås av någon insikt här :)
Som jag skrev tidigare ska jag göra ett styrsystem till en av-installatione. Alltså styra projektor, duk, gardiner och lite sånt.
Tanken är att gränssnittet ska vara så användarvänligt så att en förskolelärare klarar av att använda det utan hjälp. Så det användarn möts av först är låt säga 5 buttons, och på en utav dem står det "Spela upp en DVD". När användarn trycker på den åker duken ner, gardinerna ner, projektorn slås på.
och när duken och gardinerna åkt ner så vill jag att den ska sluta skicka kommando för dukner, så därav sleep. Sleeptiden är alltså tiden det tar för duken att åka ner.
Prova att stänga porten med close innan delayet och sen öppna den igen efter. När du öppnar porten så låser du den.
Förstår hur du menar, ska prova det.
EDIT: Provade det, men det gjorde ingen skillnad.