Laden...

Forenbeiträge von jase Ingesamt 39 Beiträge

09.03.2009 - 19:47 Uhr

klingt soweit gut - hast du da auch evt ein beispiel zu?

danke,
jan

09.03.2009 - 19:27 Uhr

guten abend,

ich habe eine klasse erstellt, welche ueber einen thread daten von mehreren, per usb angeschlossenen, sensoren bekommt.
nun habe ich mehrere forms, auf denen sich mehrere labels befinden, die ich gerne mit den ausgelesenen sensorwerten fuettern moechte.

wie realisier ich das unter c# am besten?
meine erste idee war ein array by ref an die klasse mitzugeben, nur funktioniert das a) nicht fuer mehrere forms, da ich nur eine instanz der klasse haben moechte und b) ist das sicherlich nicht wirklich c# konform.

wie realisiere ich das am besten?

danke,
jan

09.03.2009 - 19:13 Uhr

Hallo jase,

kompiliere nicht in eine EXE, sondern in eine DLL. Die kannst du dann mit Assembly.Load o.ä. in das laufende Programm einbinden.

herbivore

ah ok:


  // Generate an executable instead of 
    // a class library.
    cp.GenerateExecutable = true;

ich setze das einfach auf false, generiere eine dll und lade diese dann mittels assembly.load zur laufzeit ein, danke!

09.03.2009 - 19:06 Uhr

Das Erzeugen einer Assembly durch Kompilieren von Quelltext mithilfe einer
>
-Implementierung (z.B. ) für eine konkrete .NET-Sprache, die den benutzerdefinierten Typ enthält.
Link:
>

das beispiel hab ich mir angeschaut - wenn ich das aber richtig verstehe wird ein komplett neues programm generiert und in eine neue .exe gepackt.
ich wuerde aber gerne den code, den ich aus der source datei lade compilieren und dann in meinem bestehenden programm verwenden.
ich stelle mir das beispielsweise so vor, dass ich auf einen button klicke: der code wird aus der datei geladen, kompiliert und direkt ausgefuehrt - ohne umweg via eines komplett neuen programms.

ist das auch moeglich?

gruss,
jan

09.03.2009 - 08:51 Uhr

ok, danke.

was spricht denn gegen Thread.Sleep?

09.03.2009 - 08:30 Uhr

ein generiertes skript sieht zbsp wie folgt aus:


while(true)
{
Led[0] = 25;
Led[2] = 0;
Led[3] = 25;
Led[5] = 25;
WriteToDevice(Data);
for(i=0; i <= 25; i++)
{
Led[0] = (byte)(25-i);
Led[6] = (byte)(25-i);
WriteToDevice(Data);
}
System.Threading.Thread.Sleep(2000);
Status = 25;
WriteToDevice(Data);
Status = 0;
WriteToDevice(Data);
}

@herbivore
wenn es auch eine dritte ernstzunehmende loesung gibt, wieso diese nicht auch beachten?

mfg,
jan

08.03.2009 - 23:05 Uhr

danke!

ist eine der anderen methode vorzuziehen?

gruss,
jan

08.03.2009 - 22:32 Uhr

guten abend,

ich wuerde gerne wissen wie es moeglich ist ein c# programm zu erstellen, welches sourcecode "just in time" kompilieren kann.
konkret geht es um das erstellen eines skript generators, der die erstellten skripte auch starten soll.

kann mir wer ein paar tipps geben?

danke,
jan

25.05.2008 - 16:27 Uhr

ok,dann hab ich das richtig implementiert 🙂

25.05.2008 - 15:53 Uhr

moin,

sollte man für jedes einzelne sql kommando die verbindung öffnen und direkt danach wieder schliessen, oder ist es genauso gut die verbindung am anfang der methode zu öffnen und am ende wieder zu schliessen?

jase

22.05.2008 - 22:40 Uhr

danke, deine antwort zu 1) werd ich morgen ausführlich testen, 2) war genau das was ich gesucht habe, danke 🙂)

22.05.2008 - 21:39 Uhr

hallo,

sql ansich ist mir geläufig, jedoch hapert es noch in der umsetzung in c#.. sehe da den wald vor lauter bäumen nicht mehr:

1.
wie kann ich zbsp checken, ob eine bestimmte spalte/column überhaupt besteht?

