From 40c470c184341130930acd88639615e3bf7f48f1 Mon Sep 17 00:00:00 2001 From: Alexander Eckart Date: Sat, 4 May 2013 16:53:36 +0200 Subject: [PATCH] added Client Test Form --- .gitignore | 1 + ClientServerLib/ClientServerLib.sln | 22 ++ ClientServerLib/ClientServerLib/CClient.cs | 21 +- ClientServerLib/ClientServerLib/Structs.cs | 1 + .../ClientTest/ClientTest.Designer.cs | 204 ++++++++++++++++++ ClientServerLib/ClientTest/ClientTest.cs | 76 +++++++ ClientServerLib/ClientTest/ClientTest.csproj | 93 ++++++++ ClientServerLib/ClientTest/ClientTest.resx | 123 +++++++++++ ClientServerLib/ClientTest/Program.cs | 21 ++ .../ClientTest/Properties/AssemblyInfo.cs | 36 ++++ .../Properties/Resources.Designer.cs | 71 ++++++ .../ClientTest/Properties/Resources.resx | 117 ++++++++++ .../Properties/Settings.Designer.cs | 30 +++ .../ClientTest/Properties/Settings.settings | 7 + .../ClientTest/bin/Debug/ClientTest.exe | Bin 0 -> 11776 bytes .../bin/Debug/ClientTest.vshost.exe | Bin 0 -> 11600 bytes 16 files changed, 822 insertions(+), 1 deletion(-) create mode 100644 ClientServerLib/ClientTest/ClientTest.Designer.cs create mode 100644 ClientServerLib/ClientTest/ClientTest.cs create mode 100644 ClientServerLib/ClientTest/ClientTest.csproj create mode 100644 ClientServerLib/ClientTest/ClientTest.resx create mode 100644 ClientServerLib/ClientTest/Program.cs create mode 100644 ClientServerLib/ClientTest/Properties/AssemblyInfo.cs create mode 100644 ClientServerLib/ClientTest/Properties/Resources.Designer.cs create mode 100644 ClientServerLib/ClientTest/Properties/Resources.resx create mode 100644 ClientServerLib/ClientTest/Properties/Settings.Designer.cs create mode 100644 ClientServerLib/ClientTest/Properties/Settings.settings create mode 100644 ClientServerLib/ClientTest/bin/Debug/ClientTest.exe create mode 100644 ClientServerLib/ClientTest/bin/Debug/ClientTest.vshost.exe diff --git a/.gitignore b/.gitignore index 9cd3ff64..3fb7c02c 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ Output/Songs /VocaluxeLib/bin /ClientServerLib/ClientServerLib/ClientServerLib.csproj.user /ClientServerLib/ClientServerLib/bin/Debug/ClientServerLib.dll +/ClientServerLib/ClientTest/bin/Debug/ClientServerLib.dll diff --git a/ClientServerLib/ClientServerLib.sln b/ClientServerLib/ClientServerLib.sln index 7ebf309a..396e5921 100644 --- a/ClientServerLib/ClientServerLib.sln +++ b/ClientServerLib/ClientServerLib.sln @@ -3,16 +3,38 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual C# Express 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientServerLib", "ClientServerLib\ClientServerLib.csproj", "{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientTest", "ClientTest\ClientTest.csproj", "{48A825C6-728F-4EBF-B98E-3D4665B3BC9E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|x86.ActiveCfg = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.Build.0 = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x86.ActiveCfg = Release|Any CPU + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Debug|Any CPU.ActiveCfg = Debug|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Debug|x86.ActiveCfg = Debug|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Debug|x86.Build.0 = Debug|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Release|Any CPU.ActiveCfg = Release|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Release|Mixed Platforms.Build.0 = Release|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Release|x86.ActiveCfg = Release|x86 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ClientServerLib/ClientServerLib/CClient.cs b/ClientServerLib/ClientServerLib/CClient.cs index 75de55f3..162b2955 100644 --- a/ClientServerLib/ClientServerLib/CClient.cs +++ b/ClientServerLib/ClientServerLib/CClient.cs @@ -24,6 +24,7 @@ namespace ClientServerLib private CConnection connection; private List requests; private List responses; + private OnConnectionChanged onConnectionChanged; public bool Connected { @@ -50,10 +51,12 @@ namespace ClientServerLib clientThread.Start(); } - public void Connect(string IP = "127.0.0.1", int Port = 3000) + public void Connect(string IP = "127.0.0.1", int Port = 3000, OnConnectionChanged OnConnectionChanged = null) { if (!doConnect) { + if (OnConnectionChanged != null) + onConnectionChanged = OnConnectionChanged; ip = IP; port = Port; doConnect = true; @@ -109,10 +112,12 @@ namespace ClientServerLib serverEndPoint = new IPEndPoint(IPAddress.Parse(ip), port); connection.TcpClient.Connect(serverEndPoint); connected = true; + RaiseOnConnectionChanged(); } catch { connected = false; + RaiseOnConnectionChanged(); for (int i = 0; i < 500; i++) { if (doConnect) @@ -135,6 +140,7 @@ namespace ClientServerLib } connected = false; + RaiseOnConnectionChanged(); } if (doConnect && connected) @@ -146,6 +152,7 @@ namespace ClientServerLib catch { connected = false; + RaiseOnConnectionChanged(); } } @@ -253,5 +260,17 @@ namespace ClientServerLib return response; } + + private void RaiseOnConnectionChanged() + { + if (onConnectionChanged == null) + return; + + try + { + onConnectionChanged(connected); + } + catch {} + } } } diff --git a/ClientServerLib/ClientServerLib/Structs.cs b/ClientServerLib/ClientServerLib/Structs.cs index fa22e2a2..d3f3c41f 100644 --- a/ClientServerLib/ClientServerLib/Structs.cs +++ b/ClientServerLib/ClientServerLib/Structs.cs @@ -7,6 +7,7 @@ namespace ClientServerLib { public delegate void ResponseCallback(byte[] Response); public delegate byte[] HandleRequest(int ConnectionID, byte[] Message); + public delegate void OnConnectionChanged(bool Connected); public struct SRequest { diff --git a/ClientServerLib/ClientTest/ClientTest.Designer.cs b/ClientServerLib/ClientTest/ClientTest.Designer.cs new file mode 100644 index 00000000..a0dc68e9 --- /dev/null +++ b/ClientServerLib/ClientTest/ClientTest.Designer.cs @@ -0,0 +1,204 @@ +namespace ClientTest +{ + partial class ClientTest + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.lbServerIP = new System.Windows.Forms.Label(); + this.lbPort = new System.Windows.Forms.Label(); + this.tbServerIP = new System.Windows.Forms.TextBox(); + this.tbPort = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.lbConnectionStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.lbConnectionStatusText = new System.Windows.Forms.ToolStripStatusLabel(); + this.btConnect = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tbDataSending = new System.Windows.Forms.TextBox(); + this.lbDateSending = new System.Windows.Forms.Label(); + this.lbDataReceiving = new System.Windows.Forms.Label(); + this.tbDataReceiving = new System.Windows.Forms.TextBox(); + this.statusStrip1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // lbServerIP + // + this.lbServerIP.AutoSize = true; + this.lbServerIP.Location = new System.Drawing.Point(3, 0); + this.lbServerIP.Name = "lbServerIP"; + this.lbServerIP.Size = new System.Drawing.Size(54, 13); + this.lbServerIP.TabIndex = 0; + this.lbServerIP.Text = "Server IP:"; + // + // lbPort + // + this.lbPort.AutoSize = true; + this.lbPort.Location = new System.Drawing.Point(3, 26); + this.lbPort.Name = "lbPort"; + this.lbPort.Size = new System.Drawing.Size(29, 13); + this.lbPort.TabIndex = 1; + this.lbPort.Text = "Port:"; + // + // tbServerIP + // + this.tbServerIP.Location = new System.Drawing.Point(85, -3); + this.tbServerIP.Name = "tbServerIP"; + this.tbServerIP.Size = new System.Drawing.Size(86, 20); + this.tbServerIP.TabIndex = 2; + this.tbServerIP.Text = "127.0.0.1"; + // + // tbPort + // + this.tbPort.Location = new System.Drawing.Point(85, 23); + this.tbPort.Name = "tbPort"; + this.tbPort.Size = new System.Drawing.Size(86, 20); + this.tbPort.TabIndex = 3; + this.tbPort.Text = "3000"; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.lbConnectionStatus, + this.lbConnectionStatusText}); + this.statusStrip1.Location = new System.Drawing.Point(0, 528); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(1008, 22); + this.statusStrip1.TabIndex = 4; + this.statusStrip1.Text = "statusStrip1"; + // + // lbConnectionStatus + // + this.lbConnectionStatus.Name = "lbConnectionStatus"; + this.lbConnectionStatus.Size = new System.Drawing.Size(107, 17); + this.lbConnectionStatus.Text = "Connection Status:"; + // + // lbConnectionStatusText + // + this.lbConnectionStatusText.Name = "lbConnectionStatusText"; + this.lbConnectionStatusText.Size = new System.Drawing.Size(79, 17); + this.lbConnectionStatusText.Text = "Disconnected"; + // + // btConnect + // + this.btConnect.Location = new System.Drawing.Point(6, 49); + this.btConnect.Name = "btConnect"; + this.btConnect.Size = new System.Drawing.Size(165, 23); + this.btConnect.TabIndex = 5; + this.btConnect.Text = "Connect"; + this.btConnect.UseVisualStyleBackColor = true; + this.btConnect.Click += new System.EventHandler(this.btConnect_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.lbServerIP); + this.panel1.Controls.Add(this.btConnect); + this.panel1.Controls.Add(this.tbServerIP); + this.panel1.Controls.Add(this.tbPort); + this.panel1.Controls.Add(this.lbPort); + this.panel1.Location = new System.Drawing.Point(822, 12); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(174, 513); + this.panel1.TabIndex = 6; + // + // tbDataSending + // + this.tbDataSending.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbDataSending.Location = new System.Drawing.Point(12, 25); + this.tbDataSending.Multiline = true; + this.tbDataSending.Name = "tbDataSending"; + this.tbDataSending.Size = new System.Drawing.Size(804, 120); + this.tbDataSending.TabIndex = 7; + // + // lbDateSending + // + this.lbDateSending.AutoSize = true; + this.lbDateSending.Location = new System.Drawing.Point(12, 9); + this.lbDateSending.Name = "lbDateSending"; + this.lbDateSending.Size = new System.Drawing.Size(75, 13); + this.lbDateSending.TabIndex = 6; + this.lbDateSending.Text = "Data Sending:"; + // + // lbDataReceiving + // + this.lbDataReceiving.AutoSize = true; + this.lbDataReceiving.Location = new System.Drawing.Point(12, 197); + this.lbDataReceiving.Name = "lbDataReceiving"; + this.lbDataReceiving.Size = new System.Drawing.Size(84, 13); + this.lbDataReceiving.TabIndex = 8; + this.lbDataReceiving.Text = "Data Receiving:"; + // + // tbDataReceiving + // + this.tbDataReceiving.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbDataReceiving.Location = new System.Drawing.Point(12, 213); + this.tbDataReceiving.Multiline = true; + this.tbDataReceiving.Name = "tbDataReceiving"; + this.tbDataReceiving.Size = new System.Drawing.Size(804, 120); + this.tbDataReceiving.TabIndex = 9; + // + // ClientTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1008, 550); + this.Controls.Add(this.tbDataReceiving); + this.Controls.Add(this.lbDataReceiving); + this.Controls.Add(this.lbDateSending); + this.Controls.Add(this.tbDataSending); + this.Controls.Add(this.panel1); + this.Controls.Add(this.statusStrip1); + this.Name = "ClientTest"; + this.Text = "ClientTest"; + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbServerIP; + private System.Windows.Forms.Label lbPort; + private System.Windows.Forms.TextBox tbServerIP; + private System.Windows.Forms.TextBox tbPort; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel lbConnectionStatus; + private System.Windows.Forms.ToolStripStatusLabel lbConnectionStatusText; + private System.Windows.Forms.Button btConnect; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TextBox tbDataSending; + private System.Windows.Forms.Label lbDateSending; + private System.Windows.Forms.Label lbDataReceiving; + private System.Windows.Forms.TextBox tbDataReceiving; + } +} + diff --git a/ClientServerLib/ClientTest/ClientTest.cs b/ClientServerLib/ClientTest/ClientTest.cs new file mode 100644 index 00000000..4fc0f9ba --- /dev/null +++ b/ClientServerLib/ClientTest/ClientTest.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Net; +using System.Text; +using System.Windows.Forms; + +using ClientServerLib; + +namespace ClientTest +{ + public partial class ClientTest : Form + { + CClient client; + + public ClientTest() + { + client = new CClient(); + + InitializeComponent(); + } + + protected override void OnClosing(CancelEventArgs e) + { + client.Close(); + base.OnClosing(e); + } + + private void btConnect_Click(object sender, EventArgs e) + { + if (!client.Connected) + Connect(); + else + Disconnect(); + } + + private void Connect() + { + int port = 3000; + if (!int.TryParse(tbPort.Text, out port)) + { + MessageBox.Show("Error parsing port number", "Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + IPAddress ip; + if (!IPAddress.TryParse(tbServerIP.Text, out ip)) + { + MessageBox.Show("Error parsing ip address", "IP Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + lbConnectionStatusText.Text = "Connecting..."; + client.Connect(tbServerIP.Text, port, OnConnectionChanged); + } + + private void Disconnect() + { + client.Disconnect(); + } + + private void OnConnectionChanged(bool Connected) + { + if (Connected) + lbConnectionStatusText.Text = "Connected"; + else + { + client.Disconnect(); + lbConnectionStatusText.Text = "Disconnected"; + } + } + } +} diff --git a/ClientServerLib/ClientTest/ClientTest.csproj b/ClientServerLib/ClientTest/ClientTest.csproj new file mode 100644 index 00000000..a86fe023 --- /dev/null +++ b/ClientServerLib/ClientTest/ClientTest.csproj @@ -0,0 +1,93 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {48A825C6-728F-4EBF-B98E-3D4665B3BC9E} + WinExe + Properties + ClientTest + ClientTest + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Form + + + ClientTest.cs + + + + + ClientTest.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3} + ClientServerLib + + + + + \ No newline at end of file diff --git a/ClientServerLib/ClientTest/ClientTest.resx b/ClientServerLib/ClientTest/ClientTest.resx new file mode 100644 index 00000000..174ebc72 --- /dev/null +++ b/ClientServerLib/ClientTest/ClientTest.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/ClientServerLib/ClientTest/Program.cs b/ClientServerLib/ClientTest/Program.cs new file mode 100644 index 00000000..f93a6318 --- /dev/null +++ b/ClientServerLib/ClientTest/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace ClientTest +{ + static class Program + { + /// + /// Der Haupteinstiegspunkt für die Anwendung. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new ClientTest()); + } + } +} diff --git a/ClientServerLib/ClientTest/Properties/AssemblyInfo.cs b/ClientServerLib/ClientTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..d5de0107 --- /dev/null +++ b/ClientServerLib/ClientTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("ClientTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ClientTest")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("0bde3ff1-7eb7-4b60-9813-32ff42c0ceff")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ClientServerLib/ClientTest/Properties/Resources.Designer.cs b/ClientServerLib/ClientTest/Properties/Resources.Designer.cs new file mode 100644 index 00000000..af9fcd25 --- /dev/null +++ b/ClientServerLib/ClientTest/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.18034 +// +// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn +// der Code neu generiert wird. +// +//------------------------------------------------------------------------------ + +namespace ClientTest.Properties +{ + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse + // über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ClientTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/ClientServerLib/ClientTest/Properties/Resources.resx b/ClientServerLib/ClientTest/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/ClientServerLib/ClientTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ClientServerLib/ClientTest/Properties/Settings.Designer.cs b/ClientServerLib/ClientTest/Properties/Settings.Designer.cs new file mode 100644 index 00000000..19867065 --- /dev/null +++ b/ClientServerLib/ClientTest/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18034 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ClientTest.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/ClientServerLib/ClientTest/Properties/Settings.settings b/ClientServerLib/ClientTest/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/ClientServerLib/ClientTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ClientServerLib/ClientTest/bin/Debug/ClientTest.exe b/ClientServerLib/ClientTest/bin/Debug/ClientTest.exe new file mode 100644 index 0000000000000000000000000000000000000000..f1ed2a579ff0f03394e92b42dfb729ab5c45e937 GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/ClientServerLib/ClientTest/bin/Debug/ClientTest.vshost.exe b/ClientServerLib/ClientTest/bin/Debug/ClientTest.vshost.exe new file mode 100644 index 0000000000000000000000000000000000000000..bb84a51ac4f20534146c09f2fd9c928d15a903b2 GIT binary patch literal 11600 zcmeG?2~<)?tG75|5OPOMcC{DsnWb(K|p-9Gz zCYX{WA(Jm;dIfQqiJ};SrLL}G(n&hl8zFy;j>apOj_;bS1<^27Oc^0Hz(7W(Czb%1 z@VUW90w!d%4!)s8@lWO`4L-o%@Fz33`3PxI|9bMyD%lrO3DBh`b_0^65V}%-gn|b^ zWm*RtcF<41tL^XP%x>1H-pWw-?KO@iBWB8={z?S^v{7pXzI!Jo%+8WXB|Jbhzz%$;+6FHiiU_~N3I z3EN^9UtHuj{7z%|8vGH<%)(m1Ea7^jMXH#Y>ya2$DiaMPF|c+I&NvSYVbqF9*~#r#ILj8dWjm251tb7C6J%*T7omHQ z|3QZ`M<(G55b{zd>0OBcT-q z$5D_+!Bh&aq+kUFn<&Vjy~Gre83lc5nD5M>aGT=)?fZgOM>nV`Kqv zI0bDf=!~2J||60WgZ0+&DGHhBHk2136`;HfS!lVrq~L;Qp?LLw4#2#K5zlOj)1BCy1d77#r{JpDO<77O@Xp{xhn!4xZ$h!p@= zFfDSIN{Pg1K}r~3)_Zst+KZ6#Bz!U1wTDViV=OmGAajRFq+hp^({qI>UpIiLVv=~h zxay+kDH5kh_;K;yXzG;G*Tj7I0^&~_{e-b1Ng|izo-6pOSGO>vq9h3^M-Ep;2n2i? z;VA;Ob9u6_h6EBx&>#pUI*0gkg>gyTxL$JaT8kGU;HGf+ao-Tzcp`=5x@Rq2jC5KA zDL81CbnCa%R49SU_|be|v6omoM|<(PaYE7-c~ay>L?^|?aX&MN4jh;n*m;M|z$BDt zLV?wpRH>I1yLLe*EkY6~5>Aj35>FW2!};IZ6RZg`l4U+2WpPr3Jg{aVFJ1yBKdala z!{Q|bH-_8;-f}`H`;N<(`ErFZ0s_H?nELq^^AiFst^h{IAPxchk}HJW2r40D)L?1| zN5+-NKyKu|BH5O9=>_$oO%{WM1RNkt$|LX>+U#yGW4SL{W#Dq<^-?pWTs_=s z+sMi))7<${{lWc@(;pS&e4xt(nf|K_4fiC?yA3+_%vvY*l!4@4iv}=BM|c$3*(8Ejv=a+B_=Ss*JEQXuIqpixQ3a_4(W> zyEKm#xtQrM)b=Fwn2Ghv>;fV#EMt&fQn_Nx)Omd`sf+@qw7IY%8d=~wU}z94&^xT# z?O1hMy$gBFV<=2Rx4X%UFBOAX2ZDn_3e*V(5c0klQtL7p%59=S80yz;986D8eMaINL%0wc8G%|*e$MEHmK74Q% z!Aa2qJ`Z*(ODar2$dFuS7_I+z60R6Fg7-`wLHR_mTT!wUQ^u&61Y`_zfv7uESG-PI zL=b$z5K9F^02Rvd;_$Xby>8#V-GB3vXN;}hekVw2b}%EC!sUQGG$K1h+L_tfM2e!P zOCtHUjw8EKEOAUULMMT4SGq-(nO(Kd^R74+p{XEA@0kR39#JP2L9k*3WE=-K98<(} zqe}k)-;w}E#jg-2r+wZ^?F0lS_7$G&N8TMKx*>Foia|&WS+)ZhjyMosg(Ghi3MD_V zlt8Ha0ra7)2BA8})Ao*tk&JOg@{U+nBp*Xj>4k4odB9b z6pKVuFB2+W3WHWIV5QK`MKb6of?7waV3?3D4|tM6FFxSozD0@ZgTuNz{_IdRDFbAO z)M2bA&`X3r0!GVV7PvbAj0da~>bA%RB0vJogpW-A5a@S}5mS7nfE2jYc(OeJxZnXV z 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