Laden...

Forenbeiträge von bhelbig Ingesamt 135 Beiträge

17.08.2009 - 11:55 Uhr

Oh man ich bin ja so doof. Manchmal sieht man den Baum vor lauter Wald nicht. Es war ein doofer Tippfehler im Pfad.

Danke für die Hilfe und Geduld.

Grüße

17.08.2009 - 09:13 Uhr

Da hast du Recht. Das hatte ich gelesen, der User ist aber Authentifiziert. Der Zugriff funzt ja auch, wenn ich den Directory String in der App hinterlege. Würde es an der Auth liegen dann würde das ja auch schon nicht klappen.
Das Prob. tritt immer auf, egal ob Service oder App.

17.08.2009 - 08:54 Uhr

Hi Tom,

danke für den Tipp, war vielleicht ein Missverständnis, aber bin extra im DB Forum, da das Problem nur auftritt, wenn ich den UNC Pfad aus der DB auslese. Gebe ich ihn über eine Textbox durch den User an funktioniert es.
Ich glaub ich dreh mich im Kreis 🤔
Da wird man ja noch ganz konfus. X(

17.08.2009 - 08:44 Uhr

Hi thomas.at

ist klar.

Es gibt ein Share

\\fileserver\share

welches z.B. auf Laufwerk

J

verbunden ist.
In diesem Share liegt wiederum ein Ordner

folder

.
Folgender Code funzt, liefert also

true

zurück.


if (Directory.Exists(@"J:\folder"))
{....}

Folgender funzt allerdings nicht:


if (Directory.Exists(@"\\fileserver\share\folder"))
{...]

Und das kapier ich nicht. Der User, der das Prog oder den Service ausführt hat Vollberechtigung auf den Share und den Ordner.

16.08.2009 - 21:06 Uhr

Hmm, jetzt wirds seltsam. Wenn ich ein


Directory.Exists(@"J:\Ordner");

mache bekomm ich ein TRUE

Mach ich das ganze auf


Directory.Exists(@"\\fileserver\Ordner");

bekomm ich ein false. 🤔

Jetzt steh ich vollkommen auf dem Schlauch. Kommt die Directory.Exists Methode nicht mit UNC Pfaden klar? Im MSDN steht nix drin.

Sehr seltsam.

Grüße

P.S.: Die Rechte sind vollkommen OK. Also der User hat volle Rechte.

14.08.2009 - 14:12 Uhr

Wenn dem tatsächlich so ist, dann frage ich mich, warum


Directory.Exists(strPath1);

immer false zurückliefert obwohl der Ordner \fileserver\freigabe existiert.

Hast du da eine Idee?

14.08.2009 - 13:45 Uhr

verwendetes Datenbanksystem: MS SQL 2005

Hi,

ich hab folgendes Problem. Ich hab in einer DB eine Config Tabelle. Dort liegen verschiedene Pfad drin (UNC und absolut).
Z.B.: \fileserver\freigabe

Lese ich diese Spalte aus und weise sie einer String variablen zu:


string strPath1 = drRow["column"].ToString();

dann speichert er mir in der Variable folgenden Wert: \\fileserver\freigabe

Ich hab schon alle mir bekannte versucht, dazu zählen replace, @ vor die variable und/oder vor drRow aber es hat nix geholfen.

Könnt ihr mir auf die Sprünge helfen wie ich den Wert des Pfades korrekt aus der DB lesen kann? Ich brauche ihn für die die Directory und File Operationen.

Grüße

Ben

07.08.2009 - 09:35 Uhr

Also,

jetzt wirds vollkommen abstrus. Hab das mit dem RemoteDebugger hinbekommen. Ziemlich cool das Feature, nur leider in meinem speziellen Fall nicht zu verwenden, da ich mich ja nur an bereits laufende Prozesse connecten kann. Der Dienst startet jedoch garnicht erst.

Dafür bekomm ich jetzt endlich eine Fehlermeldung ins EventLog eingetragen:

EventType clr20r3, P1 cleoservice.exe, P2 2.0.0.0, P3 4a7bcbbb, P4 cleoservice, P5 2.0.0.0, P6 4a7bcbbb, P7 39, P8 11, P9 system.typeinitialization, P10 NIL.

Das spannende ist auch hier: Der Service funzt einwandfrei auf den Dev Maschinen, auf allen anderen nicht. In google war was gestanden von wegen korrupter .net Framework Installation, aber die kann ja nicht auf allen Maschinen korrupt sein, dass wäre schon zu viel des guten 😁

Was ich halt komisch finde ist, dass der Fehler auch auftritt wenn ich in der Start Methode des Services alles auskommentiere und auch alle Objektinitialisierer auskommentiere.

Hast du noch eine Idee? System.TypeInitialization klingt für mich gefährlich nach einem vergessenen ExceptionHandler, aber das kann ich ausschließen, zumindest was meine eigenen dlls angeht 🙂

Grüße

07.08.2009 - 08:20 Uhr

Ja das dachte ich eigentlich auch, dass der Dienst abstürzen müsste und ich eine .net Fehlermeldung im Ereignisprotokoll haben müsste.

Ich hab VS 2008 Prof und .net 3.5. Windows 2003 x64 ist das ServerOS wo der Dienst laufen soll.

Die Sache mit dem Remotedebugger wäre meine nächste Frage gewesen. Wie kann ich einen Dienst debuggen. Hab da bisher nix gefunden. Werd mal nach Remotedebugger suchen. Wenn du da ein paar Tipps hättest wäre ich dir dankbar.

Grüße

06.08.2009 - 10:02 Uhr

hi kleines_eichhoernchen,

gute Idee. Hab glaub ich auch den Fehler gefunden, weiß aber nicht wie ich ihn rausbekomme. Wenn ich mir die Projekteigenschaften anzeigen lasse, unter dem Punkt "Veröffentlichen" und "Anwendungsdateien" dort werden mir Dateien angezeigt die er auch in den Release und Debug Ordner legt, die aber nirgends im Projekt verwendet werden. Hab da z.B. eine EMailConnector.dll drin, die verwende ich aber in einem ganz anderen Projekt und nicht in diesem Service. Die enthält nämlich ein Windows Form und Crystal Reports. Und da auf dem Server Crystal nicht installiert ist kommt der Fehler.
Was ich nicht verstehe ist, dass in den Verweisen und Projektabhängigkeiten das EMailConnector Projekt gar nicht drin ist. Ich weiß nicht woher er sich das noch zieht.

Hoffe du hast noch eine Idee wie ich das rausbekomme bzw. entfernen kann.

Grüße

05.08.2009 - 11:26 Uhr

Hallo zusammen,

ich habe folgendes Problem: Ich hab einen Services programmiert inklusive Installer.
Installiere ich den Service auf einer Entwicklungsmachine funktioniert er einwandfrei, auf jedem anderen Rechner aber nicht.
Der Service lässt sich aber sehr wohl installieren, taucht auch im Dienste Manager von Windows auf, aber wenn ich den Dienst starte kommt die Meldung, dass der Dienst nicht rechtzeitig auf die Anweisung reagiert hat und er startet auch nicht. Im Eventprotokoll steht der selbe Fehler (EventID 7000) + ein weiterer: Der Dienst hat nicht innerhalb des Zeitlimits(30000) auf den Verbindungsversuch geantwortet (EventID 7009)
Ich habe jetzt schonmal so ziemlich alles auskommentiert was als Code drin ist und es geht immer noch nicht.
Mir scheint, als ob irgend eine dll fehlt, aber die gefundenen Abhängigkeiten im VS Setup Projekt sind OK.
Habt ihr noch eine Idee wie ich herausbekommen kann was das Prob ist?

Grüße

Ben

Als Anmerkung mal hier mein Code für den Dienst:



        public CLEOServerService()
        {
            InitializeComponent();
            //if (!EventLog.SourceExists(ServerConfig.EventLogSourceName))
            //    EventLog.CreateEventSource(ServerConfig.EventLogSourceName, ServerConfig.EventLogName);
        }

        protected override void OnStart(string[] args)
        {
            // Start the networking thread
            //ServerConfig.NetworkThreadState = TypeDef.ThreadState.RUNNING;
            //tCleoNetworking = new Thread(new ThreadStart(tnsNetworking.Start));
            //tCleoNetworking.Start();
            EventLogManager.WriteEvent("Server service: CLEO Server is running",
                                       EventLogEntryType.Information, EventLogManager.EventMainGroups.CLEOSERVER_SERVICE);
            //EventLog.WriteEntry(ServerConfig.EventLogSourceName, "Server service: CLEO Server is running", EventLogEntryType.Information, 0);

            // Start the hygrometer monitoring thread
            //ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.RUNNING;
            //tCleoHygroLogging = new Thread(new ThreadStart(hsmHygroMonitoring.Start));
            //tCleoHygroLogging.Start();
        }

        protected override void OnStop()
        {
            //ServerConfig.NetworkThreadState = TypeDef.ThreadState.STOPPED;
            //tnsNetworking.Stop();
            //ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.STOPPED;
            //hsmHygroMonitoring.Stop();

            //tCleoNetworking.Abort();
            //tCleoHygroLogging.Abort();
        }

10.06.2009 - 11:34 Uhr

Und das zweite Bild

10.06.2009 - 11:33 Uhr

Hoi

anbei die zwei Screenies. Aussehen soll es so wie auf dem Screeni "mit Fokus". Bei dem zweiten Screenie hab ich die oberen Punkte des Strings (SmartLabel) markiert. Damit du siehst, dass es gezeichnet wird, aber der TextBox Part der ComboBox aus irgendeinem Grund drüber gemalt wird.

Hier noch mein Code. Ist nur der, der Hauptklasse, das Model und die BusinessLogic machen nix besonderes. Nur Properties und eine MeassureString Methode sind da drin. Haben aber nix mit dem Zeichnen zu tun.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace IComboBox2k10
{
    [ToolboxBitmap(@"A:\_Development\Visual Studio 2008\Projects\_WinFormControls\ComboBoxOffice2k10\ComboBoxOffice2k10\ComboBox.png")]
    public partial class IComboBox2k10 : ComboBox
    {
        public IComboBox2k10()
        {
            SmartLabelFont = base.Font;
            SmartLabelForeColor = Color.Gray;
            SmartLabelPadding = new Padding(3, 0, 0, 0);

            Office2k10Design = true;

            this.FlatStyle = FlatStyle.Flat;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            //SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        }

        // ***************************************** Windows API *****************************************
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT ||

                           m.Msg == WM_NCPAINT ||
                           m.Msg == WM_ERASEBKGND ||
                           m.Msg == WM_PAINT ||
                           m.Msg == WM_MOVE ||
                           m.Msg == WM_WINDOWPOSCHANGING ||
                           m.Msg == WM_SIZE ||
                           m.Msg == WM_SETFONT ||
                           m.Msg == WM_MOUSEMOVE ||
                           m.Msg == WM_MOUSELEAVE ||
                           m.Msg == WM_SETFOCUS)
            {
                //IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1);
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);
                    SizeF szfSmartLabelSize = MeasureStringSize(SmartLabelText, SmartLabelFont);

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            0);//(this.Height - szfSmartLabelSize.Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }
        // ***********************************************************************************************

        protected override void OnTextChanged(EventArgs e)
        {
            blDisplaySmartLabel = (this.Text.Length > 0) ? false : true;

            base.OnTextChanged(e);
        }
    }
}