2.
gibt es außerdem die möglichkeit die ausgabe einer reihe in nur einer variablen zu bekommen, anstatt in nem ganzen dataset?
gemeint ist zbsp folgendes:

SELECT Summe FROM math WHERE aufgabe = '1a'

in genau dieser reihe steht zbsp als tabelleninhalt '3'. ich möchte jetz eigtl nur, dass ich mit dem o.g. sql query diese zahl extrahieren und in eine variable stopfen kann.

ne seite mit nem gut verständlichen howto wäre auch wünschenswert, hab schon vieles via google gefunden, aber ne essenz, kurz und knackig, irgendwie nicht.

jase

02.05.2008 - 12:36 Uhr

herbivore,
das hab ich schon durchgelesen, jedoch sind meine kentnisse nicht so perfekt dass ich meinen fehler sehe.. ich vermute momentan dass es daran liegt, dass ich den handle beim aufruf von enumchildwindows() in einen int32 konvertiere?

der handle wird beim aufruf ja mitgegeben aber nach dem control aufruf "genullt".

02.05.2008 - 12:22 Uhr

knallt:

System.NullReferenceException was unhandled
Message="Object reference not set to an instance of an object."
Source="WindowsApplication2"
StackTrace:
at WindowsApplication2.Form1.EnumWindow(IntPtr handle, IntPtr pointer) in X:\stick\code\csharp\WindowsApplication2\WindowsApplication2\Form1.cs:line 45
at WindowsApplication2.Form1.EnumChildWindows(Int32 hWndParent, Delegate lpEnumFunc, Int32 lParam)
at WindowsApplication2.Form1.init() in X:\stick\code\csharp\WindowsApplication2\WindowsApplication2\Form1.cs:line 79
at WindowsApplication2.Form1.button2_Click(Object sender, EventArgs e) in X:\stick\code\csharp\WindowsApplication2\WindowsApplication2\Form1.cs:line 150
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms. UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsApplication2.Program.Main() in X:\stick\code\csharp\WindowsApplication2\WindowsApplication2\Program.cs:line 17
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

so sieht momentan mein code aus:


       public bool EnumWindow(IntPtr handle, IntPtr pointer)
        {
            uint SWP_SHOWWINDOW = 0x0040;
            Control ctrl = Form.FromHandle(handle);
            MessageBox.Show(ctrl.GetType().ToString());
            SetWindowPos(handle, IntPtr.Zero, xTop, yTop, xBottom, yBottom, SWP_SHOWWINDOW);
            SetForegroundWindow(handle);
            return true;
        }

        void init()
        {

                foreach (Process p in processes)
                {
                    if (p.MainWindowTitle.Contains("tolles"))

                    {

                        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
                        EnumChildWindows(p.MainWindowHandle.ToInt32(), childProc, 0);
                    }
                }
            }
        }

edit:
und noch ne frage:
mit setpos kann ich zwar die größe des fenster ändern, aber ne option für maximieren hab ich nicht gefunden.. mir reicht zwar für diesen einen fall das angeben von werten, die außerhalb des zulässigen bereiches sind (da das fenster dann eh nicht größer sein kann), aber wie löst man das sonst? resizen ist ja nicht das gleiche wie maximieren...

02.05.2008 - 09:17 Uhr

das war der richtige tipp; ich hatte das


EnumWindowProc childProc = new EnumWindowProc(EnumWindow);

vergessen.
allerdings ist der effekt nicht ganz wie gewünscht: stattdessen, dass er für beide offene fenster die im namen "tolles" haben diese größer macht und in den vordergrund setzt maximiert er die textbox von einem der beiden fenster..
ich vermute dass das daran liegt dass enumchildwindows auf einen teil des fensters anspringt, in diesem fall wohl die textbox.
wie komme ich an den von mir gewünschten effekt (beide fenster in eine neue position bringen & in den vordergrund bringen)?

jase

01.05.2008 - 22:11 Uhr

vlt noch wichtig zu erwähnen:

bei dem programm ist die handhabung ähnlich wie zbsp firefox, welchen man auch mehrmals geöffnet haben kann.. es handelt sich also nicht um nur ein fenster, sondern um mehrere, die aber trotzdem alle zum gleichen prozess gehören..

