Laden...
T
TSMike myCSharp.de - Member
Software Engineer Schweiz Dabei seit 03.10.2005 55 Beiträge
Benutzerbeschreibung

Forenbeiträge von TSMike Ingesamt 55 Beiträge

23.04.2010 - 17:18 Uhr

Das Thema ist zwar schon alt aber im Compact Framework für CE Geräte Gibt es leider TextRenderer.MeasureText() nicht. Wie es Garby vorgeschlagen hat.

Der Fehler im obigen Code ist eigendlich nur, dass die Schrifthöhe die jenige ist die zurückgegeben wird und nicht die gesammt Höhe mit den Umbrüchen (jedenfalls ist das unter CE 5.0 und .NET 3.5 so 😃 ). Und das in Pixel. Wenn man das weiss, kann man aus der Breite des Labels und der länge der Schrift berrechnen wie hoch diese werden muss.

Hier meine Lösung:

Extension für Control Objekte (ab .NET 3.0)


    static class NativeExtension
    {
        [DllImport("coredll")]
		extern static IntPtr GetDC(IntPtr hWnd); 

		[DllImport("coredll")]
		extern static void ReleaseDC(IntPtr hWnd, IntPtr hDC);

        public static Graphics GraphicsAction(this Control ctrl, Action<Graphics> doIt)
        {
            IntPtr a = GetDC(ctrl.Handle);
            Graphics g = Graphics.FromHdc(a);
            doIt(g);
            g.Dispose();
            ReleaseDC(ctrl.Handle, a);
            return g;
        }
    }

Das TextChanged event


        private void lblPrompt_TextChanged(object sender, EventArgs e)
        {
            if (sender is Label)
            {
                Label senderLabel = (sender as Label);
                senderLabel.GraphicsAction((gfx) =>
                {
                    SizeF ns = gfx.MeasureString(senderLabel.Text, senderLabel.Font);
                    int countRows = (int) Math.Ceiling(ns.Width / (double) senderLabel.Width);
                    senderLabel.Height = countRows * (int) ns.Height;
                });
            }
        }

Hoffe das hilft dem einen oder anderen weiter.

Bei Fragen helfe ich gerne weiter.

Gruss Mike

12.02.2010 - 15:20 Uhr

Ja genau diese Gedanken hatte ich auch.

11.02.2010 - 17:48 Uhr

Hi
Schau mal in :rtfm: Bar Code Scanners with the .NET Compact Framework nach. Hat sogar ein Beispielcode dabei zum herunterladen.

Leider gibt mir der Dolphin an er sei ein Honeywell. Das Problem ist dass in Zukunft auch der Metrologic als Honeywell angegeben werden könnte da Honeywell ja Metrologic aufgekauft hat. Da würde man also dann trotz allem besser fahren, wenn man die bekannten dll's sucht und nach diesen die entsprechende Instanz erzeugt.

11.02.2010 - 15:29 Uhr

Nein ich schaue ja nur nach ob da eine gewisse DLL vorhanden ist.

Aber ich würde lieber vom BS die Info erhalten welcher Hersteller das Gerät auf den Markt gebracht hat.

z.B. so

string s = SystemInfo.Manufacturer;
10.02.2010 - 11:15 Uhr

Hallo,

ich habe jetzt eine Klasse erzeugt die mir ein IScannerEngine Objekt zurück gibt.

            
public IScannerEngine GetScannerEngine()
{
  IScannerEngine sh = null;
  System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"\Windows");
  System.IO.FileInfo[] fi = di.GetFiles("*.dll");
  foreach (System.IO.FileInfo fii in fi)
  {
      if (fii.Name.ToLower() == "decoder.dll")
      {
          sh = ScannerEngineDolphin.Instance;
      }
      if (fii.Name.ToLower() == "sharpex.dll")
      {
          sh = ScannerEngineMetrologic.Instance;
      }
  }
  return sh;
}

Wenn ich wüsste wie ich herausfinde wer der Hersteller des Geräts ist, so könnte man direkt die entsprechende Instance holen.

