Zum Inhalt springen

Gateway_man

Mitglieder
  • Gesamte Inhalte

    1167
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Gateway_man

  1. hi, danke für den Tipp aber das mit dem asynchronen invoken war nur ein test und wurde auch bereits verworfen da es nicht notwendig war. Ich überleg mir lieber einen Weg wie ich meinem Chef am besten beibringe das es so nicht funktioniert wie er will. So wie ich das verstanden habe will er eine klasse die eine Funktion beinhaltet welcher er funktionen als parameter übergeben kann damit diese dann in einem thread abgearbeitet werden. (ohne delegates) Eventuell werd ich mich nochmal im reflection namespace umschaun. Trotzdem danke, lg Gateway EDIT: @Realgun: Nein er will alles auf dem Framework 2.5 haben (warum auch immer). Ich dachte das Threadpools bereits seit dem 3.5 implementiert wurden.
  2. Hi leute, es geht um Threading. Mein Chef hätte gerne eine Klasse wo er Funktionen an Thread übergeben kann die diese dann Ausführen, um den ganzen schmuss nicht immer und immer wieder schreiben zu müssen. Ich habe daraufhin ein Beispiel geschrieben von dem ich eigentlich dachte das es funktioniert. Allerdings ist das Form das die Klasse aufruft solange nicht erreichbar wie der Thread läuft (was ja nicht im Sinne der Sache ist). Hier mal die Klasse: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace m_Thread { public class mThread { private Thread _mthread; private IntPtr invokecontrol = IntPtr.Zero; private CallParameterlessFunction function = null; public event EventHandler<EventArgs> OperationFinished = null; public mThread(IntPtr invokecontrol, CallParameterlessFunction function) { this.invokecontrol = invokecontrol; this.function = function; _mthread = new Thread(new ThreadStart(Execute)); } public void Start() { if (invokecontrol != IntPtr.Zero && function != null) _mthread.Start(); } private void Execute() { Control invoker = Control.FromHandle(invokecontrol); //invoker.Invoke(function); IAsyncResult result = invoker.BeginInvoke(function); while (!result.IsCompleted) { Application.DoEvents(); } invoker.EndInvoke(result); OperationFinished(this, EventArgs.Empty); } public void Abort() { if (_mthread != null && _mthread.IsAlive) _mthread.Abort(); } } public delegate void CallParameterlessFunction(); } Hier der beispielaufruf: 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; namespace m_Thread { public partial class Form1 : Form { private mThread thread = null; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CallParameterlessFunction functionparameter = new CallParameterlessFunction(ThreadFunction); thread = new mThread(richTextBox1.Handle, functionparameter); thread.OperationFinished += new EventHandler<EventArgs>(ThreadFinished); thread.Start(); } private void ThreadFunction() { for (int i = 0; i <= 100000; i++) { richTextBox1.Text += i.ToString() + Environment.NewLine; } } private void ThreadFinished(object sender, EventArgs e) { MessageBox.Show("Thread fertig"); } private void button2_Click(object sender, EventArgs e) { if (thread != null) thread.Abort(); } } } Sieht einer von euch den Fehler? lg Gateway Edit: Ich stand ein wenig auf der Leitung. Das delegate ist hier das Problem. Der milisekündliche Aufruf blockiert scheinbar den Formeigenen Thread. Hat jemand ne alternative. Also es geht quasi darum einem Thread in einer Dll eine beliebige Funktion zu übergeben.
  3. Hi, man könnte dir bestimmt Helfen. Aber ohne das entsprechende snippet, wird man schwer etwas verbessern können. Wenn du dein snippet für den Datenempfang mal reinstellst kann man sich um eine Problemlösung bemühen. lg Gateway
  4. Der Lüfter wiegt fast n Kilo deswegen will ich da kein spielraum haben . Einem Kolegen von mir hats die Halterung rausgerissen, aber da war der Kühler 1,4 kg schwer. So seh ich das auch nur die unterlegschreibe hält nicht. Ich hab mal ein Bild von der Scheibe gemacht. Siehe Anhang. Diese drei seitlichen öffnungen sind bei meinem Board scheinbar zu groß. Ich habe versucht die Scheibe an dem hacken für die klammern einzuspannen, also quasi die halternase in das mittlere Loch der unterlegscheibe zu schieben. Jedoch ist die halternase viel zu klein und die unterlegscheibe scheint nicht zu halten. Daraufhin hab ich beide unterlegscheibe vorab an dem kühler befestigt und dann gemerkt das die Abstände für den sokel einfach viel zu groß sind. Ach ich weiß auch nichtmehr was ich machen soll . Hätt ich mir doch lieber die Wasserkühlung gekauft, eventuell hätte die weniger Probleme verursacht. Jetzt hab ich das teil und kanns nochnichtmal zurückgeben, weils schon offen ist . lg Gateway
  5. Hi, danke aber das hab ich schon gelesen, hat leider nicht viel geholfen. Ich hab auch das gefunden. Es sind zwei nennen wir es bausätzte dabei. Einmal für intel einmal für amd. Die Anleitung von oben für amd ist leider auch nicht praktikabel bei mir, da die sockelbefästigung leider keine gewinde für die Befästigung der unterlegscheiben hat. Ist alles etwas seltsam. lg Gateway
  6. Hi leute, Ich hab mir heute von Arctic Cooling den Freezer 13 gekauft. Ich habe ein AM3 Sockel und laut Anleitung für AMD Sockets müste auf den Seiten drei wiederhacken sein, in dieman die Befästigungsscheibe einhängt. Desweiteren soll da auch jeweils ein Schraubengewinde vorhanden sein mit dem man die Unterlegschreibe fixiert. Beides scheint bei mir nicht der Fall zu sein. Ich habe mal zwei Bilder gemacht. Laut Verpackung sollte der Kühler mit AM3 Sockel kompatibel sein. Ich bin gerade etwas verzweifelt. Ich bin mir auch nicht ganz sicher ob ich den alten boxed lüfter nochmal draufsetzten kann, da ich nicht weiß ob ich da neu kupferpaste auftragen muss. lg Gateway
  7. Hi, nur mal ein gut gemeinter Ratschlag. Das mit dem dynamischen erstellen würde ich erstmal nicht so machen, da du ja scheinbar noch nicht allzuviel Erfahrung gesammelt hast und es momentan doch sehr unsauber aussieht. Ich könnte dir zwar eine Lösung anbieten, allerdings halte ich diese selbst für extrem unsauber. Warum machst du es nicht einfach so, das du für das anzeigen, bearbeiten,neuanlegen seperate masken im designer erstellst. Diese dann per Visible Property versteckst und zu rechten Zeit wieder sichtbar machst. Ich denke damit wärst du besser bedient. Denn wenn du es dynamisch machen willst dann würde ich dir auch das schreiben einer Steuerung wie von HJST1979 vorgeschlagen empfehlen. Aber ich werd jetzt schnell eine Lösung zeigen, die ich wie gesagt selbst nicht so super finde das es eben jedesmal auf neue einen gewissen Rechenaufwand benötigt. Vorraussetzung hierfür ist, das du den Code generierten Controls einen namen zugewiesen hast. private void SQLExecute(){ //textboxes local erfassen TextBox textbox1 = (TextBox)this.Controls["textbox1"]; TextBox textbox2 = (TextBox)this.Controls["textbox2"]; TextBox textbox3 = (TextBox)this.Controls["textbox3"]; //this.Controls[ControlName hier als string übergeben"] //statt this.Controls must du unter umständen den namen des Containers, wecher //die Textboxen beinhaltet schreiben. Zum Beispiel Tabpage1.Controls (wenn die //Tabpage1 die Textboxen beinhaltet) string dataSource = "db.db"; SQLiteConnection connection = new SQLiteConnection(); connection.ConnectionString = "Data Source=" + dataSource; connection.Open(); SQLiteCommand command = new SQLiteCommand(connection); //Einfügen eines Test-Datensatzes. command.CommandText = "INSERT INTO TB_Halter (Nachname, Vorname, Titel) VALUES ('" + textbox1.Text + "', '" + textbox2.Text + "', '" + textbox3.Text + "')"; command.ExecuteNonQuery(); //Freigave der Ressourcen. command.Dispose(); connection.Close(); connection.Dispose(); MessageBox.Show("Erfolgreich!"); this.Close(); } lg Gateway
  8. Hi, solltest du bereits Kenntnisse mit WinSockets in Delphi haben, dann empfehle ich dir ein Protokollstudium . Neuste Version des SFTP Protokolls Da wird dir eigentlich alles erklärt. Was der Server als Escape Sequenz erwartet, welche Befehle er kennt, respektive wie er diese (gegebenenfalls mit Abhängigkeiten) sendet. Lesen, verstehen und dann umsetzten :floet:. lg Gateway
  9. Sieht sehr interessant aus (eben exakt wie die Toolbox von VS). Allerdings ist mir das schon wieder fast zu overdressed. Das mit dem verschieben der einzelnen Panel brauch ich gar nicht . Es ging mir primär um das dynamische auf und zuklappen der Panels, da ich momentan was schreibe das für kleine Geräte ausgelegt ist. Das heißt sehr kleine Bildschirme . Ich bin vollauf Zufrieden mit der aktuellen version. Trotzdem danke. lg Gateway
  10. private void AddTapDynamicToTabControl1() { System.Windows.Forms.TabPage npage = new TabPage(); npage.Text = "new page"; //andere Controls der Tappage adden Button btn1 = new Button(); btn1.Location = new Point(10, 10); btn1.Text = "button1"; //du must das entsprechende Event registrieren (sprich einer Funktion zuweisen). btn1.Click += new EventHandler(btn1_Click); npage.Controls.Add(btn1); //Page dem jeweiligen TabControl hinzufügen tabControl1.TabPages.Add(npage); } private void btn1_Click(object sender, EventArgs e) { //hier der code für button click event Button curr = (Button)sender; MessageBox.Show("button=" + curr.Text); }
  11. Hi, du kannst es wie folgt machen. private void AddTapDynamicToTabControl1() { System.Windows.Forms.TabPage npage = new TabPage(); npage.Text = "new page"; //andere Controls der Tappage adden Button btn1 = new Button(); btn1.Location = new Point(10, 10); btn1.Text = "button1"; npage.Controls.Add(btn1); //Page dem jeweiligen TabControl hinzufügen tabControl1.TabPages.Add(npage); } lg Gateway
  12. Hi, wollte nur bescheid sagen das es sich bereits erledigt hat. Ich hatte noch eine Funktion die bei Verlassen des Controls alle offenen Panels schließt. Scheinbar war dort ein Fehler, den ich leider nicht genauer nachvollziehen kann/konnte, da es ja bei Top Docking nicht eintratt. lg Gateway
  13. Guten Abend, leider muss ich nochmals stören :old. Ich habe in dem Projekt noch ein Problem. Wie bereits gesagt habe ich es um eine Mouse_Hover Funktionalität erweitert. Das heißt, wenn man den Cursor der Maus über einer der Registerkarten schiebt wird das entsprechende Panel automatisch aufgeklappt. Es sollte natürlich auch aufgeklappt bleiben solange der Cursor sich entweder über der entsprechenden Registerkarte aufhält oder innerhalb des entsprechenden Panels. Das klappt an sich wunderbar, solange ich das ToolBoxHost Control (welches für die Steuerung zuständig ist) entweder Links oder Oben ans ParentControl gedockt habe. Docke ich es Rechts oder Unten ans ParentControl gibt es massive Probleme. Damit meine ich egal wie schnell ich versuche auf das Panel zu kommen es klappt wieder zu. Nun kurz die entsprechenden CodeSnippets. Wenn ein Item dem ToolboxHostControl hinzugefügt wird, wird folgendes Event ausgelöst: private void ContainerAdded(object sender, ToolBoxContainerAdded e) { if (base.Parent != null) { if (e.Item.Container != null) { e.Item.Container.Visible = false; Parent.Controls.Add(e.Item.Container); //e.Item.Container ist das Panel. Hier werden zwei Events registriert e.Item.Container.MouseLeave += new EventHandler(Pnl_MouseLeave); e.Item.Container.MouseEnter += new EventHandler(Pnl_MouseEnter); } } } Um erkennen zu können ob die Maus innerhalb des Panel ist oder nicht werden diese zwei Events benötigt. Der Inhalt der Events sieht wie folgt aus: private void Pnl_MouseEnter(object sender, EventArgs e){ //id ist ein globaler integer wert der zur identifikation benötigt wird. (Jeder ToolBoxContainer hat eine UniqueID) if (mode == ElapseMode.OnHover && id != 0) { ToolBoxPanel p = (ToolBoxPanel)sender; List<ToolBoxContainer> elements = (from current in items where current.ID == id && current.ViewState == ContainerState.Elapsed && current.Container == p select current).ToList(); if (elements.Count > 0) { //panel_enter wird ein gloaber boolean der im Mouse_Move Event abgefragt wird (Das poste ich nach den beiden Events) panel_enter = true; } } } private void Pnl_MouseLeave(object sender, EventArgs e) { if (mode == ElapseMode.OnHover && id != 0) { ToolBoxPanel p = (ToolBoxPanel)sender; Rectangle rect = p.RectangleToScreen(p.ClientRectangle); if (MousePosition.X >= rect.X && MousePosition.X <= (rect.X + rect.Width) && MousePosition.Y >= rect.Y && MousePosition.Y <= (rect.Y + rect.Height)) { return; } List<ToolBoxContainer> elements = (from current in items where current.ID == id && current.ViewState == ContainerState.Elapsed && current.Container == p select current).ToList(); if (elements.Count > 0){ Collapse(elements[0].Container); elements[0].Container.Visible = false; elements[0].ViewState = ContainerState.Collapsed; panel_enter = false; id = 0; } } } In dem MouseLeave soll das aufgeklappte Panel wieder geschlossen werden, da die Mouse ja effektiv außerhalb des Panels bewegt wurde. So nun zu dem Mouse_Move Event des ToolBoxHost Controls. Ist etwas größer und unter umständen etwas schwer nachzuvollziehen. Ich werd mal versuchen das notwendigste zu Kommentieren. private void ToolBoxHost_MouseMove(object sender, MouseEventArgs e) { //Der Obere Teil ist nicht relevant hier wird nur der entsprechenden Border für die Registerkarten neugezeichnet if (mode == ElapseMode.OnClick) { foreach (ToolBoxContainer item in items) { if (e.X >= item.Location.X && e.X <= (item.Location.X + item.Size.Width) && e.Y >= item.Location.Y && e.Y <= (item.Location.Y + item.Size.Height)) { item.LableState = HeaderState.Hover; this.Update() ; } else { item.LableState = HeaderState.None; this.Update(); } } } else { foreach (ToolBoxContainer item in items) { if (e.X >= item.Location.X && e.X <= (item.Location.X + item.Size.Width) && e.Y >= item.Location.Y && e.Y <= (item.Location.Y + item.Size.Height)) { item.LableState = HeaderState.Hover; //this.Update(); this.Refresh(); } else { item.LableState = HeaderState.None; this.Refresh(); //this.Update(); } } //Hier gehts los. Wenn die id ungleich null ist, sprich wenn eine Registerkarte //Elapsed (ausgefahren) ist und panel_enter false ist gibts nochmal 100 //Millisekunden Zeit um ins Panel zu wechseln (klappt soweit wenn das Docking //left oder top ist). if (id != 0 && !panel_enter) System.Threading.Thread.Sleep(100); //Es wird nocheinmal geprüft ob panel_enter nun true ist und id ungleich 0. //Wenn ja dann gehts raus aus der Funktion. if (id != 0 && panel_enter) return; //Der Rest ist eigentlich wieder irrelevant da hier wieder nur die Locations und //die Sizes der Panels anhand des Docking gesetzt werden. //Nebenbei werden noch //die überflüssigen Panels geschlossen (also die die offen sind aber nicht //fokusiert. if (id > 0) { List<ToolBoxContainer> currentitem = items.Where(Target => Target.ID == id).ToList(); ToolBoxContainer cont = currentitem[0]; if (e.X >= cont.Location.X && e.X <= (cont.Location.X + cont.Size.Width) && e.Y >= cont.Location.Y && e.Y <= (cont.Location.Y + cont.Size.Height)) { return; } else { Collapse(cont.Container); cont.Container.Visible = false; cont.ViewState = ContainerState.Collapsed; id = 0; panel_enter = false; ToolBoxContainer ncont = null; foreach (ToolBoxContainer item in items) { if (e.X >= item.Location.X && e.X <= (item.Location.X + item.Size.Width) && e.Y >= item.Location.Y && e.Y <= (item.Location.Y + item.Size.Height) && item.ViewState != ContainerState.Elapsed) { ncont = item; break; } } if (ncont != null) { switch (base.Dock) { case DockStyle.Top: if (Parent != null) { ncont.Container.Height = 0; ncont.Container.Width = Parent.ClientRectangle.Width; ncont.Container.Location = new Point(this.Location.X, this.Location.Y + this.Height); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Right: if (Parent != null) { ncont.Container.Height = Parent.ClientRectangle.Height; ncont.Container.Width = 0; ncont.Container.Location = new Point(this.Location.X, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Left: if (Parent != null) { ncont.Container.Height = Parent.ClientRectangle.Height; ncont.Container.Width = 0; ncont.Container.Location = new Point(this.Location.X + this.Width, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Bottom: if (Parent != null) { ncont.Container.Height = 0; ncont.Container.Width = Parent.ClientRectangle.Width; ncont.Container.Location = new Point(this.Location.X, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; } id = ncont.ID; ncont.ViewState = ContainerState.Elapsed; } } } else { ToolBoxContainer ncont = null; foreach (ToolBoxContainer item in items) { if (e.X >= item.Location.X && e.X <= (item.Location.X + item.Size.Width) && e.Y >= item.Location.Y && e.Y <= (item.Location.Y + item.Size.Height) && item.ViewState != ContainerState.Elapsed ) { ncont = item; break; } } if (ncont != null) { switch (base.Dock) { case DockStyle.Top: if (Parent != null) { ncont.Container.Height = 0; ncont.Container.Width = Parent.ClientRectangle.Width; ncont.Container.Location = new Point(this.Location.X, this.Location.Y + this.Height); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Right: if (Parent != null) { ncont.Container.Height = Parent.ClientRectangle.Height; ncont.Container.Width = 0; ncont.Container.Location = new Point(this.Location.X, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Left: if (Parent != null) { ncont.Container.Height = Parent.ClientRectangle.Height; ncont.Container.Width = 0; ncont.Container.Location = new Point(this.Location.X + this.Width, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; case DockStyle.Bottom: if (Parent != null) { ncont.Container.Height = 0; ncont.Container.Width = Parent.ClientRectangle.Width; ncont.Container.Location = new Point(this.Location.X, this.Location.Y); ncont.Container.Visible = true; Elapse(ncont.Container); } break; } id = ncont.ID; ncont.ViewState = ContainerState.Elapsed; } } } } Ich habe das Problem schon einigermaßen eingrenzen können. Wenn das ToolBoxHost Control Rechts oder Unten gedockt wurde, wird das Event Pnl_MouseEnter nicht ausgeführt. Warum das nicht so ist verstehe ich nicht, da ich effektiv bei jedem Docking den fast identischen Code ausführe (unterscheidet sich nur in den Location Points und der Size). Wenn einer von euch weiß was ich falsch mache, dann bitte ich inständig um Hilfestellung . lg Gateway
  14. hi, danke Gooose. Leider ist das ne wpf Library und das ist für mich nicht brauchbar da ich mich nur bedingt mit wpf und xaml auskenne. Leider ist da auch nur ein Beispiel dabei wie man es in einer wpf Application einbindet und nicht wie man es in einer Windows Form Application einbindet. Zudem bin ich eher an einer eigenen Lösung interessiert da ich da lizenztechnisch auf der sicheren Seite bin. Ich hab jetzt sowieso schon so viel Zeit reinivestiert und es gefällt mir schon außerordentlich gut (vor allem da recht simpel in der Benutzung). Es scheint auch so als wäre mein Problem bereits gelöst da das flimmern (zumindest auf meiner Kiste) nichtmehr auftritt. Fragt mich nicht wie, denn ich weiß es nicht . Nachdem ich den größten Teil des codes umgeschrieben und erweitert hatte, diesen dann testete, viel mir auf das es nicht mehr present war. Muss es nurnoch auf anderen Rechner testen um sicher sein zu können.... (habs gerade bei nem Kollegen getestet und das flimmern tritt nicht auf. Hat sich also erledigt) Trotzdem danke an alle lg Gateway
  15. Nein leider nicht. Der Effekt ist immernoch present. Ich habe mich nicht alzulange damit aufhalten wollen (da es im nachhinein immernoch bearbeitbar wäre). Nun hab ich es so erweitert das es an allen Seiten andockbar ist und das man zwischen zwei modi unterscheidet. Entweder werden die Panel durch klicken aufgeklappt oder durch das bewegen der Maus über den entsprechenden Reiter. Beim Docking ist mir aufgefallen das das Flimmern nur sichtbar ist wenn ich das HostControl rechts oder unten andocken lasse. Ich vermute daher das es daran liegt das ich rechts und unten die location und die größe in der while schleife verändere. Links und oben muss ich jeweils nur die Witdh und die Height vergrößern/verkleinern. Sollte also noch jemand einen geistesblitz haben wäre ich natürlich hoch erfreut . lg Gateway
  16. Hi, ich wollte mir schnell mal eine Art Toolbox wie in Visual Studio schreiben, da ich diese für Suchfilter benötige und das Panel sowenig Platz wie möglich auf dem Form einnehmen soll. Jetzt zeigt sich beim aufklappen respektive zuklappen des Panels dieser "flimmer" Effekt, welcher äußerst unschön ist. Ich habe bereits versucht das Panel auf DoubleBuffered zu setzten. Jedoch sieht dann das aufklappen unschön aus. Ist ziemlich schwer zu erklären :beagolisc. Bevor ich hier jetzt den Code poste werde ich das Projekt mal als zip anhängen um diesen Beitrag nicht unnötigerweise in die Länge zu ziehen. In der aktuellen Konfiguration ist das Flimmern sichtbar. Wenn ihr es also debuggt und rechts auf einen der Reiter klickt wird es expandiert und das flimmern ist erkennbar. Bevor ich daran weiterarbeite würde ich das unschöne Problem gerne beseitigen, allerdings fällt mir gerade keine Möglichkeit mehr ein. Wenn jemand einen Tipp hätte wäre das klasse . lg Gateway TestApp.zip
  17. Also bei mir klappt das hervorrangend wenn ich etwas adrenalinlastiges mache, da vergess ich alles um mich herrum. Sofern du sportlich fit bist, kannst ja beispielsweise klettern gehn oder vergleichbares. Paragliding ist auch was feines. Sind natürlich extrem Zeitlastige Dinge. Was bei mir auch super klappt ist Golfen, allerdings muss das einem liegen. Kenne genug die das stink langweilig finden. lg Gateway
  18. Hi, das stichwort heißt SelectionFont. In deinem Kursivbutton sieht das wie folgt aus: Dim font as System.Drawing.Font = Richtextboxvariablenname.SelectionFont Richtextboxvariablenname.SelectionFont = new System.Drawing.Font(font.FontFamily, font.Size,font.Style ^ FontStyle.Italic, GraphicsUnit.Point) Ich weiß jetzt auf die schnelle nicht wie der Xor Operator in VB.net geht. Must du mal googlen und ^ gegebenenfalls dahingehend ändern. lg Gateway PS: Kleiner Warnhinweis. Wenn der selektierte Text verschiedenene Schritarten, Größen oder Styles hat, dann liefert SelectionFont Null oder in deinem Fall Nothing zurück. Also würd ich mich hier noch um ein entsprechendes Handling kümmern.
  19. Hi, Die Interop Klassen sind einfacher ausgedrückt mächtige Interfaces die es dir gestatten Word/Excel/Powerpoint etc. über eben diese Interfaces zu steuern. Du kannst "fast" alle funktionalitäten der entsprechenden Programme über die Interops nutzen (vorrausgesetzt das Programm ist auf dem Rechner installiert). Das mit dem Marshal.Release, welches oben genannt wurde, sollte eigentlich Ole Objekte aus dem Speicher entfernen beziehungsweise ein Free() für die entsprechende Variable ausführen. Das braucht man, da das schließen per QUIT() Funktion, welche in der Interop.Application Klasse definiert ist, nicht immer reibungslos vonstatten geht. Allerdings klappt das mit dem Release auch nicht immer. Ich habe mir daher zwei kleine Funktionen geschrieben die das schließen erzwingen (sollte es mal nicht über QUIT() funktionieren). Der Code ist allerdings C#. Du kannst es ja durch den Converter jagen. Nutzung: Wenn Word sich nicht sauber schließt und der Prozess immernoch offen ist, kannst du den Prozess eindeutig über das MainHandle Identifizieren und diesen schließen. public class Util { [DllImport("user32")] static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); public static int GetProcessIDByHandle(IntPtr hWnd) { int pid = 0; GetWindowThreadProcessId(hWnd, out pid); return pid; } public static void ForceProcessExit(int processID) { foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcesses()) { if (item.Id == processID) { try { item.Kill(); if (!item.HasExited) item.WaitForExit(8000); break; } catch { break; } } } } } Ich habe jetzt leider kein Wordbeispiel zur hand. Aber in PowerPoint sieht das so aus: public void Beispiel(){ //Defintion einer neuen PowerPoint Instanz Microsoft.Office.Interop.PowerPoint.Application oApp = new Microsoft.Office.Interop.PowerPoint.Application(); //Nach der Instanzerstellung hole ich mir direkt die ProzessID int ipid = Util.GetProcessIDByHandle(new IntPtr(oApp.HWND)); //Diverse Arbeiten mit der Powerpoint Instanz //Schließen der Instanz oApp.Quit(); oApp = null; //Zuguter letzt wird versucht den Prozess sofern noch vorhanden, zu killen Util.ForceProcessExit(ipid); } Ansonsten hier für Word noch ein paar Beispiele: Link1 Link2 lg Gateway
  20. Hi, wiedereinmal benötige ich eine helfende Hand. Um mein Problem zu verstehen hole ich mal etwas weiter aus: Ich habe mir ein Usercontrol geschrieben welches dem zugehörigen ParentForm einen etwas flexibleren look verpasst. Das heißt die Controlbox wird ausgetauscht und demnächst wird noch ein Border hinzukommen. Der Formborderstyle des ParentForms wird dafür auf None gesetzt. Das Funktioniert soweit so gut und sieht aus. Das hat zurfolge das ich das Form nicht mehr über das SizeGrip vergößern kann (da dieses effektiv nichtmehr vorhanden sind). Daher musste eine eigene Lösung her. Die Lösung wollte ich direkt im UserControl verankern. Wenn ich es rechts und unten ziehe funktioniert es bereits so wie es soll. Hier mal der Code (ist in einem test usercontrol): public partial class testctr : UserControl { public enum SizeGripRegion { LeftUpperCorner, RightUpperCorner, Top, Left, Right, Bottom, LeftBottomCorner, RightButtomCorner, None }; private SizeGripRegion sizegrip = SizeGripRegion.None; private Point LastLocation = Point.Empty; private bool resizeparentform = true; private bool isClicked = false; public testctr() { InitializeComponent(); this.MouseMove += new MouseEventHandler(Mouse_Move); this.MouseDown += new MouseEventHandler(Mouse_Down); this.MouseUp += new MouseEventHandler(Mouse_Up); this.SizeChanged +=new EventHandler(Resize_Ev); } #region events private void Resize_Ev(object sender, EventArgs e) { if (resizeparentform && base.ParentForm != null) { if (this.Size.Width < base.ParentForm.Size.Width || this.Size.Height < base.ParentForm.Size.Height) { base.ParentForm.Size = this.Size; } } } private void Mouse_Move(object sender, MouseEventArgs e) { if (!isClicked) { if ((e.Location.X == 0 || e.Location.X <= 5) && (e.Location.Y == 1 || e.Location.Y <= 3)) { Cursor.Current = Cursors.SizeNWSE; sizegrip = SizeGripRegion.LeftUpperCorner; } else if ((e.Location.X == base.ClientSize.Width || e.Location.X >= (base.ClientSize.Width - 5)) && (e.Location.Y > 0 && e.Location.Y <= 3)) { Cursor.Current = Cursors.SizeNESW; sizegrip = SizeGripRegion.RightUpperCorner; } else if ((e.Location.X >= 5 && e.Location.X <= (base.ClientSize.Width - 5)) && (e.Location.Y == 0 || e.Location.Y <= 3)) { Cursor.Current = Cursors.SizeNS; sizegrip = SizeGripRegion.Top; } else if ((e.Location.X == 0 || e.Location.X <= 5) && (e.Location.Y >= 5 && e.Location.Y <= (base.ClientSize.Height - 5))) { Cursor.Current = Cursors.SizeWE; sizegrip = SizeGripRegion.Left; } else if ((e.Location.X == 0 || e.Location.X <= 5) && (e.Location.Y == ClientSize.Height || e.Location.Y >= (ClientSize.Height - 5))) { Cursor.Current = Cursors.SizeNESW; sizegrip = SizeGripRegion.LeftBottomCorner; } else if ((e.Location.X >= 5 && e.Location.X <= (base.ClientSize.Width - 5)) && (e.Location.Y == ClientSize.Height || e.Location.Y >= (base.ClientSize.Height - 5))) { Cursor.Current = Cursors.SizeNS; sizegrip = SizeGripRegion.Bottom; } else if ((e.Location.X == base.ClientSize.Width || e.Location.X >= (base.ClientSize.Width - 5)) && (e.Location.Y == ClientSize.Height || e.Location.Y >= (base.ClientSize.Height - 5))) { Cursor.Current = Cursors.SizeNWSE; sizegrip = SizeGripRegion.RightButtomCorner; } else if ((e.Location.X == base.ClientSize.Width || e.Location.X >= (base.ClientSize.Width - 5)) && (e.Location.Y >= 5 && e.Location.Y <= (base.ClientSize.Height - 5))) { Cursor.Current = Cursors.SizeWE; sizegrip = SizeGripRegion.Right; } else { Cursor.Current = Cursors.Arrow; sizegrip = SizeGripRegion.None; LastLocation = Point.Empty; } } else { Point screenrect = base.RectangleToScreen(base.ClientRectangle).Location; switch (sizegrip) { case SizeGripRegion.Right: base.Size = new Size(MousePosition.X - screenrect.X, this.Height); Rectangle rect = RectangleToScreen(base.ClientRectangle); Rectangle rect1 = RectangleToScreen(base.ParentForm.ClientRectangle); if (rect.Right >= rect1.Right) { base.ParentForm.Size = new Size(base.ParentForm.Size.Width + (rect.Right - rect1.Right), base.ParentForm.Size.Height); } break; case SizeGripRegion.Top: //Console.WriteLine((PointToScreen(screenrect).Y - MousePosition.Y).ToString()); //Console.WriteLine( PointToClient(new Point(PointToScreen(this.Location).X, PointToScreen(this.Location).Y - MousePosition.Y)).ToString()); // base.Location = PointToClient(new Point(PointToScreen(this.Location).X, PointToScreen(this.Location).Y - MousePosition.Y)); // base.Size = new Size(this.Width, MousePosition.Y + screenrect.Y); break; case SizeGripRegion.Bottom: base.Size = new Size(this.Width, MousePosition.Y - screenrect.Y); Rectangle rect2 = RectangleToScreen(base.ClientRectangle); Rectangle rect3 = RectangleToScreen(base.ParentForm.ClientRectangle); if (rect2.Bottom >= rect3.Bottom) { base.ParentForm.Size = new Size(base.ParentForm.Size.Width, base.ParentForm.Size.Height + ( rect2.Bottom - rect3.Bottom)); } break; case SizeGripRegion.Left: //Todo break; } } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (resizeparentform && base.ParentForm != null) { this.Size = base.ParentForm.ClientRectangle.Size; this.Location = new Point(0, 0); } } private void Mouse_Up(object sender, MouseEventArgs e) { if (isClicked) { isClicked = false; LastLocation = Point.Empty; } } private void Mouse_Down(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && sizegrip != SizeGripRegion.None) { LastLocation = MousePosition; isClicked = true; } } #endregion } Mein Problem liegt momentan darin, das ich die Top Brechnung nicht hinbekomme. Die Relevanten berechnungen hierfür sind im Mouse_Move Eventhandler. Wenn isClicked True ist, wird geprüft, welche Seite des User Controls geändert werden soll. Bei Right und Bottom war es relativ einfach da sich im endefekt nur die breite oder die Höhe verändert. Bei Top hingegeben muss ich die Location, sowie die Höhe neu berechnen. Ich muss eigentlich nur die Differenz der Letzten Y Kooridnate mit der aktuellen Y Koordinate als aktuellen Y Wert setzten und eben diese Differenz zusätzlich zu der aktuellen Höhe hinzufügen. Aber irgenwie klappt das nicht. Wäre Klassen wenn jemand einen Tipp hätte. lg Gateway
  21. Selbst wenn er dir die Funktionen nennt und du ein geeignetes Programm findest, wird er es trotzdem selbst schreiben wollen. Für mich ließt sich das zumindest so. lg Gateway
  22. Also wenn du dich auch mit vb.net auskennst, dann setz einen Verweis auf die Interop Assemblies. Dann musst du dein vb macro nurnoch an vb.net und der interopklasse anpassen. lg Gateway
  23. Seh ich auch so. Er überschreibt seinen querrystring ständig ohne den vorherigen ausgeführt zu haben. Entweder einen nach dem andern ausführen (wie von Sacaldur bereits erklärt) oder zu einem einzigen Update Statement zusammenfassen (was ich persönlich für die elegantere Lösung halten würde). Dann sollte das auch funktionieren. lg Gateway
  24. So ich bin fertig für heute, mehr halten meine Nerven nicht aus. Ja nun gut ich hatte vorhin wohl noch Klammern vergessen (Warum ausgerechnet dabei dieser Fehler zustande kam und nicht ein Syntaxfehler weiß ich beim besten willen nicht.) Aber das spielt jetzt eh keine Rolle mehr, da ich lauter wunderschöne Fehlermeldungen bekomme. Mein aktueller Favorit ist: Wenn ich draufklicke komme ich in die resx Datei ans ende eine Base64 Strings, was natürlich alles erklärt . Nene gut ist's.Das wars für mich sonst mach ich am Ende wirklich noch was unüberlegtes. Dabei wollte ich doch nur Rechtecke in einem UserControl zeichnen lassen....... Danke nochmals lg Gateway
  25. Hi nein das ist es nicht, ich habs nur beim aktuellen test wieder rausgenommen. Als ich es drin hatte kam selbige Meldung. lg Gateway

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...