09.06.2009 - 12:53 Uhr

Hab jetzt mal ein bisschen rumgespielt und herausgefunden woran es liegt, aber ich weiß leider keine Lösung.
Der String wird tatsächlich korrekt gezeichnet. Obwohl man ihn nicht sieht. Das Problem ist, dass die ComboBox ja noch mal eine untergeordnete Clientarea hat, welche das eigentliche Textfeld repräsentiert. Und die wird leider über mein String drüber gezeichnet.
Wisst ihr wie ich das abfangen kann? Oder wie ich diesen Teil selbst zeichnen kann?
Das selbe Problem tritt übrigens auf, wenn man von ComboBox ableitet und die Paint Methode überschreibt und UserPaint auf true setzt. dann zeichnet er den TextBox Bereich immer schwarz. Wenn jemand dafür eine Lösung kennt, dann kann ich es ja auch mit dem Überschreiben des Paint Events machen.

Grüße

Ben

09.06.2009 - 11:52 Uhr

Hi McBubbel,

bin mir jetzt nicht sicher, aber hast du es mal als Bild versucht? Also den Text auf ein Image zeichnen und dann das Image krümmen. Das müsste eigentlich funktionieren.

Grüße

09.06.2009 - 09:11 Uhr

Hi,

jetzt ist doch noch ein Problem aufgetaucht, dem ich nicht ganz Herr werde.