Jemand ne Idee oder müsste ich da jetzt einen neuen Thread erzeugen?

Gruss Mike

09.02.2010 - 13:44 Uhr

Hallo Leute

Ich bin momentan dran eine Windows CE Applikation so zu erweitern so dass diese auch auf Geräten verschiedener Hersteller funktioniert.

Ich habe hier 2 Geräte:
Metrologic SP5700 (Win CE)
Dolphin 9900 (WM 6.1)

Beim Metrologic Produkt habe ich via P/Invoke die C++ DLL direkt angesprochen.
Beim Dolphin gibt es eine fertige .NET DLL die das ganze schon kapselt.

Wenn ich nun die Applikation auf dem Metrologic laufen lasse bekomme ich eine Exception die besagt dass da die Decode.dll nicht gefunden wurde. Nehme mal an das ist weil die .NET DLL referenziert ist und so vermutlich auch via P/Invoke die decode.dll laden will aber diese nicht vorfindet.

Jetzt weiss ich nicht so genau wie ich weiter vorgehen soll. Ich könnte evtl. die dll zur Laufzeit laden nach dem ich herausgefunden habe welches Gerät ich da am laufen habe. Oder ich kapsle die decode.dll auch selber und umgehe damit diese Exception.

Was würdet ihr an meiner Stelle machen?

Besten Dank
Mike

08.02.2010 - 10:52 Uhr

Hallo Heinz

Wie sieht es bei dir aus? Funktioniert alles so wie du es erwartet hast?

Gruss Mike

26.02.2009 - 17:07 Uhr

@Tomot geht nicht unter Vista daher nix. Danke.
@johnny Danke habe es so gemacht.
Dummer weise stand in der Hilfe das die System.Configuration class erst ab .NET 3.5 unterstützt wird. Aber nach langen weiter suchen fand ich dann heraus dass es die schon in der .NET 2.0 geben hat. Funktioniert.

26.02.2009 - 10:17 Uhr

Das Problem habe ich auch grade. Hast Du dazu schon eine Lösung?

23.12.2008 - 17:01 Uhr

Der Code wird vom Setup ausgeführt. Dieser ist als Administrator unterwegs.
Das Problem ist dass der 0815 Administrator keine Rechte besitzt in diese Datei zu schreiben. Man müsste den Administrator freigeben der wirklich alle Rechte besitzt. Und das ist genau so mühsam wie wenn ich einfach bei jedem PC von Hand die Einstellungen vornehme.

Ich habe mal eine Beispiel Applikation gemacht die einfach in eine neu erstellte Datei reinschreibt, die Unter Porgramme abgelegt ist. Das geht auch. Aber wenn man wie ich in einen Pfad schreiben will der nicht zur eigenen Applikation gehört dann ist ende Feuer.

23.12.2008 - 09:24 Uhr

So habe die Datei nun unter folgendem Pfad gefunden.
C:\Users&lt;BenutzerName>\AppData\Roaming\Microsoft\Windows\Recent
und unter
C:\Users&lt;BenutzerName>\AppData\Local\VirtualStore\Program Files&lt;ApplikationsName>

Hat da noch jemand ne Idee wie ich die Datei trotzdem noch ändern kann?

21.11.2008 - 17:07 Uhr

Hi
Ja wollte eigentlich combine verwenden, genau aus dem Grund den du erwähnt hast.

Ich frage mich aber immer noch woher ich die Daten erhalte die mir im Visualstudio angezeigt werden. 🤔

21.11.2008 - 16:20 Uhr

Weder im Virtuellen noch im Program Files Folder. Der Code wird im Action Commit des Installers von VS2008 gestartet. Evtl. hat ja auch das noch Einfluss.

                
if (IsAdministrator())
{
  Register();
}

