Welche Möglichkeiten gibt es um eine Berechnung zu programmieren, welche Programme ich von der Größe her zusammen auf eine CD/DVD brennen kann.
Ich möchte die Größe der Medien optimal ausschöpfen.
Im Ordner Tools habe ich jetzt 100 Anwendungen wo das Programm erst einmal die Gesamtgröße ausrechnet. Na kann man schon sagen wie viele CDs/DVDs ich benötige. Aber wie ist es möglich eine optimale Zusammensetzung zu berechnen ?
Kann ich Visual Studio 2005 auch irgendwie laden ohne das ich Geld für die MSDN Mitgliedschaft bezahle?
Bei DockStyle.Fill sieht man gar nix mehr und bei Anchor in alle Richtungen geht das TabControl auch in die Höhe 🙁
Ich habe unten in meiner WnForm ein TabControl.Diese soll ,wenn sich die Size der Form ändert , weiter nach unten gezogen werden.Wenn ich das per Anchor mache geht das TabControl endweder weiter nach oben und unten (Bottom und Top) oder nur nach unten (Bottom).
Wie geht das, dass die Form sich nur nach unten Streckt wenn die Form größer wird?
Ich möchte gerne alle mp3s aus einem Ordner abspielen.
public void getlieder()
{
String[] files=Directory.GetFiles(Data.musik,"*.mp3");
foreach(string name in files)
{
//System.Windows.Forms.Application.DoEvents();
if(this._play==true)
{
this.name=name;
string cmd = "open \"" + name + "\" type " + "mpegvideo" + " alias \"" + name + "\"";
int errCode = mciSendString(cmd, null, 0, IntPtr.Zero);
CheckError(errCode);
this.SetTimeFormat("m");
String time=this.GetLength();
this.Play(time);
System.Threading.Thread.Sleep(int.Parse(time));
}
else
{
break;
}
}
}
So werden zwar alle Lieder abgespielt aber es dauert immer etwas bis ein neues Lied anfängt.
Habt ihr bessere Vorschläge?
PS.: Der Musikplayer läuft als Thread neben den eigentlichen Programm.
Danke Rapthor,
stellt sich jetzt nur noch die Frage wie ich das ganze an der gewünschten Poition mache? Oder kann ich eine Methode aus der C# Klasse von der Webseite aus aufrufen?
Ich möchte gerne wenn man auf einem Link klickt sich ein Teil der Seite verändert.
Der Link wird als Parameter an die URL gehangen.Bei der Abfrage welcher Link aktiv ist
private void Page_Load(object sender, System.EventArgs e)
{
if(Request["link"].ToString()!=null)
{
Response.Write(Request["link"].ToString());
}
}
soll an einer Stelle in der Seite der Text verändert werden.Bei php würde ich das per include oder mit einer if Abfrage im Quellcode machen.Aber wie geht das bei aspx?
Dies sind meine ersten schritte im asp(x) Bereich.
Also ich habe jetzt folgendes:
Daten empfangen
NetworkStream stream = new NetworkStream (socket, FileAccess.ReadWrite,false);
StreamWriter reader = new StreamWriter(this.saveFileDialog1.FileName,false,Encoding.Default);
byte[] buf = new byte[stream.Length];
stream.Read(buf,0,buf.Length);
reader.Write(Encoding.Default.GetChars(buf));
reader.Close();
Daten senden
TcpClient client = new TcpClient();
client.Connect(ip, 7777 );
NetworkStream stream = client.GetStream();
Stream reader = File.OpenRead(this.openFileDialog1.FileName);
byte[] buf = new byte[reader.Length];
reader.Read(buf, 0, buf.Length);
stream.Write(buf, 0, buf.Length);
stream.Close();
reader.Close();
client.Close();
Bei dem Senden dürfte es keine Fehler geben aber bei Empfangen ist sicher Fehler.
Wobei ich nicht genau verstehe was eigentlich gesendet wird,denn ich sende ja nur buf ?!
StreamReader erwartet ein char[] aber woher soll ich das nehmen?
Ich habe hier im Forum von dieser Methode gelesen
NetworkStream stream = client.GetStream();
Stream reader = File.OpenRead(this.openFileDialog1.FileName);
byte[] buf = new byte[reader.Length];
reader.Read(buf, 0, buf.Length);
stream.Write(buf, 0, buf.Length);
Ich weiß aber nicht ob dies Richtig ist.
Wie kann ich die Datei den in ein Byte[] zerlegen und wieder zusammenfügen?
Danke Rainbird !
Wenn ich zB eine exe Datei sende wird die nicht richtig übertragen,was sicher am Encoding liegt.
Client:
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse(this._clientdata[i-1].ToString()), 7777 );
NetworkStream stream = client.GetStream();
StreamReader reader = new StreamReader(this.openFileDialog1.FileName,Encoding.ASCII);
StreamWriter writer = new StreamWriter(stream);
writer.Write(reader.ReadToEnd());
writer.Flush();
writer.Close();
reader.Close();
client.Close();
Server:
TcpListener listener = new TcpListener(7777);
listener.Start();
Socket socket = listener.AcceptSocket();
NetworkStream stream = new NetworkStream (socket, FileAccess.ReadWrite,false );
StreamReader reader = new StreamReader(stream,Encoding.ASCII);
StreamWriter writer = new StreamWriter(this.saveFileDialog1.FileName);
writer.Write(reader.ReadToEnd());
writer.Flush();
writer.Close();
reader.Close();
listener.Stop();
Was für ein Coding soll ich da nehmen?
Edit: Hat sich erledigt,habe Default genommen 😁
Gibt es eine Möglichkeit den Status anzeigen zu lassen??
Ich suche jetzt schon die ganze Zeit nach Hinweisen wie man Dateien per NetworkStream versenden kann.
Könnte man eine Datei in byte[] umwandeln.versenden und dann wieder von byte[] in Datei umwandeln ?
Ich steige nicht ganz durch 🤔
Soweit wie ich verstanden habe muss man das mit dem StringBuilder machen.
this.textBox2.Rtf=this.textBox2.Rtf+this.textBox1.Rtf
Das geht so nicht,denn da wird nur der Rtf Code von TextBox2 eingefügt X(
Danke Programmierhans für den Hinweis,aber ich will es erstmal mit meiner Methode probieren.
Es geht auch alles soweit nur wenn ich einen farbigen Text in TextBox1 eingebe wird dieser Text nicht so in TextBox2 dargestellt.Man kann auch leider nicht die RTF Codes zusammenfügen 🙁
Ich denke viele kennen ICQ und dort gibt man seinen Text ein und klickt auf senden. Der eigene Name wird anders farbig dargestellt als der von gegenüber. Ich möchte das in meinem Chat Programm auch so haben.
Ich nutze dazu die RichTextBox.
this.textBox2.Text=this.textBox2.Text+"\r\n"+Environment.UserName+" schrieb um "+DateTime.Now.ToString("H:mm:ss")+" "+ this.textBox1.Text;
String text=Environment.UserName+" schrieb um "+DateTime.Now.ToString("H:mm:ss")+" "+ this.textBox1.Text;
this.textBox2.SelectionStart=this.textBox2.TextLength-text.Length;
this.textBox2.SelectionLength=user.Length;
this.textBox2.SelectionColor=Color.Red;
this.textBox2.SelectionFont=new Font("Comic Sans",15);
So wird der Name zwar anders hinterlegt aber bei nächsten Senden wird nur der Name welcher als letzten geschrieben wurde markiert.
Eigentlich ganz logisch 😁
Wenn ich die ganze Form hinzufüge sieht das ja nicht so schön aus (Form im Form 🙂 ) ,deswegen habe ich mich lieber für das Panel entschieden.
Danke
Das ist mir klar und ich bin auch vertraut mit der OO 😉
Aber bei diesem Problem finde ich irgendwie keine Lösung und ich bin keiner von denen die direkt Fragen ohne vorher nachzudenken!!
Mir ist klar das wenn ich alles in eine Klasse schreibe es einfach ist die Form zu überschreiben.Aber ich habe nun mal eine 2.Klasse wo das 2.Fenster aufgebaut ist und dieses 2.Fenster möchte ich gerne in der 1.Form anzeigen lassen.
Original von Programmierhans
Sorry ich will Dich ja wirklich nicht beleidigen, aber ich empfehle Dir mal ein gutes Buch über .Net und OO zu lesen, damit Du mal die Grundkonzepte der OO-Entwicklung kennenlernst ...
Ein Buch kannst jedem Empfehlen der eine Frage hat und sich damit selber auseinandersetzten soll.
Aber Danke für den Tipp mit dem UserControl mal schauen wie das so geht
Hi MS Master,
wenn du
this.MaximizeBox = false;
this.MinimizeBox = false;
machst ist nur noch das Schließen Icon da.Wie du aber die gesamte Titelleiste weg bekommst weiß ich leider auch nicht
Ein komplett neue Oberfläche will ich erstellen ,deswegen ja auch die dll Datei
Mit Menü waren Buttons gemeint wo halt der Modus drauf steht und nicht die Menübar.Aber das mit dem löschen war mir schon klar nur wie lade ich die neuen Komponenten in die Form?
Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet.
@herbivore
Hatte mich verklickt X(
Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet
Wenn ich auf Verbinden klicke kann ich im Fenster nix mehr anklicken.Die Sanduhr ist nur noch da 🙁
Original von Programmierhans
Im ersten Codeblock sendest Du ein leeres ByteArray ! GuckstDu Encoding.GetBytes an....und im zweiten Codeblock läuft er nur einmal direkt durch (weil DataAvailable noch auf false ist).... da muss ne Schlaufe hin (und das ThreadSleep nicht vergessen)
Ich lass Dich nicht ganz hängen, aber alles will ich ja auch nicht für Dich coden... sonst lernst Du ja nichts....
Sollst du ja auch nicht 😉
Also das erste habe ich jetzt geändert
byte[] bytesToSend=Encoding.Default.GetBytes("test");
ns.Write(bytesToSend,0,bytesToSend.Length);
Den zweiten Block auch
while(!this._ClientStop)
{
if(nsc.DataAvailable)
{
byte[] bytes=new byte[this._TcpClientSender.ReceiveBufferSize];
int intBytesRead=nsc.Read(bytes,0,this._TcpClientSender.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
//work=true;
}
else
{
Thread.Sleep(100);
}
}
Der Client stürzt nun aber beim Verbinden was aber sicher daran liegt das die Schleife erst "zu Ende" läuft 🤔
Sieht ganz so aus als wäre das wieder total falsch 🙁
Damit der Server an die Clients Daten sendet müsste ich den NetworkStream vom jeweiligen Client nehmen und damit dann die Daten senden.
foreach (TcpClient client in this._HtClients.Keys)
{
NetworkStream ns=this._HtClients[client]as NetworkStream;
if (ns.DataAvailable)
{
//oho wir haben Daten erhalten
byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
ns.Write(bytes,0,client.ReceiveBufferSize); //Senden der Empfangen Daten an Client
this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
this.Refresh();
iHadWork=true;
}
}
Wobei nach diesem Code jetzt nur an den Client gesendet wird welcher gerade Daten schickt aber zum testen reicht es ja erst einmal.
Damit der Client Daten empfängt müsste ich ein NetworkStream für den Client erstellen.
Ich habe das jetzt mal direkt beim Verbinden zum Server gemacht
this._TcpClientSender=new TcpClient();
this._TcpClientSender.Connect(IPAddress.Parse("127.0.0.1"),6667);
this._SendStream=this._TcpClientSender.GetStream();
NetworkStream nsc=this._SendStream as NetworkStream;
if(nsc.DataAvailable)
{
byte[] bytes=new byte[this._TcpClientSender.ReceiveBufferSize];
int intBytesRead=nsc.Read(bytes,0,this._TcpClientSender.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
MessageBox.Show(j);
}
Ist das jetzt Ansatzweise richtig?
Ich habe mal versucht das irgendwie zu machen.
//prüfe ob für offene Clients Daten da sind
foreach (TcpClient client in this._HtClients.Keys)
{
NetworkStream ns=this._HtClients[client]as NetworkStream;
if (ns.DataAvailable)
{
//oho wir haben Daten erhalten
Stream outStream=client.GetStream();
byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
outStream.Write(bytes,0,intBytesRead); //Daten an Client senden?
//MessageBox.Show(j);
this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
this.Refresh();
iHadWork=true;
}
}
this._TcpClientSender=new TcpClient();
this._TcpClientSender.Connect(IPAddress.Parse("127.0.0.1"),6667);
this._SendStream=this._TcpClientSender.GetStream();
_HtClients2.Add(this._TcpClientSender,this._TcpClientSender.GetStream());
foreach (TcpClient client in _HtClients2.Keys)
{MessageBox.Show("kdöl");
NetworkStream ns=this._HtClients2[client]as NetworkStream;
if (ns.DataAvailable)
{
//oho wir haben Daten erhalten
Stream outStream=client.GetStream();
byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
outStream.Write(bytes,0,intBytesRead);
//MessageBox.Show(j);
this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
this.Refresh();
//iHadWork=true;
}
}
Ich hoffe ihr denkt jetzt nicht was macht der da für ein Quatsch aber ich verstehe nicht wie ich das umsetzten soll X(
Erst einmal vielen vielen Dank für die Arbeit die du dir gemach hast 👍
Habe aber noch eine Frage wie kann der Server an Client Daten senden??
Ich finde es auch besser als vorher 👍
Nur habe ich jetzt mein Thema ins falsche Forum geschrieben 😁
Thread.Sleep und Thread.Join sind mir bekannt, ich weiß aber nicht wo ich das anwenden soll 🙁
Ich denke du meinst ich soll das Senden der Daten an Client schlafen legen wenn es nix zu gibt.Aber woher soll die Methode wissen wann die Spielfigur sich bewegt ?? 🤔
Mit this.label9.LocationChanged+=new EventHandler(label9_LocationChanged); wird bei Location änderung eine Methode aufgerufen und müsste dann die Daten an den Client gesendet werden
Ich finde das mit native TCP/IP einfacher und habe es mal damit Versucht.
1.Problem der Thread
public class ServerThread
{
// Stop-Flag
public bool stop = false;
// Flag für "Thread läuft"
public bool running = false;
// Die Verbindung zum Client
private TcpClient connection = null;
// Speichert die Verbindung zum Client und startet den Thread
public ServerThread ( TcpClient connection )
{
// Speichert die Verbindung zu Client,
// um sie später schließen zu können
this.connection = connection;
// Initialisiert und startet den Thread
new Thread ( new ThreadStart ( Run ) ).Start ();
}
// Der eigentliche Thread
public void Run ()
{
// Setze Flag für "Thread läuft"
this.running = true;
// Hole den Stream für's schreiben
Stream outStream = this.connection.GetStream ();
int buf = 0;
bool loop = true;
while ( loop )
{
try
{
// Hole die aktuelle Zeit als String
int i = Form1.i;
// Sende Zeit nur wenn sie sich von der vorherigen unterscheidet
if ( i!=buf )
{
// Wandele den Zeitstring in ein Byte-Array um
// Es wird noch ein Carriage-Return-Linefeed angefügt
// so daß das Lesen auf Client-Seite einfacher wird
Byte[] sendBytes = Encoding.ASCII.GetBytes ( i + "\r\n" );
// Sende die Bytes zum Client
outStream.Write ( sendBytes, 0, sendBytes.Length );
// Merke die Zeit
buf = i;
}
// Wiederhole die Schleife so lange bis von außen der Stopwunsch kommt
loop = !this.stop;
}
catch ( Exception )
{
// oder bis ein Fehler aufgetreten ist
loop = false;
}
}
}
public void close()
{
// Schließe die Verbindung zum Client
this.connection.Close ();
// Setze das Flag "Thread läuft" zurück
this.running = false;
}
}
Ich bin nach der Anleitung auf http://www.microsoft.com/germany/msdn/library/net/csharp/NetworkingMitCSharp.mspx vorgegangen.
Hier wird die Schleife in der run() ja solange durchlaufen bis die Verbindung getrennt wird.Ich will aber dann Daten senden wenn sich die Spielfigur bewegt und somit die 100% Prozessor auslastung vermeiden.
2.Problem der Client
Der Client stürzt ab was aber auch an der 100% Prozessor auslastung liegen könnte.Den es müsste eigentlic alles stimmen:
private void client()
{
// Verbindung zum Server aufbauen
c = new TcpClient ( "localhost", 4711 );
// Stream zum lesen holen
String buff=null;
StreamReader inStream = new StreamReader ( c.GetStream () );
if(inStream.ReadLine().ToString()!=buff)
{
try
{
MessageBox.Show(inStream.ReadLine().ToString());
// Hole nächsten Zeitstring vom Server
/*int j= int.Parse(inStream.ReadLine ());
this.label9.Location=new Point(Spieler.spieler1x[j],Spieler.spieler1y[j]);
this.Refresh();*/
buff=inStream.ReadLine().ToString();
}
catch ( Exception )
{
// Setze das Schleifen-Flag zurück
// wenn ein Fehler in der Kommunikation aufgetreten ist
this.clientclose();
}
}
}
Eine Verbindung zum Server wird per Buttonklick hergestellt
Ich verstehe nicht wie ich das bei mir einbauen kann X( Also was ich vor habe ist ein kleines Brettspiel welches je nach Auswahl alleine oder im Netzwerk gespielt werden kann.
Wenn Multiplayer ausgewählt wurde geht es auf das Spielfeld wo Spieler1 würfelt und die Spielfigur bewegt sich.Spieler2 soll den den gewürfelten Wert sehen zB in einer TextBox oder MessageBox und auch wie sich die Spielfigur bewegt.
Später kommen da noch andere Dinge hinzu die Spieler2 erfahren muss.
Klickt der Spieler auf Würfeln passiert folgendes:
private void button1_Click(object sender, System.EventArgs e)
{
int zuz=zz.Next(1,6);
this.textBox1.Text=zuz.ToString();
for(int j=1;j<=zuz;j++)
{
if(i==8)
{
i=0;
}
this.label9.Location=new Point(Spieler.spieler1x[i],Spieler.spieler1y[i]); // Die Punkte kommen aus einem Array
i++;
this.Refresh();
Thread.Sleep(600);
}
}
Nun müsste beim Multiplayer ja die Location an den Client (Spieler2) gesendet werden.Dazu könnte man eine Methode schreiben welche die Location an alle verbunden IPs schicken bis auf die eigene IP.
Ist für sowas nicht doch native TCP/IP besser?
Danke für die Antwort 👍
Ich werde mir das mal anschauen und versuchen in mein Projekt zu übertragen.
Ich möchte gerne die Location eines Labels an einem anderen Rechner senden, damit dort das Label genau so positioniert ist.
Das Problem ist ich habe keine Ahnung wie das genau geht X( . Könnt ihr mir ein Beispiel oder ein Hinweis zeigen wo Daten gesendet bzw empfangen werden über TCP/IP ?!
Ne das geht bei mir nicht 😦Da wird ja immer das System.Byte[] ausgegeben
Habe die Lösung gefunden 8)
byte[] bytetext = (byte[])(read[0]);
text = System.Text.Encoding.UTF8.GetString(bytetext);
Original von Programmierhans
um deinen Reader zu verwenden....ich würds irgendwie so probieren
byte[] bytes=new byte[1048576]; //1 Mega long lngRead=read.GetBytes(0,0,bytes,0,bytes.Length); string strRead=System.Text.Encoding.Default.GetString(bytes,0,(int)lngRead);
Dann kommt
MySQLDriverCS Exception: Operation not supported at MySQLDriverCS.MySQLDataReader.GetBytes(Int32 i, Int64 fieldOffset, Byte[] buffer, Int32 bufferoffset, Int32 length)
Wie einfacher geht das nicht ?(8o
Ich glaube ich habe mich etwas im Topic vertan X(
Ich habe eine MySQL DB welche eine Tabelle hat wo ein Wert vom Typ Text drin steht.Ich will nun den Text ausgeben lassen
Original von Programmierhans
Schön stufenweise 🙂Blob --> byte[]
MemoryStream kann den im Construcor brauchen
mit dem nun erstellen MemoryStream kannst Du einen StreamReader anwerfen...
Und Mit StreamReader.ReadToEnd kriegste alles als string.
Ich kann auch kein Text aus mysql richtig auslesen also habe ich das gemacht was du geschireben hast:
String b2="Select text from talk Where titel='"+titel+"' and datum='"+datum+"';";
MySQLCommand com = new MySQLCommand(b2,this.con);
read=(MySQLDataReader) com.ExecuteReader();
System.Text.Encoding encoding=System.Text.Encoding.Default;
while(read.Read())
{
byte[] test=encoding.GetBytes(read[0].ToString());
MemoryStream ms=new MemoryStream(test);
StreamReader st=new StreamReader(ms);
MessageBox.Show(st.ReadToEnd());
}
Der Text wird aber nicht ausgegeben 🙁
Wie soll das den gehen? 8o
Habe schon wieder eine Frage X(
Wie kann man tga Files in C# öffnen ?
Ich wollte eigentlich testen ob es möglich ist ein Label über die Forum zu "jagen".
Hoch,runter,rechts,links ist kein Problem aber wenn ich es nun schräg laufen lassen will ? Dazu muss der Anwender ja 2 Tasten gleichzeit drücken 🤔
@Timo Was meinst du mit Tastaturpuffer ?
Original von Noodles
Hast Du meinen Post gesehen und mal versucht Alt durch A und F4 durch S zu ersetzen?
Ja und das geht nicht