Laden...

Forenbeiträge von _Bugrick_ Ingesamt 48 Beiträge

15.05.2019 - 16:20 Uhr

Hey Th69,

danke für deine Antwort.

Das geht tatsächlich, wenn man die Listen vor dem Vergleich sortiert, sonst nimmt die Methode den ersten Treffer und hebelt unter Umständen andere potentielle Matches aus, wie es hier passieren würde:


List<Waehrung> lstPreis = new List<Waehrung>();
lstPreis.Add(Waehrung.Silber);
lstPreis.Add(Waehrung.Gold);

List<Waehrung> lstKonto = new List<Waehrung>();
lstKonto.Add(Waehrung.Silber | Waehrung.Gold);
lstKonto.Add(Waehrung.Silber);

Außerdem muss die GetHashCode-Methode im eigenen EqualityComparer immer einen konstanten Wert zurückgeben, sonst springt man nie ins Equals um auf die Flags zu prüfen.

Ich hoffe ich kann so erst einmal fahren, danke!

15.05.2019 - 13:27 Uhr

Hallo zusammen,

ich habe zwei Listen und möchte feststellen können, ob die eine Liste die andere abdeckt. Einer der Listen besteht jedoch aus Flags. Offenbar kommt die Intersect-Linq-Funktion damit nicht klar, denn ich erhalte im Beispiel hier unten das Ergebnis, dass nur einer der Werte in der anderen Liste enthalten ist:


[Flags]
public enum Waehrung
{
  Silber = 1,
  Gold = 2,
  Platin = 4
}

List<Waehrung> lstPreis = new List<Waehrung>();
lstPreis.Add(Waehrung.Gold);
lstPreis.Add(Waehrung.Gold);

List<Waehrung> lstKonto = new List<Waehrung>();
lstKonto.Add(Waehrung.Silber | Waehrung.Gold);
 lstKonto.Add(Waehrung.Gold);

List<Waehrung> lstBezahlbar = lstKonto.Intersect(lstPreis).ToList();

Meine Frage ist nun, ob es dennoch eine elegante und einfache Lösung gibt oder ob ich selbst eine Prüfroutine schreiben muss.

Wäre für Hinweise sehr dankbar!

14.07.2015 - 16:42 Uhr

Vielleicht fehlt doch noch etwas Kontext.

Die blaue Fläche ist das ganze UserControl etwas verkleinert.
Beim Laden des Controls sieht man schon kurz (für den Bruchteil einer Sekunde) die Scrollbar, bevor sie sich final sauber rechts positioniert, zusammen mit dem Rest des UserControls.
Übrigens findet alles in der GUI-Thread statt. Nichts Threadübergreifendes.

Eben eine Gegenprobe gemacht: Nutzt man beispielsweise das "UltraPanel" der Infragistics-Softwarekomponenten klappt das ganze ebenfalls problemlos, ohne, dass man beim Aufbau des UserControls kurz die Scrollbar mitten ins Nichts eingeblendet bekommt.

14.07.2015 - 15:08 Uhr

Hallo zusammen,

ich arbeite an einem umfangreichen UserControl, das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.

Im Grunde funktioniert auch alles einwandfrei, bis auf einen ziemlich nervigen Schönheitsfehler.

Damit sich das UserControl sauber ohne Flackern aufbaut und dann eingeblendet wird, arbeite ich mit


this.SuspendLayout();
this.ResumeLayout();

Das funktioniert auch bei allen Controls wunderbar, bis auf einem einzigen. Nämlich einem Panel. Und auch nur dann nicht, wenn ich die AutoScroll-Property auf true setze. Kommentier ich diese Zeile aus, baut sich alles sauber auf. Sobald ich die Zeile rein nehme, ist kurz folgendes zu sehen (sh. Anhang 1).

Ist das ein Bug im .NET-Framework oder mache ich etwas falsch?

Was ich schon probiert habe ist:

  • Autoscroll an verschiedenen anderen Stelle zu setzen, auch nach ResumeLayout
  • Ebenfalls mit SuspendLayout and ResumeLayout für das Panel zu arbeiten

