Laden...

Forenbeiträge von steffen_dec Ingesamt 322 Beiträge

04.06.2008 - 08:54 Uhr

Also hier der Dialog.

dieser beinhaltet keine Windows-Funktionen wie Kopieren, Einfügen, Löschen usw.. (Kontextmenü). Dass habe ich mit Absicht so gemacht, damit keine Daten manipuliert werden können.

und so wird der Dialog verwendet:


                FolderDialog folderDialog = new FolderDialog();
                folderDialog.OverwritePrompt = false;

                //Filter für Dateitypenliste
                folderDialog.Filter = "ZIP-File (*.zip)|*.zip|SQL-File (*.sql)|*.sql";

                //Standarderweiterung (Wenn keine angegeben wird)
                folderDialog.DefaultExt = ".zip";

                //Start Verzeichnis
                if (Directory.Exists("E:\\"))
                    folderDialog.InitialDirectory = "E:\\";
                else
                    folderDialog.InitialDirectory = "D:\\";

                //Titel des Dialogs
                folderDialog.Title = "Rücksicherung der Datenbank";
                //folderDialog.DenyDrives = "C";

                DialogResult dRes = folderDialog.ShowDialog();

                if (dRes == DialogResult.OK)
                {
                     //Weiter verarbeiten
                }

03.06.2008 - 08:04 Uhr

Hallo herbivore,

dass hatte ich bereits auch probiert,

so scheint es zu funktionieren:


                string strFile = "C:\\test.sql";

                string cmd = string.Format(@"-h{0} -u{1} -p{2}  -D{3}", StaticFunc.DB_HOST, StaticFunc.DB_USER, StaticFunc.DB_PASSWORD, StaticFunc.DB_SCHEMA);
                ProcessStartInfo proc = new ProcessStartInfo();
                //der Pfad zu MySQL-Bin muss in der PATH-Umgebungsvariable definiert sein
                proc.FileName = "mysql";
                proc.CreateNoWindow = true;
                proc.WindowStyle = ProcessWindowStyle.Hidden;
                proc.UseShellExecute = false;
                proc.RedirectStandardInput = true;
                proc.RedirectStandardOutput = false;
                proc.RedirectStandardError = false;

                proc.Arguments = cmd;
                Process p = Process.Start(proc);

                StreamWriter writer = p.StandardInput;

                string[] strSQLLines = File.ReadAllLines(strFile);
                for (int k = 0; k < strSQLLines.Length; k++)
                {
                    if (strSQLLines[k].Length > 0)
                        writer.WriteLine(strSQLLines[k]);
                }

                writer.WriteLine("exit");
                writer.Close();
                p.WaitForExit();

Ich hab noch eine Frage, wie ist es wenn mittendrin ein INSERT ausgelöst wird?
Werden die Tabellen dadurch nicht inkonsistent?

ich hatte noch vor dem ganzen Block ein FLUSH TABLES WITH READ LOCK und danach ein UNLOCK TABLES

dass war wohl der Fehler... nur wie stelle ich sicher dass mir keiner dazwischenfunkt? ich verwende MyISAM als Engine

Die Frage gehört jetzt eigentlich mehr in die Abteilung Datentechnologie.

Danke
Steffen

02.06.2008 - 15:03 Uhr

Hallo,

ich möchte einen SQL-Dump in eine MySQL-Datenbank einspielen.
Der Befehl für die Kommandozeile lautet:

mysql -uUSER -pPASS -hHOST -Ddatabase < backup.sql

also habe ich das ganze so probiert:


                ProcessStartInfo proc = new ProcessStartInfo();
                string strFile = "D:\\test.sql";
                
                //string cmd = string.Format(@"-u{0} -p{1} -h{2} {3}", StaticFunc.DB_USER, StaticFunc.DB_PASSWORD, StaticFunc.DB_HOST, StaticFunc.DB_SCHEMA);
                string cmd = string.Format(@"-u{0} -p{1} -h{2} -D{3}", StaticFunc.DB_USER, StaticFunc.DB_PASSWORD, StaticFunc.DB_HOST, StaticFunc.DB_SCHEMA);

                //der Pfad zu MySQL-Bin muss in der PATH-Umgebungsvariable definiert sein
                proc.FileName = "mysql";
                proc.CreateNoWindow = true;
                proc.WindowStyle = ProcessWindowStyle.Hidden;
                proc.UseShellExecute = false;
                proc.RedirectStandardInput = true;
                proc.RedirectStandardOutput = false;
                proc.RedirectStandardError = false;

                proc.Arguments = cmd;
                Process p = Process.Start(proc);

                StreamWriter writer = p.StandardInput;

                string[] strSQLLines = File.ReadAllLines(strFile);
                for (int k = 0; k < strSQLLines.Length; k++)
                {
                    if (strSQLLines[k].Length > 0)
                        writer.Write(strSQLLines[k]);
                }

                writer.WriteLine("exit");
                writer.Close();
                p.WaitForExit();

dass tut es aber nicht, ich erhalte kein fehler und die Datenbank ist genauso wie vorher... Weiß vielleicht jemand was ich falsch mache?