Das SmartLabel wird zwar wunderbar gezeichnet, aber sobald sich der Wert der Text Property der ComboBox von gefüllt auf leer ändert wird das SmartLabel nicht mehr angezeigt oder ich die Property ShowSmartLabel von true auf false setze, dann bleibt das SmartLabel stehen, obwohl es nicht mehr gezeichnet werden sollte.

Hier mal mein Code:


protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT)
            {
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);
                    SizeF szfSmartLabelSize = MeasureStringSize(SmartLabelText, SmartLabelFont);

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            (this.Height - szfSmartLabelSize.Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }

        protected override void OnTextChanged(EventArgs e)
        {
            blDisplaySmartLabel = (this.Text.Length > 0) ? false : true;

            base.OnTextChanged(e);
            Invalidate();
            Message m = new Message();
            m.Msg = WM_PAINT;
            m.HWnd = this.Handle;
            WndProc(ref m);
        }

Edit:
Ich konnte das Problem jetzt dahingehend eingrenzen, dass das SmartLabel, also der DrawString nie gezeichnet wird, sobald das Control den Fokus verliert. Erhält das Control den Fokus dann wieder, wird es aber trotzdem nicht gezeichnet. Er zeichnet es also immer nur dann, wenn ich ein Propty im Control verändere, sobald der Fokus dann das Control verlässt wird der String nicht mehr gezeichnet, oder überzeichnet. Ich habe jetzt auch andere Windows Messages noch mit abgefangen, was aber am Resultat nichts ändert. Folgende Messages fange ich noch ab:


        private static int WM_NCPAINT = 0x0085,             // int = 133
                           WM_ERASEBKGND = 0x0014,          // int = 20
                           WM_PAINT = 0x000F,               // int = 15
                           WM_MOVE = 0x0003,                // int = 3
                           WM_WINDOWPOSCHANGING = 0x0046,   // int = 70
                           WM_SIZE = 0x0005,                // int = 5
                           WM_SETFONT = 0x0030,             // int = 30
                           WM_MOUSEMOVE = 0x0200,           // int = 512
                           WM_MOUSELEAVE = 0x02A3,          // int = 675
                           WM_SETFOCUS = 0x0007,            // int = 7
                           WM_KILLFOCUS = 0x0008;           // int = 8

09.06.2009 - 08:13 Uhr

Hi herbivore,

OnPaint habe ich zuerst verwendet, da aber das Problem, dass er mir im TextBox Teil der ComboBox immer ein schwarzen Hintergrund gezeichnet hat.
Ich muss ja, wenn ich OnPaint überschreibe UserPaint auf true setzen, dann kommt aber eben der Fehler. Das scheint wohl etwas mit der Clientarea der ComboBox zu tun zu haben, ich habe aber nicht rausbekommen, wie ich diesen Bereich errechnen kann um ihn selbst zu zeichnen.

Habe das mit dem Else probiert. Jetzt hab ich folgenden Fehler: Damit das SmartLabel gezeichnet wird, habe ich ja eine Property


public bool ShowSmartLabel
{
get{return blShowSmartLabel;}
set{blShowSmartLabel = true; Invalidate(true);}
}

sowie eine Color Property,


public Color SmarLabelForeColor
{
get{return clSmartLabelForeColor;}
set{clSmartLabelForeColor = value; Invalidate();}
}

welche die Farbe des SmartLabel bestimmt. Der Witz ist der, dass wenn ich die Eigenschaft ShowSmartLabel der Komponente ändere wird das SmartLabel nicht gezeichnet, obwohl Invalidate() aufgerufen wird. Ändere ich aber die ColorEigenschaft, dann zeichnet er sie plötzlich. Muss ich da eine spezielle Windows Message schicken?

Grüße

Edit: Hab den Fehler gefunden. Danke herbivore, hast mich auf die Idee gebracht. das True beim Invalidate war ein Problem.

Grüße

08.06.2009 - 23:43 Uhr

Hi,

ich habe eine ComboBox geschrieben, welche von Windows.Forms.ComboBox erbt. Eigentlich ist es eine orginale ComboBox mit ein paar zusätzlichen Coloreigenschaften.
Damit das Zeichnen richtig funktioniert habe ich die WndProc Funktion überschrieben. Das funzt auch alles soweit. Das Problem ist, das der String den ich Zeichen lasse (SmartLabel) kurz aufflackert, dann aber sofort wieder verschwindet. Also überzeichnet wird, durch irgendetwas.
Reagiere ich auf zuwenige Windows Messages? Woran kann das sonst noch liegen? Hoffe ihr habt eine Idee.
Hier meine WndProc:


protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT)
            {
                //IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1 | 0x0020);
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);

                    // Paint Text
                    gGraphics.DrawString(Text, Font, new SolidBrush(ForeColor),
                                          new PointF(0, (this.Height - MeasureStringSize(this.Text, this.Font).Height) / 2));

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            (this.Height - MeasureStringSize(SmartLabelText, SmartLabelFont).Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }

26.05.2009 - 10:53 Uhr

Hi zusammen,

ich habe in meinem Formular einen Crystal Report Viewer, der mir einen Crystal Report anzeigt den ich vorher mit einem DataSet fülle. Das funzt auch super.
Jetzt will ich das Teil ausdrucken. Der eingebaute PrintButton im CrystalViewer ist aber nicht zu gebrauchen. Da ich ja mit der Funktion


PrintToPrinter

den Report auch selbst drucken kann hab ich also einen eigenen Drucken Button gemacht der in das Design der Anwendung passt. Dieser Button ruft einen


System.Windows.Forms.PrintDialog 

auf. Das Problem ist, dass sämtliche enums die der


System.Windows.Forms.PrintDialog

hat nicht mit denen von Crystal übereinstimmen.

Ich setze zum Drucken die Optionen


sdrDataReport.PrintOptions.CustomPaperSource = e.CustomPaperSource;
sdrDataReport.PrintOptions.PaperOrientation = e.PaperOrientation;
sdrDataReport.PrintOptions.PaperSize = e.PaperSize;
sdrDataReport.PrintOptions.PaperSource = e.PaperSource;
sdrDataReport.PrintOptions.PrinterDuplex = e.PrinterDuplex;
sdrDataReport.PrintOptions.PrinterName = e.PrinterName;

was ja imho auch Sinn macht. Aber PaperSize z.B. lässt sich mit einem simplen


Enum.Parse

leider nicht konvertieren, da es bei Windows.Forms.PrintDialog heißt:


PaperSize.A4;

und bei Crystal:


PaperSize.PaperA4;

Gibts da irgendeine Möglichkeit außer alles von Hand zu konvertieren? Z.B. das ich den Crystal PrintDialog aufrufe von meinem Button aus anstatt den Windows.Forms.PrintDialog?

Hoffe ihr könnt mir helfen.

LG

Ben

04.05.2009 - 19:23 Uhr

Hey ihr zwei, danke für eure Tipps.

kleines_eichhoernchen, das ist eine gute Idee. Mit den Callbacks hab ich beim Threading.Timer schon gearbeitet, den ich an anderer Stelle einsetze.

Den Ansatz werde ich weiterverfolgen. Dank dir.

Grüße

Ben

03.05.2009 - 23:43 Uhr

Hi zusammen,

ich habe einen Windows Service geschrieben, der als Server für meine Client Applikation fungieren soll und einige Funktionen via Netzwerk zur Verfügung stellt.
Dazu starte ich beim starten des Dienstes einen neuen thread in dem der Netzwerkmanager läuft. dieser wartet in einer


while(true)
{
}

Schleife auf neue Verbindung. Kommt eine neue Verbindungsanfrage rein wird diese in einem neuen Thread gestartet und dort bearbeitet.
Mein Problem ist, dass ich bei dieser Technik immer caö 50% CPU Auslastung habe. Sobald ich den Netzwerkpart deaktiviere geht die CPU Auslastung des Dienstes auf 0 % runter. Die anderen Services die der Dienst bereitstellt ziehen also kaum CPU Last.

Ich finde die while(true) Geschichte eh nich sonderlich prickelnd habe aber leider keine andere Lösung gefunden. Ist das überhaupt das Problem? Gibts hierfür etwas eleganteres? Wie macht ihr das mit dem warten auf Netzwerkanfragen?

Grüße

Ben

13.04.2009 - 23:01 Uhr

Hi,

also ich habe einen Dienst geschrieben und dazu ein Setup Projekt der das Teil installiert. Wunderbar klappt auch alles, aber wie bekomm ich den Dienst gestartet? Ich wil ein Reboot vermeiden.
Ich vermute mal dass es über das PostBuild Event im Setup Projekt funzt, aber wie ich das verstanden habe führt das event nur batches aus via call C:\mybat.bat
Ich will aber eigentlich keine batch mitliefern. Geht das nicht noch anders? zu dem PostBuildEvent steht im MSDN leider nicht wirklich tolles.

Lg

Ben

12.04.2009 - 13:49 Uhr

Hi zero_x

logisch. Argh. Danke für den Schups von der Leitung. Der Beispiel code ist nicht wirklich echt. Im echten Code wird keine MessageBox angezeigt, sondern eine XML Datei per URL importiert.
Aber ist ja klar, dass das nicht laufen kann. Da der Timer in einem Windows Service laufen soll ist es denke ich mal eh besser den Thread timer zu verwenden. Hab den zwar noch nie benutzt aber das MSDN Beispiel ist nicht wirklich schwierig.

LG

Ben

12.04.2009 - 13:43 Uhr

Hi Chris,

danke für den Hinweis. Bin grad dabei mich im MSDN über Thread Timer schlau zu machen.
Kannst du mir verraten, warum beim Zuweisen des Tick Events ich new EvenHandler nutzen muss? Bisher habe ich die Events immer so zugewiesen:


mycontrol.Event += Method1;

und nicht mit:


mycontrol.Event += new EventHandler(Method1);

Grüße

12.04.2009 - 13:08 Uhr