//Panels um scrollen zu können
//pnl[a].AutoScroll = true;
pnl[a].Controls.Add(tlp[a]);                   
pnl[a].Dock = DockStyle.Fill;
pnl[a].Location = new Point(0, 0);
pnl[a].Name = string.Concat("pnl", a.ToString());
pnl[a].Size = new Size(100, 100);
//pnl[a].AutoScroll = true;

Bin für jede Hilfe dankbar.

Gruß
Bugrick

14.07.2015 - 14:54 Uhr

Hallo,

freue mich sehr über das gute Feedback.

Padman, ich werde versuchen es zeitlich hinzubekommen und bald eine Demo bereitzustellen, die sich mit VS2015 öffnen lässt.

24.09.2014 - 18:42 Uhr

War ja klar. Hat sich doch ein Datenbankzugriff in der Methode versteckt, die übersetzt. Und nicht gerade ein schöner. Auf einen Server, der am anderen Ende der Welt steht macht sich das deutlich bemerkbar. Bin optimistisch, dass es nach dem umbauen dann schneller klappt.

Danke nochmal an alle!

24.09.2014 - 16:56 Uhr

solche Probleme könnte man bereits im Vorfeld dadurch umgehen, indem man seine Software-Architektur sorgfältig plant und
>
.

Das tu ich doch: GUI --> Dictionary<string value, string key> --> Datebank

Du benutzt TableLayoutPanel mit Spalten die automatisch vergrößert werden? evtl. ist hier das Problem da bei jedem Resize von einem Control die Spalten neu angepasst werden. Wenn es wirklich so ist dann teste mal mit SuspendLayout/ResumeLayout von dem TableLayoutPanel.

Die Spalten vom TLP sind alle mit Prozentwerten belegt, die Änderung des Textes hat keinen Einfluss auf die Größe der Controls, die darin liegen.
Wenn ihr aber alle meint, dass das theoretisch gehen muss, hab ich irgendwo anders noch einen Performancefresser. Sobald ich weiß wo, sag ich Bescheid.

Trotzdem danke!

24.09.2014 - 16:46 Uhr

Vielen Dank für deine Antwort!

Wenn Du jedes Mal die gesamte Übersetzung in einem Rutsch lädst, verwende doch einen
>
. Hast Du die Übersetzungen beisammen, übergibst Du diese der Haupt-Form und rufst anschließend Show() auf.

Splashcreen, so nennt man das also 😃 Den Gedanken hatte ich auch schon und hab das bereits ausprobiert. Auch dieser hängt, sobald es in den rekursiven Aufruf geht.
Hab nach jedem SQL-Zugriff einen Haken im Splashscreen gesetzt. Alles ging wundbar, bis dann die eigentliche Form gebaut und übersetzt wird... da hing alles.

Der Vorteil eines SplashScreens ist, dass dieser i.d.R. in einem anderen Thread läuft und somit die Ladeanimation unabhängig Deiner Datenbankanfrage aktualisieren kann.

Das hast du missverstanden. Die Datenbankabfrage läuft sowieso in einem anderen Thread.
Die GUI hängt erst, wenn wirklich das Zugreifen auf die Steuerelemente beginnt.
Genau darin besteht ja die ganze Zeit mein Problem. Datenbankabfragen kann ich so viele machen wie ich will, ohne die GUI zu beeinträchtigen.

24.09.2014 - 15:24 Uhr

klingt für mich nach
>

Bin ja nur im GUI-Thread unterwegs beim Übersetzen, muss ich ja auch.

Für mich klingt das eher nach einer falschen handhabe, wie eine Lokalisierung der Anwendung vollzogen wird.
Wieso nutzt ihr nicht Ressourcen für die Sprachumstellung von Anwendungen, wozu es auch gedacht ist?

>

Danke! Das klingt interessant, probier ich direkt mal aus. Wirklich einsetzen werde ich das aber auf die Schnelle nicht oder nie können, da wir unsere Übersetzungen zentral auf einer Datenbank einpflegen und beim Programmstart laden.

24.09.2014 - 14:54 Uhr

Hallo zusamen,

ich suche aktuell einen Weg die GUI am Leben zu erhalten, während sie rekursiv durchlaufen und übersetzt wird.