private static void Register()
{
  string path = string.Concat(Registry.LocalMachine.OpenSubKey(@"Software\office").GetValue("Path"), "File.txt");
  string str2 = Environment.GetCommandLineArgs()[0];
  string a = System.IO.File.ReadAllText(path);//guckst du hier inhalt vorhanden
  StreamWriter writer = new StreamWriter(path, true);
  System.Text.StringBuilder sb = new System.Text.StringBuilder();
  sb.Append(str2);
  writer.WriteLine(sb.ToString());
  writer.Close();
}

private static bool IsAdministrator()
{
  MessageBox.Show("Administrator check");
  WindowsIdentity myWindowsIdentity = WindowsIdentity.GetCurrent();
  WindowsPrincipal myWindowsPrincipal = new WindowsPrincipal(myWindowsIdentity);
  return myWindowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}

21.11.2008 - 15:55 Uhr

Hallo Zusammen
Ich bin grade dran eine Fremdapplikation zu erweitern. Diese Applikation hat im Program Files Folder eine txt Datei in welche ich Infos reinschreiben muss. Leider ist es so, dass die Datei ganz normal gelesen wird und auch beschrieben. Nur wenn ich dann in den Entsprechenden Folder gehe und die Datei öffne so sind die Einträge nicht vorhanden.

Während dem Debugging habe ich jedoch gesehen das die Daten von C# ausgelesen werden die ich zuvor schon geschrieben habe. Doch wie schon erwähnt sind diese nicht wirklich vorhanden im Program Files Folder.

Das wird was mit Vista Virtualisierung zu tun haben. Die Applikation startet jedoch im Adminmodus und da sollte doch die Virtualisierung keinen Einfluss haben. Oder?

Was muss ich tun???

02.10.2008 - 15:12 Uhr

Super. Danke dir. Man muss halt nur wissen nach was man suchen muss.

02.10.2008 - 13:26 Uhr

@norman_timo
Und das macht man eben wie der Xynratron das aufgezeigt hat? Was geschieht denn da? Wo kann ich das nachlesen?

02.10.2008 - 13:17 Uhr

ist erledigt! 🙂

Wie hast du denn das Ganze erledigt?

01.10.2008 - 17:13 Uhr

Ich glaube du machst Dir zu viele Sorgen.
Xynratron

Genau das ist so und auch richtig. 😉

Wenn Du mit Transaktionen arbeitest, dann bekommst du in deinem Client ja auch eine Exception wenn die Verbindung zum Server nicht mehr vorhanden ist. Dann nutzt auch ein Rollback nichts mehr - wie willst Du dem Server den Bescheid geben, dass er was rückgäanig machen soll?
Xynratron

Genau das wollte ich ja klären. Darum fragte ich was die DB bei einem Verbindungsunterbruch macht.

Der Server selbst wird die Aktion rückgängig machen, sobald er vom Netzwerk über den Abbruch der Session informiert wird.
Xynratron

Bei dieser Sache war ich mir nicht sicher. Bist du dir sicher?

Intern bei Dir musst du nur entsprechend mit Fehlerüberprüfung Programmieren. Ausserdem immer die Connections mit Dispose() (besser: verwende using) wieder freigeben. Im Fehlerfall versuchen per Rollback alles rückgängig zu machen, wenn die Verbindung unterbrochen ist, dann bekommst du hier natürlich nochmals eine Exception. Allerdings musst du ja auch bei anderen Fehlern einen Rollback zum Server schicken.
Xynratron

Ich verwende generell immer using blöcke wenn möglich. Wenn ich Verbindung zum Server habe dann habe "ich" auch kein Problem mit der Konsistenz der DB. Daher habe ich ja auch immer wieder auf den Netzwerkunterbruch hingewiesen. Mich interessierte vor allem genau dieser Fall im zusammenhang mit einer .NET Transaktion. Alles andere war mir Klar.

Etwas zum lesen:
>

>

Xynratron

Danke schau mal rein. Verhält sich die 2005 Version gleich wie die 2000er?

Danke an die Helfer.

Gruss Mike

26.09.2008 - 08:43 Uhr

Hallo ihr beide