ich möchte so einen Aufruf vermeiden:


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim myProcess As New Process()
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.WorkingDirectory = "c:\"
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.Start()
        Dim myStreamWriter As StreamWriter = myProcess.StandardInput
        Dim mystreamreader As StreamReader = myProcess.StandardOutput
        myStreamWriter.WriteLine("E:\tool\MySql\bin\mysql.exe --host=localhost --user=root --password=pwd test < backup1.sql ")
        Dim str As String = mystreamreader.ReadToEnd
        MessageBox.Show(str)
        myStreamWriter.Close()
        myProcess.WaitForExit()
        myProcess.Close()
    End Sub
End Class

Danke, Gruß
Steffen

29.05.2008 - 13:58 Uhr

ich habe nun einen eigenen Dialog angefangen.

falls es jemand mal braucht stelle ich es hier dann rein wenn ich es komplett fertig habe.

so sieht z.b. ein Aufruf aus:


            FolderDialog folderDialog = new FolderDialog();
            
            //Filter für Dateitypenliste
            folderDialog.Filter = "Image Files(*.BMP;*.JPG)|*.BMP;*.JPG|All Files(*.*)|*.*";
            //Standarderweiterung (Wenn keine angegeben wird)
            folderDialog.DefaultExt = ".bmp";
            //Start Verzeichnis
            folderDialog.InitialDirectory = "D:\\Images";
            //Default Dateiname
            folderDialog.FileName = "testbild";
            //Titel des Dialogs
            folderDialog.Title = "Save As";

            DialogResult drResult = folderDialog.ShowDialog();
            if (drResult == DialogResult.OK)
            {
                txtInput.Text = folderDialog.FullFileNamePath;
            }

hier ein screenshot:

29.05.2008 - 10:46 Uhr

Hallo,

ich möchte in dem Filedialog entweder bestimmte Laufwerke gar nicht anzeigen. oder die Windows-Funktionalitäten (wie kopieren, löschen, ausschneiden, erstellen usw) deaktivieren bzw. abfangen.

Windowseigene mittel kommen nicht in Frage da ich vom Programm aus überall Zugriff brauche. Die Benutzer unterscheide ich bei mir im Programm intern (eigene Benutzerverwaltung).

ich habe das control von dr4g0n76 ausprobiert und auf einer Form aufgezogen dann sieht es so aus wie auf dem Bild (auch zur Laufzeit)

Vielleicht kennt ja jemand ein anderes FileDialog welchen man anpassen kann. Sonst muss ich wohl oder übel das Rad neu erfinden 😁

Danke
Steffen

27.05.2008 - 16:16 Uhr

Hallo dr4g0n76,

ich muss deinen Beitrag rausholen 😁

Ich benutze in meinem Programm den Standard-OpenFileDialog/SaveFileDialog.

Nun möchte ich den Zugriff auf bestimmte Laufwerke (z.b. C:\ und D:) zur Laufzeit (Benutzerabhängig) sperren.

Dass geht ja mit den windowseigenen Mitteln leider nicht... Deshalb brauche ich einen eigenen Dialog oder?

Vielleicht hast du ja eine Idee? Du hast dich ja mit dem FileDialog beschäftigt...

Ich habe auch deinen nachgebauten Dialog (customFileDialog) getestet, irgendwie kommt bei mir nichts gscheides raus. Hast du vielleicht ein Demo Projekt wo dieser verwendet wird?

Ich möchte mit dem Dialog erreichen dass bestimmte Benutzer (Programminterne Benutzer) am Dateisystem nicht manipulieren sondern z.b. eine Datei (Backup) abspeichern können (ggf auch auf einem USB-Datenträger).

Ich danke dir im Voraus für deine Zeit 🙂

Viele Grüße
Steffen

15.05.2008 - 11:12 Uhr

Hi,

danke nun klappts endlich 🙂

Gruß
Steffen

14.05.2008 - 16:46 Uhr

Hast du es getestet? irgendwie tut es bei mir nicht 🙁


public static void EnableSystemMenuItems(Form frm, bool Enable)
        {
            IntPtr hMenu;
            int n;
            uint wFlags;

            if (!Enable)
                wFlags = MF_BYCOMMAND | MF_DISABLED | MF_GRAYED;
            else
                wFlags = MF_BYCOMMAND | MF_ENABLED;
    
            hMenu = GetSystemMenu(frm.Handle, false);
            if (hMenu != IntPtr.Zero)
            {
                n = GetMenuItemCount(hMenu);
                if (n > 0)
                {
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_CLOSE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MAXIMIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MINIMIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_SIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MOVE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_RESTORE, wFlags);

                    DrawMenuBar(frm.Handle);
                }
            }
        }

14.05.2008 - 16:24 Uhr

Danke für deine Mühe ich hab es nun verstanden.

Kann mir jemand sagen warum ich die Menüeinträge (außer Schließen) nicht deaktivieren kann?