Hi, ich hoffe ihr könnt mir helfen.
Mein Problem: Ich starte einen Thread, der wiederum einen Windows.Forms.Timer erstellt, dessen Tick Event eine Methode zuweist und den Timer startet.

Hier der Code:



        private System.Windows.Forms.Timer tTmp;
        private Thread thTmp;
        private void button1_Click(object sender, EventArgs e)
        {
            thTmp = new Thread(new ThreadStart(tmpThreadStart));
            thTmp.Start();
        }

        private void tmpThreadStart()
        {
            tTmp = new System.Windows.Forms.Timer();
            tTmp.Interval = 1000;
            tTmp.Tick += ttmp_tick;
            tTmp.Start();
        }

        private void ttmp_tick(object sender, EventArgs e)
        {
            MessageBox.Show("blubb");
        }

Ist nur heißer Beispielcode aber so macht es auch mein Service in dem der Code steckt.
Das Problem ist: die Methode: ttmp_tick wird niemals aufgerufen.

Ich vermute mal, dass es daran liegt, dass der Timer einen eigenen Thread aufmacht oder liege ich da falsch? Nur wie kann ich das beheben?

Grüße und schöne Ostern.

Ben

17.03.2009 - 10:38 Uhr

Hi t2t,

danke für die schnelle Antwort. Genau das wollte ich eigentlich vermeiden. Ich dachte es gibt eine Möglichkeit anhand eines Dictionaries z.b. wo zu jedem enum, den ich habe der Modul Typ drin steht, ich auch casten kann.
Also z.B.:


Dictionary<Modules, String> mydic;

((mydic[Modules.MOD1])ctrl).spezielles_property;


Aber das funzt ja nicht.

17.03.2009 - 10:26 Uhr

Hi,

ich habe folgendes Problem:
Ich habe ein Panel, welches verschiedene Controls (Module) enthält. Diese heißen z.B.:
_ucMyControl
_ucNochEinControl

Diese Controls sind abgeleitet von UserControl. Ich erstelle die Controls zur Laufzeit (sind quasi die Module meiner Hauptanwendung, so als eine art MDI).
Außerdem habe ich einen enum Typ in meiner Hauptanwendung die mir die Module auflistet.
Soweit wunderbar, aber jetzt muss ich ein Panel (mein Hauptpanel, welches alle geöffneten Module beinhaltet) durchgehen und auf eine Property meiner geöffneten Module zugreifen. Welches Modul geöffnet ist habe ich in einer generischen List gespeichert die mit meinem Modul enum gefüllt ist.

Nur wie bekomme ich anhand meines Enums eine Zuordnung zu dem Modul Controls?
Ich kann zwar mit:


foreach (Control ctrl in ModHost.Controls)
{
}

Alle Controls durchgehen, aber ich muss ja ein irgendwie eine Referenz auf mein _ucMyControl bekommen. Und ich möchte eigentlich nicht eine rießen große Switch oder If Abfrage mit TypeOf machen. Geht das nicht auch irgendwie anders?

Grüße

21.01.2009 - 14:39 Uhr

Hi,

ich habe eine kleine Frage:
Ich habe meine UI bei der ich ganz normal im Form Code die Steuerelemente setzen kann.
Dann habe ich eine Klasse BusinessLogic, die im Form Code über:


BusinessLogic ooBLogic = new BusinessLogic();

referenziert ist. Somit kann ich die Klasse nutzen.
Die BusinessLogic hat eine Methode


SendMail()

diese MEthode startet einen neuen Thread, welcher Mails sendet. Soweit funzt alles.
Der Thread, welcher die Mails hat ein selbstgebautes Event, welches nach jeder gesendeten Mail versendet wird. Funzt auch. Die BusinessLogic verbindet sich an dieses Event und schmeißt wiederum ein eigenes Event. An dieses Event ist die UI Klasse connected. Das Event kommt auch direkt im UI Code an.
Der Code der ausgeführt wird setzt die Text Eigenschaft von einem Label. Und hier ist das Problem, der Debugger sagt mir dass hier ein Steuerelement von einem falschen Thread heraus geändert wird. Warum? Die Methode die das Steuerelement ändert liegt doch in der UI Klasse.

Hier mal der Code:
UI:


        public _frmWSMCEMail()
        {
            InitializeComponent();

            ooBLogic.ProgressBarConfig += ProgressBarConfig_Event;
        }

        private void ProgressBar_Event(object sender, SendMailEventArgs e)
        {
            Logging(Environment.NewLine + e.CurrentSendOut.ToString() + ":" + e.EMailAddress);
        }

        private void Logging(string strMsg)
        {
            //_pgbProgress.PerformStep();
            //_lblLogging.Text += strMsg;
        }

BusinessLogic:


private event EventHandler<SendMailEventArgs> _oSending;

        #region Event SendMail
        /// <summary>
        /// Executes the sendmail event
        /// </summary>
        /// <param name="e">An instance of the eventargs class which includes the event handler.</param>
        protected virtual void OnSending(SendMailEventArgs e)
        {
            if (_oSending != null)
                _oSending(this, e);
        }
        /// <summary>
        /// Is executed if sendmail is sending
        /// </summary>
        public event EventHandler<SendMailEventArgs> Sending
        {
            add { _oSending += value; }
            remove { _oSending -= value; }
        }
        #endregion

public void SendMailWrapper(string strBodyHTML, string strBodyText, string strFrom, string strFromDisplayName, 
                                    string strReturnAddress, string strSMTPServerIP, string strSMTPServerPW, string strSMTPServerUser, 
                                    string strSubject, string strTo, string[,] strarrAttachments, string strTableName, 
                                    string strDBEMailField, string[] strarrFields, string strDBSelCondSQL, string strDBUpdCondSQL, 
                                    string strDBUpdFieldsSQL)
        {

                tSendMail = new Thread(new ThreadStart(ooSendMailThread.Start));
                ooSendMailThread.Sending += Sending_Event;
                tSendMail.Start();
}