Habe während des Programmstarts ein Preloader.gif in einer Picturebox am laufen, um zu sehen ob die GUI hängt. Während im Hintergrund Datenbankzugriffe laufen, ist das alles kein Problem. Sobald es dann aber ans übersetzen der Controls geht, friert alles ein.

Habe bereits mit Suspendlayout/Resumelayout/DoubleBuffered herumgespielt, jedoch hat das wenig bis nichts geholfen. Es liegt definitiv am Übersetzen, denn wenn ich das nicht aufrufe, ist die GUI voll da.
Das Übersetzen erfolgt ganz schlicht über Rekursion und einem Dictionary.

Hat von euch jemand eine Idee, wie man das am besten angeht?
Zu erwähnen sei vll noch, dass ich hier nicht von 2-3 Button und einem Label spreche, sondern von ca. 60-70 Controls, die auch noch auf einem TableLayoutPanel liegen.

Gruß
Bugrick

21.06.2013 - 15:25 Uhr

Sorry, dass ich mich erst jetzt wieder melde. Danke für alle eure Antworten.

LINQ, schön wärs. Leider muss ich noch mit VS2005 und Framework 2.0 arbeiten 😦
Ich habe mich dann letzten Endes dazu entschlossen das XML manuell zu erzeugen.

Thema kann von meiner Seite her geschlossen werden.

26.04.2013 - 15:22 Uhr

Hallo zusammen,

seit einigen Tagen bin ich auf der Suche nach einer Möglichkeit einen einfachen Xml-String zu erstellen, ohne dabei eine Datei erzeugen/speichern zu müssen. Hat den einfachen Grund, dass das xml per TCP-Nachricht versendet werden soll.

Normal mache ich das immer mit XmlDocument, was in diesem Fall ja nicht geht. Dann hatte ich viel Hoffnung in den XmlTextWriter gelegt (klingt ja nicht nach Datei) aber auch dieser verlangt einen Pfad/Stream.

Kennt jemand eine Klasse/Möglichkeit mit einfachen mitteln Knoten und Attribute zu setzen und am ende einen Xml-String haben? Lustigerweise kann man mit der XmlDocument-Klasse einen Xml-String setzen und diesen auslesen ohne eine Datei zu haben, aber umgekehrt offenbar nicht. Notfalls werde ich das Xml händisch basteln müssen 😕

Hier noch ein einfaches Beispiel wie es am Ende aussehen muss, wie gesagt, sehr simpel:

<input type="Test"><a>1</a><b>2</b><c>3</c></input>

Vielen Dank schon mal!

09.05.2012 - 09:52 Uhr

So werde ich es auch lösen, da ich keine Möglichkeit gefunden habe die ganze Logik sauber unterzukriegen. Danke!

08.05.2012 - 17:34 Uhr

Das hier könnte Tatsächlich so funktionieren:

public Test(string str) : this(int.Parse(str.Split(',')[0]), int.Parse(str.Split(',')[1]))
{
}

Problem ist, dass ich noch sehr viel Logik habe, die ich aus dem String raus ziehe, beispielsweise falls ungültige Zeichen drin sind. Aber ich seh mir mal an wie sich das alles verhält und melde mich.

Danke für die schnelle Antwort schon mal.

08.05.2012 - 16:57 Uhr

Hallo,

ich möchte wie unten im Code-Snippet ersichtlich einem Konstruktor einen String übergeben, der zwei Zahlen enthält. Und dort sollen die beiden Zahlen dann einem anderen Konstruktor übergeben werden. Nur wenn ich das mach, dann bekomm ich Schwierigkeiten "this" zu setzen. Nun meine Frage, gibt es da einen Trick oder muss ich hier eine statische Methode erfinden, die dann erst eine Instanz der Klasse erzeugt und zurückgibt? So z. B.:

Test tst = Test.CreateInstance("12,49");

Hier das Snippet:

public class Test
	{
		public Test(string str)
		{
			//Aufbau vom String: Zahl1,Zahl2
			//Beispiel: 12,49

			string[] strParts = str.Split(',');

			Test tst = new Test(int.Parse(strParts[0]), int.Parse(strParts[1]));
			this = tst;

			//oder
			//this tst = new Test(int.Parse(strParts[0]), int.Parse(strParts[1]));
		}

		public Test(int int1, int int2)
		{
			//Rechne etwas
		}
	}