Ich habe es so probiert:


        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern int GetMenuItemCount(IntPtr hMenu);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern bool DrawMenuBar(IntPtr hWnd);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);

        private const Int32 MF_BYPOSITION = 0x400;
        internal const UInt32 MF_BYCOMMAND = 0x00000000;
        private const Int32 MF_REMOVE = 0x1000;
        internal const UInt32 MF_ENABLED = 0x00000000;
        internal const UInt32 MF_GRAYED = 0x00000001;
        internal const UInt32 MF_DISABLED = 0x00000002;
        
        enum SysCommands : uint
        {
            SC_SIZE = 0xF000,
            SC_MOVE = 0xF010,
            SC_MINIMIZE = 0xF020,
            SC_MAXIMIZE = 0xF030,
            SC_NEXTWINDOW = 0xF040,
            SC_PREVWINDOW = 0xF050,
            SC_CLOSE = 0xF060,
            SC_VSCROLL = 0xF070,
            SC_HSCROLL = 0xF080,
            SC_MOUSEMENU = 0xF090,
            SC_KEYMENU = 0xF100,
            SC_ARRANGE = 0xF110,
            SC_RESTORE = 0xF120,
            SC_TASKLIST = 0xF130,
            SC_SCREENSAVE = 0xF140,
            SC_HOTKEY = 0xF150,
            //#if(WINVER >= 0x0400) //Win95
            SC_DEFAULT = 0xF160,
            SC_MONITORPOWER = 0xF170,
            SC_CONTEXTHELP = 0xF180,
            SC_SEPARATOR = 0xF00F,
            //#endif /* WINVER >= 0x0400 */

            //#if(WINVER >= 0x0600) //Vista
            SCF_ISSECURE = 0x00000001,
            //#endif /* WINVER >= 0x0600 */

            /*
              * Obsolete names
              */
            SC_ICON = SC_MINIMIZE,
            SC_ZOOM = SC_MAXIMIZE,
        }
public static void EnableSystemMenuItems(Form frm, bool Enable)
        {
            IntPtr hMenu;
            int n;
            uint wFlags;

            if (!Enable)
                wFlags = MF_BYCOMMAND | MF_DISABLED;
            else
                wFlags = MF_BYCOMMAND | MF_ENABLED;
    
            hMenu = GetSystemMenu(frm.Handle, false);
            if (hMenu != IntPtr.Zero)
            {
                n = GetMenuItemCount(hMenu);
                if (n > 0)
                {
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_CLOSE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MAXIMIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MINIMIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_SIZE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_MOVE, wFlags);
                    EnableMenuItem(hMenu, (uint)SysCommands.SC_RESTORE, wFlags);

                    DrawMenuBar(frm.Handle);
                }
            }
        }

Es wird dann immer nur der "Schließen" Eintrag ausgegraut (disabled).
warum kann man die anderen Einträge nicht deaktivieren?

ich glaube, ich mach es bei mir nun vorerst mit ControlBox = true / false.... 😁

14.05.2008 - 14:33 Uhr

ich habe jetzt mal ein leeres Projekt erstellt und es versucht:


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

namespace Era
{
    public partial class Form1 : Form
    {

        protected override void WndProc(ref Message m)
        {
            const int WM_NCHITTEST = 0x84;
            const int HTCAPTION = 0x02;
            const int HTCLIENT = 0x01;
            const int HTBORDER = 18;
            const int HTOBJECT = 19;
            const int HTMENU = 5;
            const int HTSYSMENU = 3;
            const int WM_NCLBUTTONDBLCLK = 0xA3;
            const int WM_NCRBUTTONDOWN = 0xA4;

            //base.WndProc(ref m);

            //Systemmenü abfangen
            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTSYSMENU)
            {
                m.Result = (IntPtr)HTCLIENT;
                return;
            }

            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTMENU)
            {
                m.Result = (IntPtr)HTCLIENT;
                return;
            }

            //Verschiebung des Hauptformulars abfangen (bei allen Usern außer Admin!)
            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCAPTION)
            {
                m.Result = (IntPtr)HTCLIENT;
                return;
            }

            //Doppelklick auf die Titelleiste abfangen
            //if (m.Msg == WM_NCLBUTTONDBLCLK)
            //{
            //    //m.Result = (IntPtr)HTCLIENT;
            //    return;
            //}

            base.WndProc(ref m);
        }

        public Form1()
        {
            InitializeComponent();
        }
    }
}

das funktioniert so nicht, es geht nur wenn ich base.WndProc(ref m); vor den IF-Bedingungen ausführe.
Linksklick (kontextmenu) wird dabei dennoch nicht abgefangen, genauso wie Alt+Leertaste

Gibt es eventuell eine Möglichkeit die einzelnen Menüpunkte zu deaktivieren?

14.05.2008 - 14:23 Uhr

Ich verweise auf:


>

Hi,

ich sehe da keine Gemeinsamkeiten zum Thema hier!?
Kannst du mich mal aufklären 🤔

Steffen

14.05.2008 - 12:28 Uhr

Hallo Andreas,

danke für deine Antwort.

ich kriege dass irgendwie nicht hin, was mache ich falsch?