Danke für eure Infos. Ich frage ja genau weil ich nicht genau wusste wie das Ganze funktioniert aber jetzt hat sich das ja geändert. Und so kommt natürlich schon die anschliessende Frage.

Muss ich mir die ganze Transaktion intern merken damit im Fehlerfall nochmals von neuem probiert werden kann? Ich denke schon und wenn dann wieder die Verbindung steht den Benutzer fragen ob er es erneut versuchen will oder nicht. Falls nicht dann weg damit.

Wie lange wartet denn die DB auf das Rollback oder das Commit? Wie kann ich denn überprüfen ob das Commit angenommen wurde? Wenn ich nicht weiss ob es nun geschehen ist oder nicht weiss ich ja auch nicht ob ich das ganze nochmals übermitteln muss oder nicht.

Danke euch für die Zeit die Ihr für mich aufwendet.

Gruss Mike

23.09.2008 - 23:08 Uhr

Hallo Zusammen
Weiss jemand bescheid was da genau geschied, wenn man Transactions in .NET verwendet? Werden diese auf die Datenbank geschrieben und dann ausgeführt? Vermutlich ja nicht da man ja nachträglich ein Commit oder eben ein Rollback machen kann. Die Hoffnung stirbt trotzdem zuletzt =)

12.09.2008 - 12:23 Uhr

Hi hast du für mich eine gescheite Seite die mir das erstellen von Jobs und Storedprocedures vermittelt?

12.09.2008 - 11:32 Uhr

Hallo zusammen

Ich bin an einer Applikation dran die auf einem WindowsCE 5.0 PDA läuft.
Die Applikation verwendet SQL Server 2000 und 2005. Nun habe ich da so meine bedenken mit dem BeginTransaction. Was passiert wenn ich während der Übermittlung der Daten die WLan-Verbindung verloren geht?
Oder was geschieht wenn das Commit oder Rollback nie erreicht würde? (WLan-Verbindung weg)