Danke schonmal für eure Hilfe!

Gruß
Bugrick

13.01.2012 - 13:45 Uhr

Hallo,

gibt es ein Even oder eine Methode (die man mit einem Timer steuern könnte), die zurückgibt, welche Taste soeben gedrückt wurde?

Ich hab bereits gegooglet aber nichts vernünftiges finden können. Das meiste hat sich auf Forms bezogen. Ich jedoch suche etwas globales, also das überall in Windows geschossen wird.

Ich würde gerne mitzählen, wie viele Tastenanschläge man pro Tag macht (evlt auch mit Statistiken).

Danke schon mal!

05.01.2012 - 07:34 Uhr

Ok, war schon spät und ich hab nicht weiter darüber nachgedacht. Da hast du natürlich recht.

05.01.2012 - 01:56 Uhr

Hallo,

das sind Grundlagen. Erkundige dich bitte das nächste mal selbst.

public class clsOwn
{
   public clsOwn()
   {
      DataTable dt = new DataTable();

      new frmMain(dt);
   }
}


public class frmMain : Form
{
   public frmMain(DataTable dt)
   {
      dgv.DataSource = dt;
   }
}
05.01.2012 - 01:50 Uhr

Hallo,

da ist nichts zu erkennen, weshalb das Programm 8 mal neustartet. Hast du das vielleicht in einer Schleife drin und versehentliche eine Klammer falsch gesetzt? Kannst du mal mehr Code posten?

Gruß
Bugrick

27.12.2011 - 06:58 Uhr

Hi,

ich kenne das Event zwar nicht, aber vielleicht hilft dir das weiter: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.calendar.dayrender.aspx

Gruß
Bugrick

01.12.2011 - 09:11 Uhr

Danke schonmal für die Antworten! 😃

Auf DLookUp bin ich bereits gestoßen, finde aber das ist auch nicht so das gelbe vom Ei. Habe gelesen, dass das recht langsam werden kann.

Habe es jetzt so gelöst, dass ich 2 Statements habe, ein SELECT, das den Wert fürs SET holt und dann ein UPDATE mit Subselect im WHERE.

Wäre trotzdem froh, wenn es eine Möglichkeit gäbe das in einem schnellen, sauberen Update-Statement zu machen.

30.11.2011 - 16:56 Uhr

Eben mal getest und wie erwartet geht es auch bei mehrmaligem probieren nicht. Dieser "SET g.besitzer_id = (SELECT..." mag zwar bei anderen DB-Systemen funktionieren, aber nicht bei MS Access. Da bekomme ich immer die OleDbException "Operation muss eine aktualisierbare Abfrage verwenden."
Hab es auch schon mit "TOP 1" probiert, Sub-Select ist hier wohl nicht...

30.11.2011 - 16:36 Uhr