hier meine Funktion:


        protected override void WndProc(ref Message m)
        {
            const int WM_NCHITTEST = 0x84;
            const int HTCAPTION = 0x02;
            const int HTCLIENT = 0x01;
            const int HTMENU = 5;

            base.WndProc(ref m);

            //Verschiebung des Hauptformulars abfangen (bei allen Usern außer Admin!)
            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCAPTION && (oBenutzer.Userlevel != CvsInSightSecurityAccess.Full))
            {
                m.Result = (IntPtr)HTCLIENT;
            }

            //Systemmenü abfangen
            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTMENU && (oBenutzer.Userlevel != CvsInSightSecurityAccess.Full))
            {
                m.Result = (IntPtr)HTCLIENT;
            }

            //Doppelklick auf die Titelleiste abfangen
            if (m.Msg == 0x00A3 && (oBenutzer.Userlevel != CvsInSightSecurityAccess.Full)) // WM_NCLBUTTONDBLCLK
            {
                return;
            }
        }
14.05.2008 - 11:48 Uhr

Hallo,

wie kann man in einer Form das Systemmenü abfangen? (Rechtsklick in der Taskleiste, Rechtsklick auf das Icon, oder Alt+Leertaste)

Ich möchte zur Laufzeit entscheiden ob das Menü aufgehen darf oder nicht (abhängig vom angemeldeten Benutzer).

FormBorderStyle möchte ich nämlich nicht verändern, da es dann ohne Icon doof aussieht.

Hat jemand eine Idee?

Danke
Steffen

09.05.2008 - 07:57 Uhr

Hallo,

ich hab es nun hingekriegt, es lag doch am Report.

Wenn man so ein Dataset reinladen möchte, dann muss man das Report mit seiner DatasetSchema erstellen (als Verbindung die xsd Datei auswählen die man davor über dsDataset.WriteXmlSchema("D:\TestSchema.xsd") erstellt hat).

Dann sieht man nämlich die Felder aus dem Dataset und kann diese dann auch in den Bericht ziehen.

Danke für eure Mühe.

Steffen

08.05.2008 - 21:45 Uhr

Hallo,

die Datasource weise ich so zu:


crReport.SetDataSource(dsDataset);

//so geht es auch nicht:
crReport.SetDataSource(dsDataset.Tables[0]);

Das ganze funktioniert wenn ich eine Select Abfrage an ein gebundenen Report übergebe.

Wenn ich was beim Report falsch gemacht hätte dann hätte es doch sicherlich nicht diese Exception ausgelöst oder!?

Steffen

08.05.2008 - 11:33 Uhr

ich habe gerade festgestellt dass das Dataset korrekt gefüllt wird,
dieses beinhaltet dann auch eine Table mit den richtigen Daten und Columns...

Es liegt wohl nun an Crystal Reports, den ich erhalte eine DataSourceException "The report has no tables." beim Versuch die Datenquelle zu setzen (SetDataSource)

07.05.2008 - 17:05 Uhr

verwendetes Datenbanksystem: MySQL 5.0

Hallo,

Ich habe eine etwas komplizierte Union-Abfrage erstellt, diese funktioniert wenn ich sie direkt auf die Datenbank absetze (mit einem SQL-Client).

Ich möchte aber nun ein Dataset füllen um diesen dann mit Crystal-Reports weiter zu verarbeiten:


DataSet dsDataSet = new DataSet();
myCommand.Connection = msConn;
MySqlDataAdapter msAdapter = new MySqlDataAdapter(myCommand);
msAdapter.Fill(dsDataSet);

Dass hat bislang immer funktioniert (keine Union Abfragen).

so ist meine Abfrage prinzipiell aufgebaut:


(SELECT ... FROM t1 LEFT JOIN t3 ON t1.id=t3.id WHERE ...)
UNION ALL
(SELECT ... FROM t2 LEFT JOIN t3 ON t2.id=t3.id WHERE ...)
ORDER BY ... DESC

Das Dataset beinhaltet dann keine Tables nach dem "Fill", was dann natürlich eine Exception auslöst.

Wer hat ein Tip für mich?

Vielen Dank
Steffen

07.05.2008 - 16:40 Uhr

danke für euere Ratschläge. Ich werde sie beherzigen.

Gruß
Steffen

07.05.2008 - 09:48 Uhr

hier meine vorzeitige Lösung:


static public bool ValidatePW(string strPW)
        {
            Regex myRegexBuchstaben = new Regex(@"[a-zA-ZäöüßÄÖÜ]");
            Regex myRegexZahlen = new Regex(@"[0-9]");
            
            MatchCollection myMatchesBuchstaben = myRegexBuchstaben.Matches(strPW);
            MatchCollection myMatchesZahlen = myRegexZahlen.Matches(strPW);

            if (myMatchesBuchstaben.Count >= iSettingPWMinLetters && myMatchesZahlen.Count >= iSettingPWMinDigits)
                return true;
            else
                return false;
        }
07.05.2008 - 09:28 Uhr

Hi,

stimmt, man kann es ganz leicht mit Zwei Regex-Regeln lösen.