SendMailThread:


#region Event SendMail
        private event EventHandler<SendMailEventArgs> _oSending;
        /// <summary>
        /// Executes the sendmail event
        /// </summary>
        /// <param name="e">An instance of the eventargs class which includes the event handler.</param>
        protected virtual void OnSending(SendMailEventArgs e)
        {
            if (_oSending != null)
                _oSending(this, e);
        }
        /// <summary>
        /// Is executed if sendmail is sending
        /// </summary>
        public event EventHandler<SendMailEventArgs> Sending
        {
            add { _oSending += value; }
            remove { _oSending -= value; }
        }
        #endregion

        public void Start()
        {
                    ooMail.SendHTMLMail();
                    OnSending(new SendMailEventArgs(ooMail.To, 1));
}

Ich bin mit Invokes soweit eigentlich vertraut. Aber die kann ich hier nach nicht verwenden, das der Invoke ja immer innerhalb einer Form klasse aufgerufen werden muss.

Hoffe ihr könnt mir von der Leitung helfen.

Grüße

15.10.2008 - 12:22 Uhr

Hmm,

hängt meine Fehlermeldung dann damit zusammen? Er kann die dll laden, aber bringt immer den Fehler, dass er den dll Einsprungpunkt der Funktion nicht finden kann.
Oder muss ich den Standardkonstruktor abändern, damit der Fehler nicht kommt?
Müsste es nicht ausreichen, wenn das .net Framework auf dem Rechner drauf ist?

Grüße

15.10.2008 - 11:48 Uhr

Hallo,

habe eine allgemeine Frage. Ich habe eine Form und kompiliere diese als dll.
diese dll kann ich doch aus jeder anderen Programmiersprache, die dll's laden kann ansprechen.
Also konkret: Ich möchte die Form aus einer Access 97 Anwendung heraus öffnen. Access 97 verwendet ja VBA. In VBA kann ich externe dll's verwenden, damit müsste ich doch auch dann meine Form aus meiner dll laden können oder?

Grüße

26.07.2008 - 12:09 Uhr

Hallöchen,

ich mache gerade meine ersten Schritte mit VS 2008 und Blend 2 in WPF. Ich suche und finde leider nicht die Dock Eigenschaft der Controls. Bei einer Windows Forms Anwendung kann ich ja jedes Control Oben, Links, Rechts oder Unten andocken. Bei WPF finde ich diese Möglichkeit nicht, wird das da anders gemacht?
Oder fehlt es einfach nur im Designer und ich muss es über XAML machen?

Grüße

Ben

17.07.2008 - 09:37 Uhr

Hallo,

habt ihr eine Idee wie ich herausbekomme, wer alles eine Datei gerade geöffnet hat, die auf einem Netzlaufwerk liegt?
Soweit ich weiß wird das doch als Collection im NTFS FileSystem hinterlegt, wer da grad die Datei alles offen hat. Kann ich das irgendwie auslesen? Müsste doch eigentlich über die Windows API gehen, aber ich hab nix gefunden.

Grüße

Ben

05.06.2008 - 10:40 Uhr

Hi zusammen,

ich weiß, dass ich mal irgendwas gelesen habe wie ich ein Control zur Laufzeit in der Größe so verändern kann wie in der VS IDE. Also mit den Eckpunkten und diesem Rahmen. Das war irgendein API Call kann das sein?

Ich suche jetzt schon länger und finde den Artikel nicht mehr.

Grüße

Ben

22.04.2008 - 08:45 Uhr

Hi ich hab hier ein kleines Problem.

Ich habe eine Anwendung, welche Plugins starten kann und auf deren Ergebnis wartet. Dazu startet die Anwendung einen Plugin "Server" der wiederum die Plugins startet. Wenn jetzt ein Plugin über die ich ja keine Quellcode Kontrolle habe Mist baut und abstürtzt dann säuft auch meine Applikation ab. Das ganze wird über COM realisiert.
Jetzt meine Frage, kann ich bei der COM Initialisierung nicht ein Timeout setzen? Nur solange das Timeout noch nicht abgelaufen ist soll auf Antwort des Plugins gewartet werden, danach gilt es als "tot". Das muss doch irgendwie gehen oder? Ich kann mir irgendwie nicht vorstellen, dass COM nur synchron funktioniert.

Hoffe ihr habt eine Idee.

Grüße

Ben

15.01.2008 - 08:30 Uhr

Bild 2:

15.01.2008 - 08:29 Uhr

Sorry herbivore.

Bild 1:

14.01.2008 - 20:17 Uhr

Also hab jetzt mal alles getestet. Leider ist die Performance nicht wirklich gut.
Ich habe mein Problem mit CopyFromScreen auch rausgefunden warum es nicht klappt, dafür hat sich ein anderes aufgetan.
Wenn man CopyFromScreen ausführt und den Teil des Desktops haben möchte, der unter einem speziellen Form der eigenen Anwendung liegt, darf die Form natürlich zu dem Zeitpunkt wo man CopyFromScreen aufruft nicht sichtbar sein, bzw. muss vollständig transparent sein.
Ich löse dass jetzt mit folgendem Code, der erstmal zu Testzwecken in einem Timer steckt:


BackgroundImage = null;
            
rectFormScreen = RectangleToScreen(ClientRectangle);
imgDesk = new Bitmap(Width, Height);
gfxDesk = Graphics.FromImage(imgDesk);
gfxDesk.CopyFromScreen(rectFormScreen.X, rectFormScreen.Y, 0, 0, imgDesk.Size);