Verwendetes Datenbanksystem: MS Access 2007 (OleDb C#, VS2005, .NET FX 2.0)

Hallo,

ich habe eine Tabelle mit Besitzern und eine mit Grundstücken, ein Besitzer kann im Moment gar keine oder mehrere Grundstücke besitzen.

TabBesitzer

ID Besitzer

1 Hubert
2 Meier
3 Schmidt
4 Müller

TabGrundstuecke

ID Besitzer_ID Grundstueck

1 1 Grundstück1
2 1 Grundstück2
3 3 Grundstück3
4 3 Grundstück4
5 3 Grundstück5
6 4 Grundstück6

Nun will ich ein UPDATE-Statement erstellen, dass alle Grundstücke eines Besitzer an einen anderen überträgt und zwar anhand der Namen. Ich will dem Statement nur die Namen übergeben müssen. Ich habe beim googlen einen Aufbau gefunden, der das angeblich für MS Access kann, jedoch funktioniert auch dieser bei mir nicht, ich erkenne jedoch auch keinen Fehler:


UPDATE TabGrundstuecke g INNER JOIN TabBesitzer b ON b.besitzer = 'Meier' SET g.besitzer_id = b.id WHERE besitzer_id = (SELECT b.id FROM TabBesitzer b WHERE b.besitzer = 'Schmidt')

Was zwar einfach wäre, aber nicht geht ist ...SET g.besitzer_id = (SELECT b.id FROM...) weil ein eindeutiger Wert erwartet wird. Scheidet also wohl leider aus...

Danke schon mal!

28.11.2011 - 15:01 Uhr

Und eben ist noch ein weiteres Problem aufgetaucht: Mit AutoClose geht das ja dann gar nicht mehr weg 😦 Also muss doch ein Event erzeugt werden.

28.11.2011 - 12:57 Uhr

Achso, na wenn man die DropDown-Eigenschaft erstmal kennt, wird so einiges klar.

Dann ist sogar

ParentMenu.DropDown.AutoClose = false;

der wohl noch einfachere Weg. Danke dir, hat mir sehr geholfen! 😃

28.11.2011 - 12:07 Uhr

Hallo,

ich würde gerne bei einem ToolStripMenu mehrere Items anklicken, ohne, dass das Menü direkt wieder ausgeblendet wird, nachdem ich eines angeklickt hab.

In meinem Fall soll die Checked-Eigenschaft immer geändert werden, und das unter umständen von mehreren Items. Nur ist das nervig, wenn man das Menü immer wieder herholen muss.

Ich habe leider nur weder eine Property, noch sonst irgendwas im Netz gefunden, um das einzustellen. Weiß hier jemand einen Rat?

Danke schomal!

13.10.2011 - 15:04 Uhr

Ich ging davon aus, dass die Trim-Funktion aufeinmal alle gleichen Zeichen entfernt (sollte sie ja, oder?). Und die Anzahl der Durchgänge die die for-Schleife braucht, ist die Anzahl der verschiedenen Buchstaben.

13.10.2011 - 14:51 Uhr

Hallo,

wie ich feststellen durfte gibt es keine vorgefertigte Funktion, die zählt wie viele verschiedene Zeichen ein String enthält. Also fix eine runtergetippt:

private int GetNumberOfVariousChars(string strValue)
{
   int intCount;

   for (intCount = 0; strValue.Length > 0; intCount++)
   {
      strValue = strValue.Trim(strValue[0]);
   }

   return intCount;
}

Soweit, so gut. Beim Debuggen durfte ich nun festellen, dass Trim manchmal nicht korrekt vorgeht. Beispiel: Beim Wort "nennen" sollte die Funktion "2" zurückgeben. Jedoch gibt sie "3" zurück, da zuerst das erste "n" getrimmt wird, anschließend die beiden "e" und "n". Das selbe ist beim Wort "elefant" der Fall.

Nutz ich die Funktion falsch oder wie?

Danke schonmal.

21.09.2011 - 11:56 Uhr

Ich habe jetzt eine Möglichkeit gefunden:

SystemEvents.DisplaySettingsChanging += new EventHandler(SystemEvents_DisplaySettingsChanging);

Ist nicht direkt das, wonach ich gesucht habe, sondern sogar noch etwas besser 😃
Und beim ändern der Bildschirmanzahl wird auch (logischerweise) dieses Event ausgelöst. (Zumindest unter Windows 7 Enterprise, wo anders habe ich es jetzt nicht getestet)

Trotzdem danke tom-essen.

Gruß
Bugrick

21.09.2011 - 11:21 Uhr

Wieso das?

Dass man ein Notebook im laufenden Betrieb aus einem Port-Replicator rausnimmt oder einsteckt ist ja jetzt kein Unding. Habe auch noch nie gehört, dass dabei mal was kaputt gegangen ist. Was jetzt nicht heißen soll, dass ich mich nicht vom Gegenteil überzeugen lassen würde 😉

Unabhängig davon, ob es jetzt gut oder schlecht ist, besteht mein Problem ja trotzdem noch.

21.09.2011 - 10:43 Uhr

Hallo,

gibt es ein Windows-Event oder Ähnliches, das ausgelöst wird, wenn sich die Anzahl der Screens ändert?

Die einzige Idee, wie das herauszufinden ist, war bisher ein Timer, in dem geprüft wird, ob sich die Anzahl der Screens ändert, nur gefällt mir das gar nicht.

Hat irgendjemand eine Idee, wie man soetwas sauberer lösen könnte oder wie man sich da ein eigenes Event zusammenschreibt? (Also wie man Events schreibt weiß ich, nur wüsste ich nicht, wie bzw. wann ich das auslösen soll).

Wäre für Ideen und Ratschläge sehr dankbar 😃

Gruß
Bugrick

20.09.2011 - 17:01 Uhr

Hi,

sieh dir das mal an 😃

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_Session);