Ich wollte es in einem Pattern unterkriegen, geht wohl nicht!?

Mal so nebenbei:
Das du hierfür Regex verwenden willst entspricht dem Tatbestand "Mit Kanonen auf Spatzen schießen.".

Hast du den einen Revolver in der Tasche? 🙂 Womit man es auch in gleicher Anzahl der Codezeilen lösen kann?

Ich dachte halt, jetzt ist die Zeit gekommen um sich mit Regex-Pattern auseinanderzusetzen 😉

Danke für deine Antwort.

Gruß
Steffen

07.05.2008 - 09:15 Uhr

Hallo Leute,

ich möchte in meinem Programm die Passwörter (beim anlegen/ändern) validieren.

Ein Passwort muss eine minimale Anzahl an Buchstaben und Zahlen beinhalten.

Ich hab es so probiert:

[a-zA-Z]{min, 3}[0-9]{min, 2}
[(a-zA-Z){min, 3}(0-9){min, 2}]

Die minimale Anzahl der Buchstaben sollte variabel sein (ersetze ich dann durch eine Variable)

Die minimale Anzahl der Zahlen sollte variabel sein (ersetze ich dann durch eine Variable)

Nun ist es ja so, dass die Zahlen und Buchstaben wild duchgemischt sein können.

Ich habe das Regex-Tutorial schon durch.

Kann mich jemand in die richtige Richtung schubsen? 🙂

Danke
Steffen

24.04.2008 - 11:46 Uhr

Hallo,

Danke für eure Antworten.

Ich habe es mit 12 Elementen gemessen, die for-Schleife ist ein Tick schneller (was sich natürlich nicht bemerkbar macht...)

Ich habe es nun auf die normale FOR-Schleife umgestellt.

24.04.2008 - 10:14 Uhr

Hallo Leute,

ich habe eine generische Liste:


public static List<InsightCam> Cameras = new List<InsightCam>();

InsightCam ist eine Klasse die ich geschrieben habe. Diese befülle ich beim Laden der Form.

Wenn ich nun alle Elemente durchgehen will, welche schleife ist schneller?

A: Die normale For-Schleife?


int iNumOfCams = Cameras.Count;
for (int i = 0; i < iNumOfCams; i++)
{
//...
}

B: Die Foreach-Schleife?


foreach (InsightCam var in Cameras)
{
//...
}

Wer hat das schon mal gemessen? Teilt mit mir euer Wissen 🙂

Danke!
Steffen

22.04.2008 - 17:19 Uhr

Hallo,

ich habe den Fall das ein Event zweimal zur gleichen Zeit ausgelöst wird und dadurch einen Absturz(Deadlock!? CPU ist dann voll ausgelastet).

Gibt es eine Möglichkeit die Aufrufliste mit debug.writeline auszugeben?

Ich kann es nämlich nicht so einfach debuggen, da es sporadisch passiert.

gruß
Steffen

17.04.2008 - 13:40 Uhr

ok, das beruhigt mich 🙂

danke!

17.04.2008 - 13:24 Uhr

Hallo Leute,

ich habe das Tool "Process Explorer" mir mal installiert und die Infos zu meinem Programm angeschaut.
Wenn ich das Tab ".NET" aufmache und dort dann in der ComboBox ".NET CLR Interop" auswähle dann sehe ich in der Liste unterhalb folgende Werte:

of CCWs => 41

of Stubs => 491

of marshalling => 48437

of TLB imports/sec => 0

of TLB exports/sec => 0

Nun steigt der Wert bei "# of marshalling" ständig!
Was hat der Wert zu bedeuten?
Habe ich irgendwo einen Speicherfresser drin?

Die Speicherauslastung ist laut TaskManager stabil.

MFG
Steffen

18.03.2008 - 10:39 Uhr

Hallo Bernd,

als Fehler habe ich es auch nicht bezeichnet 😉
manchmal ist diese Funktionalität schon nützlich...

naja, ich schau mal wie ich damit sonst zurechtkomme...

Grüße
Steffen

18.03.2008 - 10:16 Uhr

Hi,

das funktioniert leider auch nicht 🙁

wenn ich beim debuggen die Eigenschaften nach dem Befehl (genauso wie bei meinem Code auch) anschaue dann steht in der Text-Eigenschaft "String1\r\nString2" und in der Bezeichnung des Tabs steht dann "String1String2"...

Gruß
Steffen

18.03.2008 - 09:58 Uhr

Hallo Leute,

ich stelle in der Bezeichnung eines TabPages zwei Informationen in zwei Zeilen dar:


tabCam.Text = strName + "\r\n" + strJobname;

Dies funktioniert nicht mehr sobald man das Windows-Design auf "Windows klassisch" umgestellt hat. Dann wird CR-LF einfach verschluckt.

Wie kann man den Text dennoch zweizeilig anzeigen lassen?

MFG
Steffen

18.03.2008 - 09:22 Uhr

*HOCHSCHIEB* 😁

Hat den keiner eine Idee?

Gruß
Steffen

13.03.2008 - 12:28 Uhr

Hallo Allerseits,