gfxDesk.DrawImage(Properties.Resources.RoundedFormWClose, 0, 0, Width, Height);
BackgroundImage = imgDesk;

Die BackgroundColor der Form:


        public _frmProjectSelection()
        {
            InitializeComponent();

            this.SetStyle(ControlStyles.DoubleBuffer |
                          ControlStyles.UserPaint |
                          ControlStyles.AllPaintingInWmPaint |
                          ControlStyles.SupportsTransparentBackColor |
                          ControlStyles.ResizeRedraw, true);

            BackColor = Color.Magenta;
            TransparencyKey = Color.Magenta;
        }

Das Prob ist, dass er beim ersten Tick des Timers zwar richtig zeichnet, aber beim zweiten Tick so scheint es mir zumindest das Backgroundimage nicht löscht, sondern schlicht darüber malt. Ich sehe aber nicht warum er dies tut.
Hier mal zwei Screenis.

[EDIT von herbivore]Bilder bitte als Dateianhang einfügen. Siehe [Hinweis] Wie poste ich richtig? Punkt 6.1[/EDIT]

Hoffe mir kann jemand auf die Sprünge helfen.

Grüße

Ben

08.01.2008 - 21:31 Uhr

Hi dennisspohr,

super. Du bist mein Held. Der Artikel ist genial. Genau das was ich gesucht habe.

Grüße

Ben

08.01.2008 - 12:50 Uhr

Naja, das habe ich ja. Der schwarze Schatten ist ein png mit Transparenz.
Dieses png mach ich als Hintergrund für den AlphaFormTransformer. Aber um die Controls zu platzieren muss ich ja den Maker noch setzen. Und wenn ich den auf die Form haue, dann ists vorbei mit der Transparenz.
Hast du vielleicht ein kleines BSP Projekt dass ich mir mal anschauen kann? Das BSP was beim CodeProjekt online ist hilft mir nicht viel, so wie dort habe ich es auch hinbekommen. Aber den durscheinenden Desktop inklusive Controls haut nicht hin bei mir.
Danke für deine Hilfe.

Grüße

Ben

08.01.2008 - 11:58 Uhr

Hi dennisspohr,

danke für den Link. Das schaut sehr gut aus, aber damit bekomme ich die Transparenz ja nur ausserhalb hin. ich möchte ja aber, dass der Desktop durch meine Controls durchscheint.
Hast du das mit dem AlphaTransformer hinbekommen?

Grüße

Ben

07.01.2008 - 20:54 Uhr

Hi,

mit folgendem Code erreiche ich eine Transparenz in meinem Form:


        private void _frmProjectSelection_Paint(object sender, PaintEventArgs e)
        {
            Rectangle rect = this.RectangleToScreen(this.ClientRectangle);
            e.Graphics.CopyFromScreen(
              new Point(rect.Location.X + e.ClipRectangle.Location.X, rect.Location.Y + e.ClipRectangle.Location.Y),
              e.ClipRectangle.Location, this.ClientRectangle.Size);
        }

Das Problem ist, dass sobald ich das Form verschiebe die Transparenz verschwindet. Ich habe in dem Location changed und move Ereignis des Forms ein Invalidate() reingemacht. Wirklich gebracht hat es nix.
Selbst wenn ich das Form nicht verschiebe und ein anderes Fenster in den Hintergrund schiebe ändert sich nix. Ich mein der zweiter Punkt ist soweit ja klar
schließlich müsste ja meine Anwendung auf die Desktopänderung reagieren, aber der erste Punkt leuchtet mir nicht ein. Wenn ich die Form verschiebe dann zeichnet er doch neu und ruft somit den Paint Eventhandler auf. Also wird ja derselbe Code ausgeführt wie beim Start der Form und da funzt es ja.
Was noch dazu kommt ist folgendes. Ich habe auf dem Form ein Panel welches die Form füllt und dessen Background auf Transparent gestellt ist. Sobald aber ein Control dem Panel hinzugefügt wird erlischt die Transparenz.
Hier mal zwei Screenies:

Grüße

Ben

07.01.2008 - 20:49 Uhr

🤔
Hmm. Das ist komisch. Die Idee die dahintersteckt ist, dass der Anwender nur noch mein Programm bedienen kann und nichts mehr starten darf oder sonst was am Rechner rumfummelt. Im Prinzip also nix anderes wie diese Terminalsoftware die die Deutsche Bahn an ihren Automaten einsetzt, oder die Kinobetreiber usw. Wo man nur das eine Prog. als Frontend sieht und nichts vom XP das im Hintergrund läuft.

07.01.2008 - 19:50 Uhr

Hi,

ich will meine Anwendung kompatibel für den Windows Kiosk Modus machen der seit XP dabei ist. Aktiviert wird der ja über die Gruppenrichtlinie wenn ich nicht irre. In meiner Anwendung muss ich dann die entsprechenden Windows Funktionen zum herunterfahren des PCs und abmelden usw implementieren.
Verstehe ich das so richtig? Was für Windows Funktionen machen da Sinn, diese zu implementieren außer Runterfahren und Abmelden und eine Adminmöglichkeit das Programm zu schließen und zum Windows Desktop zurückzukehren?

Grüße

Ben

24.12.2007 - 11:52 Uhr

Erstmal ein frohes Fest euch allen.