Vergiss nicht:

using Microsoft.Win32;

Ob das System dann gesperrt oder entsperrt wurde, steht in den EventArgs in "e.Reason":

private void SystemEvents_Session(object sender, SessionSwitchEventArgs e)
{
}

An dieser Stelle kannst du dich dann einklinken.

Gruß
Bugrick

19.09.2011 - 16:43 Uhr

Hallo,

da deine Frage recht wirr gestellt ist, kann ich dir auch keine genaue Antwort geben.

Sieh dich mal ein wenig auf der MSDN (z.B. DataGridView.DataMember Property) um und probier etwas mit dem Properties herum.

Auch Google spuckt zu diesem Thema sehr viel aus, besonders mit dem Kunden-Beispiel.

Gruß
Bugrick

19.09.2011 - 16:28 Uhr

Hallo baer999,

dieses Thema wurde hier schon sehr oft behandelt, guck bitte immer erst in den FAQ und nutz die Forumssuche.

Eigenes Event definieren

Außerdem solltest du bitte etwas mehr auf deine Rechtschreibung achten.

Wenn ich dir noch einen Tipp geben kann: Leg dir ein Projekt an, in dem du ein Event definierst, von da kannst du es dann immer abgucken, wenn du mal ein neues Event schreibst, so hab ich das auch gemacht 😉

Gruß
Bugrick

30.08.2011 - 12:21 Uhr

Hallo,

verwende statt f.Show(); einfach f.ShowDialog();

Das Formular mit dem Button ist dann gesperrt. Wäre das ok?

Gruß
Bugrick

02.05.2011 - 20:27 Uhr

Hallo Richman007,

ich habe gerade etwas in der user32.dll gesucht und bin auf folgendes gestoßen, hoffe es hilft dir weiter:


        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetForegroundWindow();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();        
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            foreach (Process proc in Process.GetProcesses())
            {
                if (proc.ProcessName.Contains("firefox"))
                {
                    if (proc.MainWindowHandle.Equals(GetForegroundWindow()))
                        this.Text = "true";
                    else
                        this.Text = "false";
                }
            }  
        }

PS: System.Diagnostics und System.Runtime.InteropServices natürlich nicht vergessen 😉

27.04.2011 - 23:41 Uhr

Screenshot

27.04.2011 - 23:40 Uhr

Beschreibung:

Die DLL enthält 3 (eig 4) Controls:

  • Eine einfache 7-Segmentanzeige, als Wert ist ein einfacher Integer zuweisbar.
  • Ein passendes Control, das einen Doppelpunkt und ein Komma bereitstellt
  • Ein Uhrzeiten-Panel, dass 6 7-Segmentanzeigen und 2 Doppelpunkte enthält, man kann jedes Segment einzeln ansprechen oder dem Control ein DateTime zuweisen. Außerdem hat es ein MouseClick-ähnliches Event.

Allen Controls ist ein "LedLayout" zuweisbar, außerdem kann man auswählen ob inaktive Segmente angezeigt werden sollen. Jedes Control hat eine nichtveränderbare Größe (vll arbeite lass ich mir da aber noch was einfallen^^).

Die 7-Segmentanzeige arbeitet nach folgender Logik (hatte wohl nen guten Tag, sonst wäre mir sowas nie eingefallen^^):
Siehe Anhang

Hier ein paar Screenshots der Controls:
Siehe Anhang

Viel Spaß damit, Kritik und Verbesserungsvorschläge aller Art sind natürlich erwünscht 😉

Der Quellcode ist etwas zu umfangreich, um ihn hier zu posten, am besten mal in der Entwicklungsumgebung angucken 😃

Hier nur einmal die Basisklasse:


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

namespace LedControls
{
    public class LedControl : Control
    {
        bool _bPaintDarkControls = false;
        Color _col = new Color();
        Color _colDark = new Color();