ich habe mit Hilfe des Setup-Assistenten ein Setup Projekt für meine Application erstellt. Und noch paar Dateien hinzugefügt.

Folgendes Problem:

Ich installiere das Setup auf einem anderem Rechner. Nun lösche ich eine Datei aus dem Installationsverzeichnis welche zur Installation gehört und starte mein Programm, dann wird der Installer aufgerufen und die gelöschte Datei wiederhergestellt. Genau diese Funktionalität möchte ich für bestimmte Dateien ausschalten oder auch generell abschalten!? Wie mache ich das?

Also nochmal kurz und bündig:
Wenn man eine installierte Datei (z.b. pdf, oder txt) umbenennt oder löscht dann wird beim Starten des Programms der Installer aufgerufen und die Datei nachinstalliert! Wie kann man dies verhindern?

Ich habe keine Einstellung im Setup gefunden die diese Funktionalität steuert.

Ich benutze Visual Studio 2005 Prof.

Vielen Dank im Voraus

Gruß
Steffen D.

17.01.2008 - 12:05 Uhr

ich habe nun andere samples für C# die auch mit 2005 funktionieren gefunden:
[URL]http://www.gotdotnet.com/community/usersamples/Default.aspx?query=ftp&Sites=([URL]www.GotDotNet.com)[/URL]

16.01.2008 - 08:54 Uhr

Hallo ich glaube dass es an der funktion liegt?

hier die originale:


//Passive Mode Data Transfer Listner.
		private Socket PassiveClientSocket(ref TCPListener clientDataListner,int intPort)
		{
			Thread oThread=Thread.CurrentThread;
			lock(oThread)
			{
				try
				{
					if(clientDataListner.LocalEndpoint==null)
					{
						bool done=false;
						Socket s=null;
						try
						{
							s= clientDataListner.Accept();	
							done=true;
						}
						catch(Exception e)
						{
							
						}
						return s;	
					}
					else
					{
						Socket s= clientDataListner.Accept();
						return s;	
					}
				}
				catch(Exception e)
				{
					Console.ClientConnect(ClientID,e.StackTrace);
				}
				return null;
			}
		}

und hier wie ich sie portiert habe:


private Socket PassiveClientSocket(ref TcpListener clientDataListner,int intPort)
		{
			Thread oThread=Thread.CurrentThread;
			lock(oThread)
			{
				try
				{
					//if(clientDataListner.LocalEndpoint==null)
                    if (((IPEndPoint)clientDataListner.LocalEndpoint).Address.ToString() == "0.0.0.0")
					{
						Socket s=null;
						try
						{
                            //s = clientDataListner.Accept();
                            s = clientDataListner.AcceptSocket();
						}
						catch(Exception)
						{
							
						}
						return s;	
					}
					else
					{
                        //Socket s = clientDataListner.Accept();
                        Socket s = clientDataListner.AcceptSocket();
						return s;	
					}
				}
				catch(Exception e)
				{
					Console.ClientConnect(ClientID,e.StackTrace);
				}
				return null;
			}
		}

habe ich da was missverstanden?

MFG
Steffen

15.01.2008 - 17:37 Uhr

Hallo,

es liegt wohl an der Verarbeitung des Befehls PASV! Danach steigt jeder FTP-Client aus.

Ich habe mal die Pakete abgefangen und miteinander verglichen (mit denen von Filezilla FTP-Server) und habe folgendes festgestellt:

Wenn ich Filezilla-Server verwende dann ist das Paket so aufgebaut:

File Transfer Protocol (FTP)
227 Entering Passive Mode (192,168,100,13,9,248)\r\n
Response code: Entering Passive Mode (227)
Response arg: Entering Passive Mode (192,168,100,13,9,248)
Passive IP address: 192.168.100.13 (192.168.100.13)
Passive port: 2552

Das Paket wo von meinem Programm versendet wird sieht so aus:

File Transfer Protocol (FTP)
227 Entering Passive Mode (192,168,100,32,4,76)\r\n
Response code: Entering Passive Mode (227)
Response arg: Entering Passive Mode (192,168,100,32,4,76)
Passive IP address: 192.168.100.32 (192.168.100.32)
Passive port: 1100
Passive IP NAT: True

Wie ihr seht ist da das Passive IP NAT auf TRUE gesetzt. Liegt es vielleicht daran? Wenn ja, wie kann ich es auf false setzen?

Vielen Dank im Voraus.
Steffen

15.01.2008 - 15:23 Uhr

Hallo Leute,

danke für eure Antworten.

ich versuche nun den FTP-Server http://www.c-sharpcorner.com/internet/FTPServerinCSharp.asp
auf C# 2005 zu portieren.

Im aktiv-Modus läuft alles wuderbar! Im passiv-Modus bleibt der FTP-Client beim LIST Befehl stehen.

Kann bitte einer drüberschauen und ausprobieren? als Client habe ich Filezilla verwendet.

Vielen Dank im Voraus

11.01.2008 - 17:52 Uhr

Hallo Leute,