Ich weiß nicht warum, aber es funktioniert. Vielleicht kann mir jemand erklären warum. Mein Code für die Property:


        [Category("IMenu")]
        [Description("The IMenu.")]
        [Browsable(true)]
        [EditorBrowsable(EditorBrowsableState.Always)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public IMenu IMenu
        {
            get
            {
                limIMenus.Clear();
                Module[] mdModules = Assembly.GetExecutingAssembly().GetModules(false);
                Module myModule = mdModules[0];
                List<Control> lCtrl = BusinessLogic.FindControlRec(FindForm(),
                        myModule.GetType("itempWinCtrlLib.Menu.IMenu", false), new List<Control>());
                for (Int32 intI = 0; intI < lCtrl.Count; intI++)
                { limIMenus.Add((IMenu)lCtrl[intI]); }

                return imMenu;
            }
            set
            { imMenu = value; }
        }

Obwohl der Datentyp der Property IMenu ist und somit keine Aufzählung bekomme ich im Property Designer eine Auflistung aller IMenus zur Auswahl angezeigt.
Es ist ja nicht so, dass ich mich beschweren möchte 😉 aber ich würde gerne verstehen warum es mit diesem Code funktioniert.

Grüße

Ben

23.12.2007 - 20:58 Uhr

Hi floste,

danke für deine Hilfe. Das wäre ein anderer Ansatz, den ich weiterverfolge, wenn das so nicht klappt wie ich es mir vorstelle. Eigentlich brauch ich halt die Referenz auf das Control, dass ausgewählt wird. Es wird ja nicht der Type sondern direkt das Control über den Designer ausgewählt. Ich wollte nämlich von meinem Control aus direkt auf das ausgewählte Control zugreifen.

23.12.2007 - 20:20 Uhr

Danke für eure Hilfe.
Manchmal sagt ja Code mehr als 1000 Worte.
Also mein Control hat folgende Property:


        [Category("IMenu")]
        [Description("The IMenu.")]
        [Browsable(true)]
        [EditorBrowsable(EditorBrowsableState.Always)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public IMenu IMenu
        {
            get
            {
                limIMenus.Clear();
                Module[] mdModules = Assembly.GetExecutingAssembly().GetModules(false);
                Module myModule = mdModules[0];

                List<Control> lCtrl = BusinessLogic.FindControlRec(FindForm(),
                    myModule.GetType("itempWinCtrlLib.Menu.IMenu", false), new List<Control>());
                for (Int32 intI = 0; intI < lCtrl.Count; intI++)
                { limIMenus.Add((IMenu)lCtrl[intI]); }
                return imMenu;
            }
            set
            { imMenu = value; }
        }

Wie ihr seht hole ich mir alle Controls eines Type und fülle diese in eine generische Liste. hier mal der Code, der mittels Rekursion die Liste der Controls erstellt:


        public static List<Control> FindControlRec(Control control, Type tCtrlType, List<Control> lTmp)
        {
            foreach (Control _ctrl in control.Controls)
            {
                if (_ctrl.GetType() == tCtrlType)
                    lTmp.Add(_ctrl);
                else
                    FindControlRec(_ctrl, tCtrlType, lTmp);
            }
            return lTmp;
        }

Das funktioniert auch wunderbar. Mein Problem ist, dass ich nicht weiß, wie ich diese Liste jetzt als Datentyp für meine Property verwenden kann. Ich kann ja den Code um die Liste zu erstellen nicht in eine eigene Klasse stecken und die dann als Property verwenden. Also muss ich ja irgendwie aus dieser Liste eine enumeration erstellen. Oder hab ich da einen Gedankenfehler? Im Moment ist ja die Property noch vom Typ IMenu, sie soll aber vom Typ der Liste sein.

Hoffe ich konnte mich etwas klarer ausdrücken.

Grüße

Ben

23.12.2007 - 18:48 Uhr

Naja, stell dir einfach ein eigenes Control vor, bei dem du über den Property Editor z.B. eine Textbox auswählen kannst für eine bestimmte Ein-Ausgabe. Dazu muss ich halt eine Auflistung alle in der Form enthaltenen Textboxen als Property in meinem Control zur Verfügung stellen, damit man dann als Entwickler eine Textbox auswählen kann.

23.12.2007 - 15:20 Uhr

Hi,

ich hab folgendes Problem: Ich möchte in meinem eigenen Steuerelement eine Property zur Verfügung stellen. Diese Property soll als Datentyp alle Controls im Form eines bestimmten Typs enthalten. Mein Steuerelement erhält also nach der Auswahl eine Referenz auf das aus der enumeration ausgewählte Steuerelement.
Mein Code um ein Steuerelement aus der gesamten Form zu bekommen funkt auch. Aber wie kann ich aus meiner Auflistung von bestimmten Controltypen die ich habe eine Property machen?
Soweit ich weiß kann ich ja nur Klassen, structs und enums als Datentypen für eine Property angeben. Aber die Liste muss ja zur Laufzeit erstellt werden.
Mit vordefinierten enums funzt das wunderbar, aber irgendwie bekomm ich nicht den Sprung hin. Ich habe es mit einer generischen Liste probiert, aber das funktioniert leider nicht.

Habt ihr eine Idee?

Grüße

Ben

12.12.2007 - 10:20 Uhr

Sh.. Sorry. Den hatte ich nicht gefunden. Dank dir.

Grüße

Ben

11.12.2007 - 13:10 Uhr

Hi,

ich habe eine eigene ComboBox programmiert. Bei der Standard ComboBox ist es ja so, dass sobald der User irgendwo klickt auch auserhalb des controls das DropDown Menu nicht mehr angezeigt wird.
Wenn die Maus innerhalb des Steuerelements ist ist das ja kein Problem, aber wie mache ich das, wenn die Maus außerhalb ist?
Mir ist klar, dass ich die WM_LBUTTONDOWN bzw. WM_RBUTTONDOWN Windows Message abfangen muss, aber wie mache ich das? Sind da dann auch gleich die Koordinaten mitdabei? Muss ich das über einen Hook machen?
Hoffe ihr könnt mir weiterhelfen.

Grüße

Ben