        public LedControl()
        {
            this.SetStyle(ControlStyles.DoubleBuffer |
                ControlStyles.UserPaint |
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.SupportsTransparentBackColor |
                ControlStyles.ResizeRedraw, true); 
            this.BackColor = Color.Black;
            this.LedLayout = LedControls.LedLayout.BlueLayout;
        }

        /// <summary>
        /// Gets or sets a value whether the visibility for all segments is enabled.
        /// </summary>
        public bool ShowDisenabledSegments
        {
            get { return _bPaintDarkControls; }
            set
            {
                _bPaintDarkControls = value;
                this.Invalidate();
            }
        }

        /// <summary>
        /// Gets or sets the main color for all enabled segments.
        /// </summary>
        public Color EnabledColor
        {
            get { return _col; }
            set
            {
                _col = value;
                this.Invalidate();
            }
        }

        /// <summary>
        /// Gets or sets the main color of all disenabled segments.
        /// </summary>
        public Color DisenabledColor
        {
            get { return _colDark; }
            set
            {
                _colDark = value;
                this.Invalidate();
            }
        }

        /// <summary>
        /// Gets or sets both colors for all segments.
        /// </summary>
        public Color[] LedLayout
        {
            get { return new Color[2] { _col, _colDark }; }
            set
            {
                _col = value[0];
                _colDark = value[1];
                this.Invalidate();
            }
        }
    }
}

Schlagwörter: LedControl, 7-Segmentanzeige, Siebensegmentanzeige, 7Segmentanzeige

Das Demoprojekt hat wegen 5KB (!) leider nicht mehr in diesen Anhang gepasst und folgt im nächsten Beitrag/Anhang

27.04.2011 - 23:40 Uhr

Wie angekündigt, hier das Demoprogramm.

19.04.2011 - 12:46 Uhr

Also das Problem hab ich bisher immer über den ARGB-Wert gelöst, wenn du den A-Wert gering hälst (in dem Fall hier 64;255;0;0), erzeugst du eine gewisse Transparenz:

14.04.2011 - 23:42 Uhr

Hi,

das hier würde funktionieren, aber ich glaub das ist sehr unsauber:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        DataGridViewTextBoxCell dgvTxt = new DataGridViewTextBoxCell();
        dgvTxt.Value = dataGridView1.CurrentRow.Cells[dataGridView1.CurrentCell.ColumnIndex].Value;
        dataGridView1.CurrentRow.Cells[dataGridView1.CurrentCell.ColumnIndex] = dgvTxt;
    }
    catch (NullReferenceException)
    {
    }
}

Was besseres ist mir um diese Uhrzeit nicht mehr eingefallen, also lieber mal nach etwas anderem ausschau halten.

14.04.2011 - 19:55 Uhr

Sehr geil!

Zwar funktioniert

public FixedTestControl100()
        {
            base.Size = new Size(100, 100);
            base.SetStyle(ControlStyles.FixedHeight, true);
            base.SetStyle(ControlStyles.FixedWidth, true);
            base.RecreateHandle();
        }

nicht, da man die Größe trotzdem noch verändern kann, aber

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
        {
            base.SetBoundsCore(x, y, 100, 100, specified);
        }

hat mir weitergeholfen. SetBoundsCore() war mir noch nicht bekannt, danke Cat.

Jetzt ist noch unklar warum VS abstürzt aber ich werde es bei Gelegenheit mal beim 2010er versuchen und sehen, ob der Fehler da auch auftritt.

14.04.2011 - 18:54 Uhr

Hallo,

ich habe diese Woche feststellen können, dass Visual Studio 2008 unter folgenden Umständen abstürzt:

Ich habe ein ganz einfaches Control in einem DLL-Projekt geschrieben (Klasse TestControl erbt von Control):

public class FixedTestControl150 : TestControl
    {
        public FixedTestControl150()
        {
            base.Size = new Size(150, 150);
        }

        //public new Size Size
        //{
        //    get { return this.Size; }
        //}
    }

Beim verwenden des Controls, also sobald ich es von der Toolbox in meine Form im Designer ziehe, stürzt VS ab. Aber nur, wenn ich den oben auskommentierten Code verwende.

Kann mir jemand sagen, was an dem falsch ist? o.O