01.05.2008 - 21:27 Uhr

ich hab jetz einiges probiert, versucht den pinvoke.net vorschlag umzuarbeiten, kriegs aber einfach ned hin X(

hier mal was ich hab:


        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool EnumChildWindows(int hWndParent, Delegate lpEnumFunc, int lParam);

        public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[...]

        public bool EnumWindow(IntPtr handle, IntPtr pointer)
        {
            uint SWP_SHOWWINDOW = 0x0040;
            SetWindowPos(handle, IntPtr.Zero, xTop, yTop, xBottom, yBottom, SWP_SHOWWINDOW);
            SetForegroundWindow(handle);
            return true;
        }

[...]

Process[] processes = Process.GetProcessesByName("notepad");
foreach (Process p in processes)
                {
                    if (p.MainWindowTitle.Contains("tolles"))
                         EnumChildWindows(p.MainWindowHandle, EnumWindow, 0);
                }

die fehler sind dann:

Error 1 The best overloaded method match for 'WindowsApplication2.Form1.EnumChildWindows(int, System.Delegate, int)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'System.IntPtr' to 'int'
Error 3 Argument '2': cannot convert from 'method group' to 'System.Delegate'

ansich ja alles verständliche fehlermeldungen, aber egal wie ich es biege; für jeden gelösten fehler kommen 2 neue 🙁

kann mir jemand vlt etwas auf die sprünge helfen?

jase

29.04.2008 - 11:43 Uhr

an die geschachtelte for schleife hab ich auch schon gedacht,jedoch ist meine anwendung zeitkritisch - da wäre ein "hässlicher" if wahrscheinlich schneller..

edit: jack, das klingt in der tat sehr logisch - nur die eckpunkte vergleichen.. danke!

29.04.2008 - 11:17 Uhr

ich würde das thema gerne nochmal aufgreifen da ich ähnliches machen möchte, jedoch einiges einfacher.

ich möchte zbsp auf einem 60x20pixel großen bild alle zahlen erkennen können. die zahlen haben immer die gleiche form, sind in schwarz auf variablem farbigen hintergrund.
nein, es geht hier nicht um eine captcha erkennung oder ähnliches; es geht immer noch um mein makrorekorder projekt 😁
da es ja ingesamt nur 10 zahlen gibt, die alle die gleiche größe/schrift haben hab ich mir nun zwei sachen überlegt:

ich habe die hexwerte jedes pixels in einem 2d string array. erst müsste man alle zahlen seperieren - das könnte man so lösen indem man einfach schaut, ob eine spalte im array keine schwarzen pixel hat == neue zahl.
für die eigtl erkennenung der zahlen folgendes:

  1. man durchsucht das array bis zum ersten schwarzen pixel und versucht dann durch eine ellenlange if bedingung pro zahl die zahl zu erkennen, indem man alle positionen in relation zum ersten schwarzen pixel überprüft.
    sehr unschön meiner meinung nach.

  2. man erstellt für jede zahl ein eigenes array und vergleicht dann die zahlen arrays mit dem array des bildes. hier wüsste ich aber noch keine sinnvolle lösung wie ich zwei arrays miteinander vergleiche - vorallem wenn das bild array ja größer ist da es mehrere zahlen beinhaltet im gegensatz zum array pro zahl.

irgendwelche comments/ratschläge? 😉

jase

28.04.2008 - 13:48 Uhr

danke für den tipp, hab aber in der zwischenzeit was anderes gefunden. funktioniert jetzt:


        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
        int X, int Y, int cx, int cy, uint uFlags);

[...]

            Process[] processes = Process.GetProcessesByName("notepad");
            uint SWP_NOMOVE = 0x0002;


            foreach (Process p in processes)
            {

                string windowTitle = p.MainWindowTitle;
                if (windowTitle.Contains("tolles") == true)
                {
                    MessageBox.Show("gefunden: " + windowTitle);
                    SetWindowPos(p.MainWindowHandle, IntPtr.Zero, 10, 10, 900, 900, SWP_NOMOVE);
                }
            }

danke trotzdem!

edit:
das funktioniert leider auch nur für den zuletzt aktivierten child des prozesses.. für alle childs muss ich wohl nochmal suchen..