Ich werde das Gefühl nicht los das es nicht gescheit ist via .NET Code (C#) dies händeln zu wollen. Das einzig richtige ist doch ein StoredProcedure auf der Datenbank anzulegen oder irre ich mich da?

Gruss Mike

25.04.2007 - 08:52 Uhr

Hallo herbivore

Bedeutet das dass ich irgendwelche dll's einbinden muss? Hast du mir einen kleinen Tipp wonach ich suchen muss?

Mike

25.04.2007 - 08:40 Uhr

Hallo
Ich suche das gleiche! Also auch für 1.1. Hat jemand ne Lösung?

27.03.2007 - 07:46 Uhr

@Borg genau das war der Fehler. Habe es jetzt korrigiert. Danke.

26.03.2007 - 11:52 Uhr

Hallo Herbievore

Das dachte ich auch aber es geht nicht.

Im Eventlog steht geschrieben dass "Workstation" Service nicht gefunden wrude und daher auch der Service nicht gestartet werden kann. Dass Passiert bei Vista Ultimate wenn es auf Deutsch eingestellt ist.

Bei XP konnte ich dass noch nicht testen.

Gruss
Mike

26.03.2007 - 11:46 Uhr

ServicesDependedOn ist ja schön und gut aber wie mache ich dass mit den Abhängigkeiten wenn ich den Service auf verschiedene Systeme installiere die Japanisch, Türkisch, Englisch oder Deutsch sein können???

Bin grade bei diesem Problem.

"Workstation" heisst im Deutschen System "Arbeitsstation".

Muss ich da wirklich für jede Sprache andere Abhängigkeiten im String angeben?

Gruss
Mike

05.03.2007 - 10:24 Uhr

Ich habe mich mit der Materie noch nicht alzu arg beschäftigt aber du muss glaub ein Manifest anlegen und angeben wie und wo du die config öffnen willst.

04.01.2007 - 09:36 Uhr

Die oben gennanten Beispiele sind nicht vergleichbar.

Der folgende Code erzeugt den Ton über den Piezo-Lautsprecher auf dem Mainboard


[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
Beep( 440, 500 );

Und dieser Code erzeugt den Ton über die Soundkarte


System.Media.SystemSounds.Beep.Play();

man kann hier jedoch keine Frequenz und auch keine dauer des Tones angeben.

12.10.2006 - 07:33 Uhr

Ich habe im moment das Projekt für 2 Wochen auf Eis gelegt. Besten dank für die Antworten.

Gruss Mike

11.10.2006 - 08:49 Uhr

Genau sowas habe ich mir auch gedacht. Aber dann habe ich etwas gefunden das mit "HttpMethod" funktionieren soll. Aber ich werde das mit dem Listener weiterverfolgen.

Besten Dank

11.10.2006 - 08:28 Uhr

Ja genau. Die WebSite sendet einen Post an 123.123.12.3:29079/WebService. Ich soll dann den Post entgegen nehmen und dann darauf antworten wie oben beschrieben.

Ich habe übrigens noch nie etwas mit Webapplikationen oder Webpages gemacht X(

Gruss Mike

10.10.2006 - 13:24 Uhr

Ok mach ich aber wie komme ich zum listener der den request abfängt?

Edit:
hmm habe nachgeschaut. Ist evtl. später von interesse Danke. Mein jetztiges porblem ist jedoch wie ich den Request abfangen kann. Kann ich da einen Thread starten um dies zu realisieren? Doch müsste ich dann diesen Starten? Im konstruktor des Services?

Gruss Mike

10.10.2006 - 13:19 Uhr

Danke für die Antwort aber das darf ich nicht.

10.10.2006 - 13:14 Uhr

Hallo zusammen
Ich habe nun Stunden damit verbracht das Forum zu durchsuchen. Leider bin ich nicht schlauer geworden.

Ich muss einen WebService entwickeln der auf enen Post von einer Webseite reagiert.
Der Ablauf aus sicht er WebSite soll wie folgt von statten gehen:

  1. XML-File wird über das WebFormular hochgeladen.(zum webservice)

  2. Zuerst wird ein POST mit den folgenden Parametern gesendet:
    md5 : Md5 Summe des hochgeladenen Files
    requestID : Unique ID für den aktuellen Request.

  3. Als Antwort vom Server muss "true" zurückgegeben werden als
    Bestätigung, dass die MD5 Summe erhalten wurde.

  4. falls "true" erhalten wurde wird ein zweiter POST abgesetzt mit den
    Parametern:
    requestID : Unique ID für den aktuellen Request.
    xmlFile : Das hochgeladenen XML-File, das File wird so gepostet, als
    würde es über ein normales File Upload Fomrular hochgeladen.

  5. Als Antwort wird entweder der String "false" erwartet, sprich der
    User kann die Datei nicht herunterladen, oder die Datei als String.

  6. Falls nicht der String "false" erhalten wurde wird das File dem User
    zur Verfügung gestellt.

Ich frage mich jetzt wie kann ich den Post unter 1. abfragen. Desweiteren habe ich das Gefühl das man bei einem Webservice keinen zustand halten sollte. Ich bekomme aber 2 Posts und muss ich mir ja die MD5-Summe vom ersten merken. Ansonsten kann ich dann die im 2ten Post gelieferte XML-Datei nicht verifizieren.

Danke euch jetzt schon für euere Hilfe

Mike

21.07.2006 - 11:36 Uhr

Original von DeveloperX
Es gibt auch noch das Bookmark-Window, mit alle gesetzen Bookmarks als Liste.

Ja es gibt eine Liste Ctrl+W,B

Oder via Menu View->Other Windows-> Bookmark Window

Gruss Mike

23.06.2006 - 07:28 Uhr

Wir müssen jede nicht Einhaltung der Richtlinien begründen und als genehmigt unterschrieben bekommen. Dies ist ein riesen Aufwand und je nach Projekt grösse wird dies gemacht oder nicht. Wir starten unser erstes Projekt in kurzer zeit nach diesen Richtlinien und ich bin gespannt wie wir nach dem ersten Projekt weiter fahren werden.

Gruss Mike

22.06.2006 - 15:04 Uhr

@LastGentleman
Das sehe ich auch so.

@svenson
Wir verwenden hier das Tool "ClockSharp"

22.06.2006 - 14:39 Uhr

Hier kann man nachlesen was es so mit Guidelines auf sich hat.
Tiobe
Hier der Link zur Doku
"Coding Standard: C#" - Philips Medical Systems

Da gibt es keinen Spielraum für verhandlungen. Es werden einem Auflagen auferlegt die deutlich mehr Zeitaufwand in anspruch nehmen als wenn ich mit Refactoring das ganze ändere.

Gruss MIKE

22.06.2006 - 14:29 Uhr

Im Moment mache ich ein Refactoring um sicher zu gehen dass da keine falschen '_' geändert werden.

22.06.2006 - 12:32 Uhr

Na wenn das so ist dann kann man halt nichts machen. Ich hoffe denn noch dass da jemand eine Lösung findet.

Ich suche mal weiter.

Danke an euch

22.06.2006 - 12:26 Uhr

👍
das ist mir auch klar, danke aber das ist nicht das was ich möchte.
lies doch bitte nochmals was ich gerne hätte.

Gruss Mike

22.06.2006 - 12:02 Uhr

Hallo zusammen
ich muss mich an die Codierrichtlinien von Philips halten und Visual Studio macht das nicht immer.

Ich möchte das die automatisch erzeugten events nicht so aussehen

private void Button1_Click(object sender, EventArgs e)

sondern so

private void Button1Click(object sender, EventArgs e)

Also ohne das underline!
Jemand ne Idee wie man das hinkriegt?

Gruss Mike

05.01.2006 - 16:46 Uhr

Hi
Ich arbeite mit .Net2.0 dort gibt es das.

Schönen Abend noch.
Gruss Mike

05.01.2006 - 13:28 Uhr

Mich wundert es eben nur dass es nicht geht.
Ich werde das von dir verwenden.

05.01.2006 - 13:06 Uhr

Warum geht das nicht?


public void tabAusblenden(string Text)
{
if(tcoTabContainer.TabPages.ContainsKey(Text))
{
tcoTabContainer.TabPages.RemoveByKey(Text);
}
}

05.01.2006 - 12:55 Uhr

Jetzt geht es! Danke!

05.01.2006 - 12:07 Uhr

Ok
Jetzt ist es ja aber eben so dass ich in einem anderen Fenster dieses Fenster mit den Tabs erzeuge. Und von dort aus habe ich keinen zugriff auf die Privaten member von der erzeugten Klasse. Wie würdest du es jetzt machen dass du explizit einen Tab entfehrnen kannst?

Ich habe es jetzt mit dem Index gemacht aber dazu muss man immer wieder zählen welchen man denn jetzt entfernt haben möchte. Das finde ich schlecht. Jetzt könnte ich paralell zum Index noch ein enum machen was aber nicht wartungsfreundlich ist. Das mit dem String will einfach nicht funktionieren.

Vorschläge evtl. mit beispielen sehr Willkommen.

Gruss Mike

05.01.2006 - 11:54 Uhr

Diese Variablen sind ja eben Private 🤔 oder? Die habe ich ja schon von VS erzeugt bekommen.
Ich verstehe nicht ganz. Hast du vieleicht ein beispiel?

05.01.2006 - 11:44 Uhr

@herbivore
Also was es so mit der OO Technik zu tun hat ist mir klar. Mir war nur nicht klar wie man die Referenz herausfinden kann.

@yodan
Danke für dein beispiel. Sowas habe ich gesucht.

Hmm mich dünkt der zugriff auf die Controls doch einwenig kompliziert. Aber ich habe ja auch erst mit C# angefangen. Habe davor 4Jahre mit dem C++Builder gearbeitet.

Danke an euch