Moin,
mir ist gestern auch durch den Kopf gegangen, dass auf diese Art und Weise der Post-Counter ziemlich stark erhöht wird. Kann man nicht einzelne Threads vom Zähler ausschließen? Oder geht das nur für komplette Unterforen?
Gruß,
Markus 😃
Moin nochmal,
ich hab eine relativ simple Möglichkeit gefunden: Man verwendet die DrawToBitmap()-Methode des Controls, das ausgeblendet werden soll um einen Screenshot des Control zu erhalten. Dann versieht man das Bild Pixel für Pixel mit der gewünschten Transparenz. Anschließend weist man das so entstandene Bitmap einer PictureBox zu, die man über das Control legt. Die Farbe des Overlays lässt sich so über die Hintergrundfarbe der PictureBox beeinflussen...
Das funktioniert in meinem Fall, da sich das "unterlegene" Control nicht verändert während es ausgegraut ist...
Gruß,
Markus 😃
[EDIT=herbivore]Threads zusammengefügt[/EDIT]
Moin zusammen!
Gibt es eine möglichkeit ein halbtransparentes Overlay über einen Teil der Anwendung (konkret ein einzelnes UserControl) zu legen?
Die Möglichkeit eine halbtransparente Form zu nehmen ist nicht praktikabel, da sich das UserControl in einem DockingManager befindet - und ich überdies über dem Overlay nicht transparente Controls brauche die der Benutzer ganz normal bedienen kann.
Der Effekt soll sich ungefähr so darstellen wie die UAC in Windows Vista oder die LightBox für Webseiten.
Viele Grüße,
Markus 😃
EDIT: Gerade gesehen, dass es sowas hier schon gab, allerdings nicht wirklich erfolgversprechend: Transparentes Overlay. @Moderatoren: Vielleicht könnt ihr die threads zusammenführen...
Moin zusammen,
hab gerade auf heise.de gesehen, dass der Verlag einen neuen Channel für Software-Entwickler bereitstellt: heise Developer: Neuer Online-Channel für Softwareentwickler
Vielleicht ist ja da in Zukunft auch der ein oder andere interessante Artikel dabei...
Gruß,
Markus 😃
Die Pokeranwendung, läuft die in einer Windows-Form oder ist die Fullscreen? Verwendet die DirectX o.Ä?
Moin,
vor allen Dingen ist die Frage interessant vor was für eine Anwendung du das Fenster legen willst. Deine Hinweis auf die Performance lässt mich vermuten, dass du es über ein Spiel legen willst?
Gruß,
Markus 🙂
Moin prakti08,
das machen wir bislang so - das Problem ist, dass wir das Interface in mehreren Klassen implementieren müssen die nicht voneinander ableiten können. Und dafür suchen wir eine Lösung (die herbivore ein paar Beiträge weiter oben auch schon genannt hat).
Gruß,
Markus 🙂
Moin FZelle,
Danke für den Hinweis, ich hab mir die LinFu-Bibliothek mal angesehen, denke aber das die (resp. das Ducktyping) für meine Zwecke nicht unbedingt geeignet sind (ohne das jetzt am Code gestestet zu haben).
Ich werde die aber auf alle Fälle im Hinterkopf behalten - und sollte ich da nochmal ran (im Augenblick habe ich andere Aufgaben) werde ich das nochmal ausführlicher evaluieren...
Gruß,
Markus 🙂
Hallo kleines_eichhörnchen,
vielen Dank für die Erläuterung, jetzt ists klarer geworden. Ich werde mir dann nächste Woche mal Gedanken machen ob und wie das umzusetzen ist.
Das Problem, das ich hier habe ist nämlich auch noch, dass das Problem bisher einfach mit Interfaces gelöst ist, was zwar bescheiden zu warten ist, aber funktioniert. Von daher ist das Budget für eine entsprechende Änderung des Designs nicht gerade üppig... 😉
Viele Grüße und schönes Wochenende,
Markus 🙂
Moin herbivore,
das hatt eich ja unter Pkt. 3 meiner Lösungsansätze auch schon genannt. Dann werde ich das mal so machen.
Nochmals allen beteiligten vielen Dank für die Hilfe!
Viele Grüße,
Markus 🙂
@kleines_eichhörnchen: Ja. Hier geht es ausschließlich um "Ist"-Beziehungen.
Nochmal zu deinem Factory-Vorschlag. Ich blick da noch nicht ganz durch. Ich hab mir zwar nochmal das Pattern der Fabrikmethoden und der abstrakten Fabrik angesehen, aber ich kann noch nicht ganz nachvollziehen, in welcher Art mir das nützen sollte... - Insbesondere in Bezug auf die Tatsache, dass ich ja von der erstellten Klasse ableiten können möchte, was ja schon zur Design-Zeit und nicht erst zur Laufzeit passoert. Oder steht ich da jetzt auf der Leitung?
Gruß,
Markus 🙂
Moin moin,
Vielen Dank für Eure Antworten
Eine kleine Sache habe vielleicht unglücklich erklärt: Auch ein BöserHübscherKobold dient lediglich als Basisklasse für einen "konkreten" Kobold. So könnte es z.B. die Klasse GemeinerGartenzwerg : BöserHübscherKobold
geben.
Zusätzlich hat nicht jeder Kobold eine Gesinnung. Es mag auch einen hübschen Kobold geben, der weder gut noch böse ist.
@kleines_eichhörnchen: Ich brüte noch über deinem Ansatz 😉
@Lector: Aufgrund der Tatsche, dass selbst ein BöserHübscherKobold nur als Basisklasse dient, brauche ich die Möglichkeit bestimmte Methoden zu überschreiben - ohne gleich wieder jede Menge weiterer Klassen ableiten zu müssen.
Moin nochmal,
ich habe festgestellt, dass das Decorator-Pattern nicht ganz das Richtige für meinen Zweck ist. damit hat sich oben genanntes Problem für's erste erledigt.
Für eine Beschreibung meines Problems mit meinen bisherigen Lösungsansätzen habe ich einen neuen Thread eröffnet: "Mehrfachvererbung" in .NET
Nochmals Danke für Eure Hilfe!
Viele Grüße,
Markus 🙂
Moin zusammen,
ich weiß, dass das .NET-Framework keine Mehrfachvererbung kann. Trotzdem frage ich mich, ob es Möglichkeiten gibt etwas ähnliches zu implementieren.
Problemstellung
Das Programm verfügt über eine recht komplexe Klassenstruktur. Ich möchte das am Beispiel eines Kobolds verdeutlichen. Basisklasse ist die Klasse Kobold
. Alle Klassen sind von dieser abgeleitet. Kobolde gibt es jedoch in unterschiedlichen, beliebig kombinierbaren Ausprägungen, Gut, Böse, Hübsch und Hässlich. Jede dieser Ausprägungen ist durch eine enstrpechende Schnittstelle definiert, die teilweise recht aufwändig sein kann; so werden zur Implementierung einer Schnittstelle nicht nur die öffentlichen Methoden, Eigenschaften und Ereignisse benötigt, sondern zusätzlich private Felder und private Helfermethoden.
Aus dem unten angehängten Klassendiagramm ist ersichtlich, dass die Schnittstelle IHübsch gleich in zwei Klassen implementiert wird, die nicht von einer gemeinsamen Basisklasse ableiten.
Dieses Problem tritt im echten Projekt gleich auf mehreren Ebenen und mit einer Vielzahl weiterer Schnittstellen auf. Das macht den Code nicht nur unübersichtlich und schlecht wartbar (etwaige Änderungen müssen an zig Stellen nachgepflegt werden), sondern auch Fehleranfällig (etwaige Bugfixes werden nicht an allen Stellen durchgeführt).
Lösungsansätze
1.Schnittstellen
Schnittstellen sind in diesem Fall kein Lösungsansatz, sondern das Problem. Sie liefern zwar Methoden, Eigenschaften und Ereignisse, bringen jedoch keine Standard-Implementierung mit
1.Decorator-Pattern
Das Decorator-Pattern klingt hier zunächst brauchbar, ist es aber bei näherem Hinsehen nicht. Dekoriere ich einen Kobold zuerst mit dem Attribut "Gut" und dann mit dem Attribut "Hübsch", würde eine Abfrage Kobold is IGut
das Ergebnis false
zurückliefern. Das darf aber nicht sein. Nun könnte man (wie in Überladung von Cast-Operatoren zwischen Typ und Sub-Typ beschrieben) eine eigene Methode implementieren oder den TypeConverter verwenden um den Cast in den Griff zu bekommen. Bleibt das Problem, dass man in dekorierten Klassen nicht ohne weiteres Methoden der Dekorierer überschreiben kann.
1.Statische Hilfsklasse
Man könnte eine statische Hilfsklasse für jedes Interface definieren, die Methoden definiert, die man aus der die Schnittstelle implementierenden Klasse aufrufen könnte. Trotzdem müssten jedoch in der eigentlichen Klasse alle privaten Felder definiert und der statischen Helfermethode als Referenz übergeben werden.
Frage
Kennt jemand Mechanismen (ab .NET 2.0) mit denen man dieses Problem eleganter angehen könnte (außer auf eine Programmiersprache zu wechseln die Mehrfachvererbung beherrscht)?
Vielen Dank für Eure Hilfe!
Viele Grüße,
Markus 🙂
Edit: Anhang vergessen...
Aber habe ich das richtig verstanden, dass der TypeConverter mir auch den impliziten (oder expliziten) Cast bietet?
Ich habe jetzt einen eigenen TypeConverter gebaut, und diesen per Attribut der Basisklasse (Kobold
) zugewiesen. Im TypeConverter habe ich die CanConvertTo
- und die ConvertTo
-Methoden überladen. Die werden aber gar nicht aufgerufen, wenn ich versuche einen Kobold zu casten...
Oder bin ich da jetzt vollkommen auf dem Holzweg und hab das Prinzip noch nicht verstanden?
Gruß,
Markus 🙂
Moin,
danke für die Antwort! Ich hab mal versucht den TypeCOnverter anzuwenden, aber so richtig funktionieren will das noch nicht. Irgendwo hab ich da noch den Wurm drin. Ich werde erstmal weiter probieren und melde mich dann ggf. nochmal.
(Das Zeitfenster was ich zur Lösung dieses Problems habe, ist nicht unbedingt groß - deswegen kann es sein, dass da jetzt erstmal nix mehr kommt, weil ich die Lösung des Problems nach hinten schieben muss...)
Viele Grüße,
Markus 🙂
Moin zusammen,
ich habe ein Problem beim Überladen von Casting-Operatoren. Angenommen ich habe eine Instanz der Klasse Kobold
, die ich per Decorator-Klasse zu BöserKobold
und diese wiederum zu BöserHässlicherKobold
mache. Jetzt möchte ich diese Instanz nach HässlicherKobold
casten - wenn das denn möglich ist. Dazu habe ich mir eine Methode geschrieben, die genau diesen Cast ausführt:
public static T As<T>(Kobold a_convertFrom) where T : Kobold{
// Return-Wert initialisieren
T returnValue = null;
// Startwert für den Suchvorgang setzen
Kobold currentKobold = a_convertFrom;
// Suchen solange noch keine gültige Instanz gefunden wurde
while (returnValue == null) {
// Kobold in die Decorator-Basisklasse casten
KoboldDecorator baseDecorator = currentKobold as KoboldDecorator;
// Wenn der Cast geklappt hat...
if (baseDecorator != null) {
// Nachschaun, ob sich dieser Basisdecorator in den
// von mir gewünschten Typ casten lässt
returnValue = baseDecorator as T;
// Wenn dem nicht so ist, das interne Objekt
// des Decorators abholen und damit weitersuchen
if (returnValue == null) {
currentKobold = baseDecorator.innerKobold;
}
}
// Wenn sich der Kobold schon nicht in einen Decorator
// casten lässt wird er kaum ein solcher sein, ich
// brauche also gar nicht weitersuchen.
else {
break;
}
}
}
Der folgende Aufruf liefert exakt das gewünschte Ergebnis:
HässlicherKobold myHässlicherKobold = Kobold.As<HässlicherKobold>(myBöserHässlicherKobold);
Diese Methode funktioniert also wie gewünscht - nur hätte ich gerne, dass ich die über einen normalen Cast ansprechen kann:
HässlicherKobold myHässlicherKobold = myBöserHässlicherKobold as HässlicherKobold;
Dummerweise ist die folgende Methode der Basisklasse Kobold
(von der alle Decorator-Klassen abgeleitet sind) nicht kompilierbar:
public static explicit operator HässlicherKobold( Kobold a_convertFrom ) {
return Kobold.As<HässlicherKobold>( a_convertFrom );
}
Die vom Compiler ausgegebene Meldung sagt schlicht "user-defined conversions to or from a derived class are not allowed". Gibt es eine Möglichkeit das dennoch zu erreichen?
Gruß,
Markus 🙂
Moin moin!
Das Problem hatte ich auch mal - ich hab den Text dann selber aufgenommen (Kassette, MP3-Player, whatever...) und ihn dann angehört...
Gruß,
Markus 🙂
Die Klasse bekommst du mit
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
Gruß,
Markus 🙂
Moin,
in so einem Fall würde ich die ganze Datenverarbeitung (das was jetzt die Konsolenanwendung macht) in ein eigenes Projekt (also eine extra DLL) auslagern und die sowohl aus einer Windows.Forms-Anwendung als auch aus der Konsolenanwendung verwenden...
Gruß,
Markus 🙂
**:::
Oder übersehe ich gerade was?
Ja. Siehe:
das man da den ! Operator nehmen könnte ham die meisten noch ned überrissen ...
Gruß,
Markus 😉
Moin,
eine (zugegeben etwas ältere) Lösung für dein Problem gibt's hier: TabControl-Reiter
Gruß,
Markus 🙂
*hngrmpf* =)
Nochmal vielen Dank an den Erfinder und an herbivore für die Hilfe - es war tatsächlich eine Exception die das Fehlverhalten verursacht hat - allerdings eine gefangene! 🤔 Nunja - jetzt geht es.
Viele Grüße,
Markus 🙂
Moin herbivore,
danke für deine Antwort - wie auch immer: Ich hab die vom Erfinder vorgeschlagene Lösung gerade ausprobiert und das Ergebnis ist immer noch das gleiche. Allerdings bin ich dabei auf einen anderen Fehler gestoßen, den ich jetzt erstmal beseitigen werde um zu sehn obs vielleicht daran liegt...
Gruß,
Markus 🙂
Guten Morgen,
bin soeben wieder an meinem Schreibtisch angekommen und wollte den Vorschlag des Erfinders (schon das Feuern des Events im GUI-Thread zu veranstalten) mal ausprobieren.
Das geht aber nur, wenn die Logik-Klasse die GUI-Klasse kennt - oder? Sonst weiß ich ja gar nicht in welchem Thread ich den Aufruf ausführen muss. Oder habe ich da jetzt einen Denkfehler drin?
Viele Grüße,
Markus 🙂
Edit: Hinweis vom Erfinder auf Extension-Method überlesen...
Werde ich morgen mal machen - Ich melde mich dann wieder. Nochmals danke für die Hilfe!
Gruß,
Markus 🙂
Das Event heißt SnapshotImageChanged(object sender, Image snapshot) - und die oben erwähnte Methode wird von eben diesem EventHandler aufgerufen... Aber selbst wenn ich den BeginInvoke-Aufruf im EventHandler und nicht in der Methode meinHandler() zeigt er das oben beschriebene Fehlverhalten.
Und ein extra-Event für die GUI zu bauen halte ich für ein wenig unschön. Irgenwo muss ich doch einen Fehler eingebaut haben? Es kann doch nicht sein, dass das .NET-Framework an so einer Stelle patzt?
Ich habe die Methode nochmal durchgesteppt und festgestellt, dass er immer an völlig verschiedenen Stellen springt - ohne das irgendwo eine Exception auftritt...
Moin Erfinder,
ich werde da nochmal genau durchsteppen um zu sehen wo genau er fliegt. Das das Event sofort im GUI-Thread gefeuert wird ist in meinem Fall eine weniger gute Idee, da das Event nicht nur von GUI-, sondern auch von anderen Logik-Klassen abonniert wird...
Gruß,
Markus 🙂
Moin herbivore,
nein, tue ich nicht. Der im try-catch stehende Codeblock enthält ein paar String-Operationen, Wertzuweisungen (sowas wie .Visible = false, .Image = m_someImage oder .BackColor = Color.Black)...
Gruß,
Markus 🙂
Moin zusammen,
ich beiße mir seit gestern die Zähne an einem Problem in unserer Software aus - es geht sich um folgendes:
In einem Container sind mehrere identische UserControls enthalten, die sich allesamt auf ein Event aus einer Logik-Klasse registriert haben. Feuert die Logik-Klasse das Event, werden die Methoden im Control auch aufgerufen. Um aus diesen Methoden auf die GUI zuzugreifen, befördere ich sie mittels BeginInvoke in den GUI-Thread:
01: public void meinHandler() {
02:
03: if (InvokeRequired) {
04: BeginInvoke( new MethodInvoker( meinHandler ) );
05: return;
06: }
07:
08: try {
09:
10: // Hier jede Menge GUI-Sachen erledigen,
11: // wie Hintergrundfarben setzen, Bilder zuweisen,
12: // Beschriftungen setzen, Steuerelementpositionen setzen, etc...
14: doLoadsOfFunnyGUIStuff();
15:
16: } catch (Exception ex) {
17: logTheException(ex);
18: }
19:
20: }
Der fehlerhafte Ablauf ist jetzt wie folgt: Die Methode meinHandler wird ausgeführt (Breakpoint in Zeile 8 wird erreicht, Objektvariablen zeigen Steuerelement Nr. 2 an) irgendwann danach (also in einer der zahlreichen GUI-Anweisungen) bricht der Ablauf der Methode ab, der Breakpoint in Zeile 8 wird erneut erreicht, die Objektvariablen zeigen jedoch diemal an, dass ich mich in der entsprechenden Methode von Steuerelement Nr. 1 befinde. Hat jemand eine Erklärung dafür?
Viele Grüße,
Markus 🙂
PS: @JAck30lena: Vielen Dank für den myCsharpBBCoder 👍
Edit: Rechtschreibfehler...
Um Pfade zusammenzustellen kann man auch Path.Combine(part1, part2); nehmen - dann passt der Trenner - und man muss sich nicht drum kümmer ob einer von den teilen evtl. schon mit einem Trenner versehen ist oder nicht...
Gruß,
Markus 🙂
(Ich hab grad mal STRG-V gedrückt - und dann kam ein Lizenzschlüssel von einer Software, die ich gerade installiert hatte - den wollte ich dann doch nicht stehn lassen...)
umgekehrtes Reversing? Anhand eines Lizenz-Schlüssels herausfinden, welche Software dazu passt?! 🤔
Hmm - da hast du wohl recht... =)
(Ich hab grad mal STRG-V gedrückt - und dann kam ein Lizenzschlüssel von einer Software, die ich gerade installiert hatte - den wollte ich dann doch nicht stehn lassen...)
Du kommst aus dem Gefängis frei, stehst vor einem roten haus und weißt du bist ruiniert. Was ist passiert?
...ich tipp einfach mal auf Monopoly.
mfg,
Lec
Richtig!
Hehe - da fällt mir auch noch einer ein:
Du kommst aus dem Gefängis frei, stehst vor einem roten haus und weißt du bist ruiniert. Was ist passiert?
Ich auch: Herzlichen Glückwunsch - und Dank an alle die MyCsharp in den letzten 5 Jahren möglich gemacht haben!
Viele Grüße,
Markus 🙂
Moin,
such mal nach "ShowWindow" - ist eine Funktion der user32.dll
Gruß,
Markus 🙂
Einfach folgendes angeben:
[url]http://msdn.microsoft.com/de-de/library/...ol.autopostback(VS.80).asp[/url]
Ergebnis: http://msdn.microsoft.com/de-de/library/...ol.autopostback(VS.80).asp
Das sollte für's erste abhilfe schaffen...
Das was mir spontan einfällt wäre den Offset der Zeit mitzuspeichern. Also die UTC-Zeit und für die jeweilige Zeitzone die Differenzstunden zu UTC. So bekommst du überall auf der Welt die lokale Zeit...
Gruß,
Markus 🙂
Hallo Andreas,
vielen Dank für deine Hilfe - die Variante mit den Werten in einem object[] hat's gebracht. Jetzt macht die Methode zwar immer noch nicht was sie soll aber sie schmeißt keine Exception mehr... - und das sie nicht das mach, was sie soll liegt an den übergebenen Werten.
Nochmals danke!
Gruß,
Markus 🙂
Das interessiert mich auch - im Web findet man ne Menge Infos, davon aber nur sehr wenig Grundlageninfos, sondern hauptsächlich spezielle Probleme - und wenn man Glück hat auch deren Lösungen...
Gruß,
Markus 🙂
Moin zusammen,
folgende Problemstellung. Ein in meiner Anwendung verwendetes ActiveX-Control stellt die Methode
sendRCP(object rCP)
zur Verfügung. Laut Doku des Hertellers erwartet die Methode einen...
...Variant of type SafeArray that holds the command to be transmitted. For the definition of variants and SafeArrays see the Microsoft OLE documentation.
Die Daten die ich übergebe haben folgendes Layout:
struct RcppMessage {
public short command;
public byte dataType;
public byte versionReadWrite;
public byte action;
public byte reserved;
public short clientId;
public long sessionId;
public short num;
public short payloadLength;
public byte[] payload;
}
Seit ich heute morgen an meinem Arbeitsplatz sitze, reise ich durch die unendlichen Weiten des großen **:::
Erster Ansatz war der folgende:
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
private RcppMessage[] m_rcppCommands;
private void sendCommand () {
msg = new RcppMessage();
msg.versionReadWrite = 0x31;
msg.action = 0x00;
msg.reserved = 0x00;
msg.clientId = ClientID;
msg.sessionId = 0;
msg.command = 0x0019;
msg.dataType = 0x14;
msg.num = 0;
msg.payloadLength = 0;
msg.payload = new byte[0];
m_rcppCommands= new RcppMessage[] { msg };
return ocxDisplay.SendRCP( m_rcppCommands);
}
Das liefert bei Aufruf der Methode ocxDisplay.SendRCP eine Exception mit folgendem Inhalt:
Falscher Parameter. (Ausnahme von HRESULT: 0x80070057 (E_INVALIDARG))
Der zweite Ansatz war das Struct RcppMessage direkt als SafeArray zu "marshaln" - das hat aber auch nicht funktioniert.
Hat jemand von Euch Erfahrung mit sowas und kann mir helfen dieser Methode das Struct so zu übergeben, dass sie keine Exception mehr schmeißt?
Gruß,
Markus 🙂
Bot JAck30lena funktioniert irgendwie nicht richtig.
JAck30lena.enabled = false;
gab bestimmt einen BufferOverflow 😉
Wir sollten mal drüber nachdenken ob sich da nicht beliebiger Code einschleusen lässt...
Nicht in der Datei MainForm.cs, sondern in der Datei program.cs musst du suchen...
Moin,
40 Stunden sind bei einer geschätzten Arbeitszeit von 8 Stunden pro Tag gerade mal eine Woche. Verschätze dich nicht bei den Aufwänden die du für so ein Projekt brauchst. Auch hier gilt die 80:20 Regel: Für 80% der Arbeit brauchst du 20% der Zeit - und umgekehrt...
Zusätzlich musst du da ja auch noch was zu schreiben oder?
Gruß,
Markus 🙂
Schau dir mal die Auflösung des Systems an. (Eigenschaften von Anzeige -> Einstellungen -> Erweitert -> Allgemein -> DPI-Anzeige). Wenn die beim Zielrechner vom Developmentrechner abweichen könnte das das Problem sein...
Gruß,
Markus 🙂
Soweit ich weiß bringen das schon normale System.Windows.Forms.Textboxen von Haus aus mit. Die Eigenschaften sind die folgenden:
*AutocompleteMode: Setzt den Modus der Autovervollständigung (Anhängen, Vorschlagen, oder Vorschlagen und Anhängen)
*AutocompleteSource: Hier die Quelle der Liste einstellen (CustomSource)
*AutoCompleteCustomSource: Hier eine Liste mit Strings angeben, die man auswählen kann
Ich weiß nicht ob das in einem DataGrid auch geht - bei einem ToolStripMenuItem geht es...
Viele Grüße,
Markus 🙂
Kann man nicht. Dann fehlen die Zahlen 8 und 9...
Gruß,
Markus 🙂
Das kommt auf die vorraussetzungen an. Geht man davon aus nur eine Addition ohne Zwischenergebnisse verwenden zu dürfen ist das Rätsel tatsächlich nicht lösbar. Allerdings steht das mit keinem Wort in der Aufgabenstellung...
Gruß,
Markus 🙂