28.04.2008 - 13:26 Uhr

das hilft mir schonmal weiter.

via google hab ich nochwas intressantes gefunden:
http://www.mycsharpcorner.com/Post.aspx?postID=32
das wäre im grunde perfekt für mich, das problem ist nur dass ich nicht weiß wie ich auf child windows des gefundenen prozesses zugreifen kann. wenn ich nur den namen der exe angebe findet er nur das fenster des prozesses, welches zuletzt aktiv war.

schön wäre ne möglichkeit ein fenster zu finden, indem man nach teile des title suchen könnte..
also wenn das fenster zbsp als titel "das ist ein tolles window" hat wäre es toll, wenn ich nur nach "tolles" suchen kann und er mir dann den handle gibt.

28.04.2008 - 10:08 Uhr

leider ein externes 😭

28.04.2008 - 09:03 Uhr

morgen,

wie kann ich ein bestimmtes fenster auf seine maximal größe resizen lassen (fenster kann nicht auf fullscreengröße vergrößert werden, dennoch möchte ich mit einem programm sicherstellen können, dass das fenster in seiner maximalen größe ist.)

jase

23.04.2008 - 18:27 Uhr

atomrolfman,
du hattest vollkommen recht:


Screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(Screenshot);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            

            NewScreenshot = new bmp.FastBitmap(Screenshot);

so gehts - spart leider "nur" eine sekunde..

edit:
wenn ich das ganze string splitten weglass, spar ich gute 4sek.. nur sehe ich keine möglichkeit direkt den hexwert aus der getpixel geschichte zu holen.

edit2:
das ganze string geschnibbsel hätte ich mir sparen können - man kann die RGB werte direkt abrufen..
bin bei 3,5 sekunden 8)

edit3:
und nochmal was weg: 2sek.

23.04.2008 - 16:57 Uhr

hab ich auch getan, nur eben mit der dll. sieht dann so aus:


bmp.FastBitmap Screenshot;
[...]
Screenshot = new bmp.FastBitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);

nur mag er dann die o.g. zeile nicht...

23.04.2008 - 15:33 Uhr

mh, dann bekomme ich aber logischerweise bei


gfx = Graphics.FromImage(Screenshot);

Error 1 The best overloaded method match for 'System.Drawing.Graphics.FromImage(System.Drawing.Image)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'bmp.FastBitmap' to 'System.Drawing.Image'

wie löse ich das?

jase

23.04.2008 - 14:38 Uhr

sorry wenn ich das jetzt nochmal hochhole:

mir ist es gelungen ein screenshot des bildschirms zu machen und jeden pixel als hexwert in ein 2d array zu setzen. bei 1024*768 pixel dauert das ~2,5 sekunden dank der Fast Bitmap DLL.

vielleicht sieht ja jemand noch optimierungen für meinen code?
ich hatte zbsp dran gedacht sowas wie eine history für den n-1 pixel einzufügen, sinnvoll zbsp wenn der bildschirm viele weiße flächen hat.. hab das aber noch nicht realisiert.


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


            Stopwatch sw = new Stopwatch();
            sw.Start();

            Bitmap Screenshot;
            bmp.FastBitmap FastScreenshot;
            Graphics gfx;
            Color pixelColor;
            string R,G,B;
            string[,] hexArray = new string[Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height];
            
            Screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(Screenshot);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            FastScreenshot = new bmp.FastBitmap(Screenshot);

            for (int i = 0; i < Screen.PrimaryScreen.Bounds.Width; i++)
            {
                for (int j = 0; j < Screen.PrimaryScreen.Bounds.Height; j++)
                {
                    //pixel detection
                    pixelColor = FastScreenshot.GetPixel(i, j);
                    
                    //rgb -> hex konvertierung
                    R = pixelColor.R.ToString("x");
                    G = pixelColor.G.ToString("x");
                    B = pixelColor.B.ToString("x");
                    
                    //bei zahlen unter 16 ist zbsp 10 = A und nicht 0A, daher 0 drankleben
                    if (R.Length == 1)
                        R = "0" + R;
                    if (G.Length == 1)
                        G = "0" + G;
                    if (B.Length == 1)
                        B = "0" + B;
                      
                    hexArray[i,j] = R + G + B;
                }
            }

            sw.Stop();
            MessageBox.Show("Das Einlesen von " + (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height)
                            + " Pixeln hat " + sw.ElapsedMilliseconds + "ms gedauert. Das sind " +
                            (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height / sw.ElapsedMilliseconds)
                            + " Pixel/ms."); 