kennt jemand eine einfache FTP-Server Klasse in C#?
Ich möchte mit dem Server lediglich Bilder empfangen, also nichts komplexes.

Oder kann man es mit C#-Board-Mitteln realisieren? (es muss unbedingt ftp sein)

Ich habe übrigens auf diversen seiten schon gesucht, da gibts nur eine C++-Klasse...

Vielen Dank für eure Mühe!
Gruß
Steffen

12.12.2007 - 10:17 Uhr

Hallo Leute,

ich möchte Symbole für Menüs-Einträge und vielleicht auch für eine Toolbar verwenden. Diese habe ich bereits alle in einem Bild (bmp). Die Symbole sind praktisch aneinandergereiht, d.h. das bild ist 16x1088 wobei 68 symbole drin sind.

ich habe versucht das bild in eine imagelist zu laden und über index auszuwählen, dem ist es aber nicht so.

ich möchte die bilder zur entwurfszeit einem menü oder button zuweisen können.
Gibts da einen Trick dabei? oder muss ich die Bitmaps manuell auftrennen? Gibts da Programme dafür? (ich hab bei XnView nichts gefunden)

Danke im Voraus

Steffen

11.12.2007 - 14:14 Uhr

ja genau dass habe ich gerade auch festgestellt... wenn man nicht direkt auf die form klickt, werden die klicks nicht abgefangen oder erkannt.

ich danke dir schon mal! nett von dir 👍

11.12.2007 - 12:10 Uhr

Wenn er nur eine Form benutzt hast du natürlich recht mit protected override void OnMouseDown(MouseEventArgs e) den Timer Stoppen bzw neu starten.

Hallo,

werden dann auch die Klicks die ich auf Controls tätige abgefangen? (z.b. Button oder Tabstrip...)

ich benutze vorerst nur eine form.

würde es dann so aussehen?


protected override void OnMouseDown(MouseEventArgs e)
{
if (timerLogout.Enabled)
{
    timerLogout.Stop();
    timerLogout.Start();
}

}

werden die Klicks dann dennoch weitergeleitet und ggf. verarbeitet? oder werden diese geschluckt? Wenn ja, wie leitet man diese weiter an das system? (base.OnMouseDown(e) oder wie?)

ich habe im programm schon ein keyboardhook eingebaut

Danke
Steffen

11.12.2007 - 10:54 Uhr

Hallo Leute,

ich möchte in meinem Programm eine AutoLogout Funktion einbauen. D.h. der Benutzer wird automatisch nach Ablauf einer definierten Zeit ausgeloggt.
Sobald der Benutzer irgendeine Taste drückt (Tastatur oder Maus) soll sich die Zeit wieder zurücksetzen.

Das mit der Tastatur habe ich nun drin. Mir fehlen jetzt nur noch Mausklicks.

Wie kann man Mausklicks Programmweit (also nur in meinem Programm, aber auf allen controls, menüs usw.) überwachen? Ich möchte praktisch bei jedem Mausklick den Timer zurücksetzen.

Über die Suche habe ich leider nichts finden können.

Vielen Dank im Voraus.

Steffen

23.08.2007 - 09:52 Uhr

Hallo,

vielen Dank für eure Antworten, dass habe ich mir schon fast gedacht...

werde es dann einfach zur laufzeit überprüfen

Gruß
Steffen

21.08.2007 - 14:45 Uhr

Hallo Leute,

wie kann man es machen?

hab verschiedenes probiert:


public bool WritePZD(UInt16[2] val) 
{
...
}

nur so scheint es zu gehen:


public bool WritePZD(UInt16[] val) 
{
...
}

kann man die Anzahl der Werte im Array nicht festlegen?

Vielen Dank im Voraus
Steffen

17.08.2007 - 09:38 Uhr

Hallo,

danke für deine Bemühung,
ich hab es nun rausgefunden:

Guid temp = typeof(IOPCGroupStateMgt).GUID;

Gruß
Steffen

02.08.2007 - 09:00 Uhr

Hallo,

ich brauche für den Aufruf einer Funktion die GUID von einem Interface, diese auch noch als referenz (mit ref)...

so habe ich bereits ausprobiert:


Guid temp = (Guid)IOPCGroupStateMgt;
//OpcRcw.Da.IOPCGroupStateMgt" ist ein(e) "Typ", wird aber wie ein(e) "Variable" verwendet.

Guid temp = GetType(IOPCGroupStateMgt).GUID;
//OpcRcw.Da.IOPCGroupStateMgt" ist ein(e) "Typ", wird aber wie ein(e) "Variable" verwendet.

IOPCGroupStateMgt m_group2;
Guid temp = m_group2.GetType().GUID;
// In dem Fall wird eine NullReferenceException ausgelöst, mit new lässt es sich auch nicht instanzieren.

ich hab das ganze als Beispiel in C++ (6.0) und da ist es so drin wie die zweite Methode...

hat jemand eine Idee?

Danke im Voraus
Steffen

30.07.2007 - 08:25 Uhr

Ja die Funktion erwartet einen Zeiger auf das Array, nur wie mache ich das?

ich hab so probiert:


OPCITEMRESULT[] m_pItemResult;
IntPtr pItemResult = IntPtr.Zero;
pItemResult = (IntPtr)m_pItemResult[0];
m_item.AddItems(4, m_Items, out pItemResult, out pErrors);

es geht hier um den dritten Parameter von AddItems, diese Funktion ist so definiert:

void AddItems(int dwCount, OPCITEMDEF[] pItemArray, out IntPtr ppAddResults, out IntPtr ppErrors)

wenn ich es so mache wie ich geschrieben habe, dann Spuckt mir der Kompiler diesen Fehler:

Eine Konvertierung vom Typ "OpcRcw.Da.OPCITEMRESULT" in "System.IntPtr" ist nicht möglich.

Hat jemand eine Idee?
wie kann man einen IntPtr auf einen Array (vom beliebigen Typ) umbiegen?

Gruß
Steffen

27.07.2007 - 09:26 Uhr

Hallo Leute,

ich muss eine schnittstelle einbinden,,,

diese hat eigene Typen und Strukturen...

eines davon ist diese:

OPCITEMRESULT[] m_pItemResult;

nun muss ich eine Funktion aufrufen die diesen Array als Zeiger (out IntPtr) haben möchte...

wie mach ich das?
oder wie kann man einfach einen IntPtr in ein StrukturArray umwandeln?

Danke
Steffen

30.05.2007 - 10:13 Uhr

Original von boonkerz
Hallo,

Kennt jemand ein verlgeichbares Programm wie CAO Wawi?

Wenn nein lohnt sich eine neu Entwicklung?

MFG

Hallo boonkerz,

hast du bereits was passendes gefunden?

Vielleicht gibts ja was, welches man dann weiterentwickeln kann, damit man nicht von null anfangen muss!?

Gruß
Steffen

24.05.2007 - 10:31 Uhr

Hallo,

ich habe diese klasse erweitert und noch den Parameter AllowOnlyAlphaNumeric hinzugefügt

und dann die HookCallback um eine Abfrage erweitert:


if (AllowOnlyAlphaNumeric)
                {
                    AllowKey = true;
                    //STRG+ESC
                    if (((NativeMethods.GetKeyState(VK_CONTROL) & 0x8000) != 0) && lParam.vkCode == VK_ESC)
                        AllowKey = false;
                    //ALT+ESC
                    if (((NativeMethods.GetKeyState(VK_MENU) & 0x8000) != 0) && lParam.vkCode == VK_ESC)
                        AllowKey = false;
                    //ALT+TAB
                    if (((NativeMethods.GetKeyState(VK_MENU) & 0x8000) != 0) && lParam.vkCode == VK_TAB)
                        AllowKey = false;
                    //ALT+F4
                    if (((NativeMethods.GetKeyState(VK_MENU) & 0x8000) != 0) && lParam.vkCode == VK_F4)
                        AllowKey = false;
                    // left win und right win
                    if ((lParam.vkCode == 91) || (lParam.vkCode == 92))
                        AllowKey = false;
                    // STRG+ALT+ENTF
                    //if (((NativeMethods.GetKeyState(VK_CONTROL) & 0x8000) != 0) &&
                    //    ((NativeMethods.GetKeyState(VK_MENU) & 0x8000) != 0) && lParam.vkCode == VK_DEL)
                    //    AllowKey = false;
                }

STRG+ALT+ENTF lässt sich so nicht abfangen, dass habe ich da zwar versucht, diese werden auch erkannt und versucht zu blocken, windows kriegt es aber dennoch mit... deshalb hab ich einfach nur den Taskmanager deaktiviert...
und am ende beim Dispose von der Klasse wieder aktiviert...

Gruß
Steffen

23.05.2007 - 16:11 Uhr

ja mit diesen Hooks funktionierts einwandfrei 😉
(Klasse siehe link oben)

ich hab nur noch den Taskmanager deaktiviert:


//Taskmanager deaktivieren
                regKey = Registry.CurrentUser.OpenSubKey(
                    @"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);
                if (regKey == null)
                    regKey = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
                regKey.SetValue("DisableTaskMgr", 1, RegistryValueKind.DWord);

und dann wieder aktiviert falls sich ein Admin anmeldet


//TaskManager wieder aktivieren
        RegistryKey regKey = Registry.CurrentUser.OpenSubKey(
                    @"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);
        if (regKey != null)
            regKey.SetValue("DisableTaskMgr", 0, RegistryValueKind.DWord);

Vielleicht braucht das jemand 😉

Gruß
Steffen

22.05.2007 - 09:15 Uhr

Hallo,

ich bin nun auch an dem Thema angelangt.

Ich habe auch schon gelesen dass man Str+Alt+Entf nicht 100%ig sperren kann.

Wie sieht es mit diesen aus:?
Alt+F4
Strg-Esc
Windows-Taste

Hat da jemand einen Tip parat? 🙂

Vielen Dank

Gruß
Steffen

EDIT:
ich hab diese Klasse nun für meine Bedürfnisse angepasst 😉http://www.codeproject.com/cs/system/CSLLKeyboard.asp