Das seltsame ist, wenn ich das Control im Code verwende, funktioniert alles perfekt, auch wenn ich die auskommentierte Property nutze:

FixedTestControl150 fsc150 = new FixedTestControl150();

        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            fsc150.Location = new Point(125, 10);
            this.Controls.Add(fsc150);
        }

Hab die Test-Solution mal angehängt, hoffentlich weiß von euch jemand Rat.

Danke schonmal 😃

PS: Sinn und Zweck des Controls ist übrigens, dass ich die Größe selbst festlegen kann, jedoch nicht derjenige, der das Control nutzt 😉 Funktioniert ja wie gesagt auch.

21.03.2011 - 20:20 Uhr

Das funktioniert aber nicht in Farbe^^ Also diese DrawTextOnGlass()-Methode... Und ist mir ehrlich gesagt auch im Moment noch etwas zu hoch, habe nicht die Zeit mich darin einzuarbeiten. Konnte mit dem Code wenig anfangen.

Vermutlich wird das alles nix -.- Hier (http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/) steht auch (typischerweise):

Variante 2. "The Microsoft Way"

Natürlich stolpert man irgendwann bei der Recherche über das Windows API SDK in dem es einige Beispiele dazu gibt wie man die neuen Funktionen in Windows benutzt, darunter natürlich auch Glas.

Der Ansatz den Microsoft da aber nach ihrer eigenen Best Practise verwendet ist aber eher ernüchternd. Hier geht es nach dem Motto, platziert einfach keine Steuerelemente auf dem Glas! - Super nicht?

Also WindowsAPICodePack kann ich wohl in die Tonne treten.

Dann vielen Dank so weit, vll hat ja trotzdem noch jemand ne weitere, einfache Idee 😃

21.03.2011 - 16:27 Uhr

Hi,

danke für den Hinweis. Ich bin davon ausgegangen du meinst:

Application.SetCompatibleTextRenderingDefault(true);

So wird tatsächlich Farbige Schrift dargestellt, jedoch auch wieder mit diesem Schmiereffekt -.- Damit möchte ich mich aber nicht zufrieden geben, es muss ja noch eine saubere Lösung geben...

20.03.2011 - 22:04 Uhr

Wenn ich die Hintergrundfarbe auf Transparent stelle, ist sie bei normalen Labels schwarz und bei meinen AeroLabels durchsichtig, jedoch beides mit Schmiereffekt.

Hilft also nix 😦

Hab schon alle Varianten durchprobiert: Im Konstruktor vor dem InitializeComponent(); und auch danach bzw erst im Load-Event.

18.03.2011 - 17:02 Uhr

Hallo,

ich arbeite zur Zeit mit GlassForms, ich nutze dafür die WindowsAPICodePack.Shell:


using ...
using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Shell;

namespace WindowsFormsApplication1
{
    public partial class Form1 : GlassForm
    {
        ...

    }
}

Jetzt steh ich vor Folgendem Problem:

Beim Versuch farbige Schrift auf diesen GlassForms darzustellen, in dem ich ganz einfach ein Label nutze, erhalte ich diesen unschönen Schmiereffekt:

Mittlerweile bin ich auch schon etwas vorangekommen, dank dem Paint-Event des Labels. In dem Demoprojekt, das anhängt, befindet sich eine *.dll, in der ein paar Controls sind, die mit dem Paint-Event neu gezeichnet werden und so besser dargestellt werden. Links die AeroControls, rechts die normalen:

Wie man sieht, hat man auch bei normalen Controls ein Problem mit der Schriftfarbe, auf weißem Hintergrund verändert sich die Farbe einfach o.O (zu sehn an dem "st3 und st4 von Test3 und Test4).

Damit die Schriftarbe überhaupt einigermaßen dargestellt wird, habe ich für die Farben übrigens immer Color.FromARGB(254, X, X, X); verwendet.

Jetzt du dem, was ich eigentlich erreichen möchte:

Kann mir jemand erklären, wie es über die WindowsAPICodePack.Shell oder auch irgendwie anders möglich ist farbige Schrift sauber auf die GlassForms zu bringen?
Am besten so, wie dieses "Hello" dargestellt ist?

Danke schon mal im Voraus.