danke im vorraus,
jase

09.09.2007 - 09:57 Uhr

wieso begrenzt du das ganze denn auf 256 farben?

Graphics.CopyFromScreen krieg ich hier unter VS 2005 nicht zu gesicht, muss ich da noch was bestimmtes includen?

am schönsten wäre eine methode, die mir für jeden pixel im bild den HEX wert zurück gibt 🤔

09.09.2007 - 09:29 Uhr

vielen dank schonmal!
gibt es denn eine methode, welches sämtliche pixel einer eingelesenen BMP datei in ein zwei dimensionales array einliest?

gruß,
jase

09.09.2007 - 09:05 Uhr

guten morgen,

ich weiß mein betreff ist nicht passend gewählt, jedoch weiß ich es nicht besser. wie kann ich zbsp:

  • die maus zum punkt X,Y bewegen
  • linken/rechten mausklick ausführen
  • screenshot vom desktop machen und dieses auswerten (Zbsp nach ner OK schaltfläche suchen)** done, siehe hier**

im endeffekt möchte ich ein programm schreiben, welches einen bestimmten ablauf automatisiert, jedoch hab ich keine ahnung wo ich da anfangen muss..

danke im vorraus für eure tipps,

jase

27.06.2007 - 18:22 Uhr

"nichts gefunden" ist falsch ausgedrückt, sorry. gefunden hab ich schon einiges, aber irgendwie nichts konkretes.
funktioniert das ganze auch mit der express edition?

jase

27.06.2007 - 17:56 Uhr

Original von herbivore
...dann ist es besser die Template-Dateien mit in die Exe zu packen, z.B. als Ressourcen. Das ist vermutlich besser, als sie in ein Array zu packen.

kannst du mir vlt erklären wie ich das genau mache? hab via msdn nichts genaues dazu gefunden..

jase

25.06.2007 - 12:50 Uhr

naja wie statisch? handelt sich beim statischen teil um insgesamt 50 zeilen code..

und ja, ich bin im moment mehr für ein array, eben weil der benutzer in der vorlage nicht rumpfuschen kann..

25.06.2007 - 10:56 Uhr

hallo,

ich schreibe im moment einen skript generator. dabei gibt es einen statischen anfang, einen variablen mittelteil und ein statisches ende. bist jetzt hab ich das so gelöst, dass er anfang und ende mittels ner while schleife aus einer vorlage datei ausliest.
ich frage mich ob es nicht sinnvoller wäre, ein array zu machen mit jeder statischen zeile von anfang und ende?

jase

24.06.2007 - 16:14 Uhr

hat wunderbar geklappt, vielen dank euch allen 🙂

24.06.2007 - 02:06 Uhr

danke für eure hilfe, ich werde das morgen mal probieren 🙂

jase

23.06.2007 - 20:00 Uhr

mh kannst du mir etwas genauer erklären wie ich das mache? muss ich dann ein array vom typ radiobutton machen?

23.06.2007 - 19:54 Uhr

danke für die antwort,
aber das wird doch recht mächtig wenn ich zbsp 30 checkboxen habe..
gibt es eine möglichkeit mit einem for loop durch alle auf einem formular vorhandenen checkboxen zu durchlaufen?

jase

23.06.2007 - 19:31 Uhr

guten abend,

ich bin neu hier und frisch gebackener c# anfänger (bzw umsteiger aus c / borland c++).
wahrscheinlich ist mein betreff nicht eindeutig gewählt, daher hier etwas ausführlicher:

ich hab eine form mit mehreren groupboxen und darin mehreren (~20) radiobuttons.
ich möchte dass die radiobuttons auf alle anderen in der ganzen form reagieren, nicht nur innerhalb der groupbox selbst.

mit anderen worten: wenn ich zbsp einen radiobutton in groupbox1 auswähle dann soll nicht die möglichkeit bestehen, parallel dazu auch noch einen in groupbox2 zu wählen.

wie mache ich soetwas?

mfg,
jase