Laden...
Avatar #avatar-2040.gif
Sprotti myCSharp.de - Member
Zella-Mehlis Thüringen Dabei seit 28.02.2006 112 Beiträge
Benutzerbeschreibung

Forenbeiträge von Sprotti Ingesamt 112 Beiträge

19.02.2024 - 13:52 Uhr

Hi,
habt vielen Dank für Eure Antworten. Ich werde die Lib-API so aufbauen, dass alle Logger optional angegeben werden können. Auch wenn es inzwischen einen NullLogger gibt, ist stets mehr Aufwand mit einer erzwungenen Abhängigkeit generiert.
Mich haben aber besonders die Argumente zum Thema Performance und zusätzlicher Implementierungsaufwand überzeugt.

15.02.2024 - 11:23 Uhr

Hallo,

Ich erfrage hier mal Eure Meinung zum Thema API einer Lib-Assembly.
Ich nutze in meinen Klassen einen Logging Provider. Dieser wird injiziert oder kann injiziert werden. 
D.h. in einigen Klassen ist er als nullable ausprogrammiert. In anderen  Klassen hingegen ist der ILogger nicht nullable. Insbesondere, weil dort durch das Log wichtige Information im Fehlerfall ausgegeben werden. In den Klassen mit nullable kommen ausschließlich optionale Informationen, die nicht zur angeforderten Schnittstellenfunktion beitragen.

Der Sinn beim nullable Typ ist hier, eine Nutzung der Klasse auch zu ermöglichen, wenn kein Logging-Provider für die nutzende App definiert ist.
Jetzt zum Kern meiner Frage:

Macht es mehr Sinn die nullable ILogger rauszuschmeissen und den Anwender der Klasse zum Liefern eines Logging Provider zu zwingen? Er könnte den Logger ja schließlich auch mocken, wenn er keinen Logging-Provider liefern möchte...

Bin gespannt auf Eure Meinungen.

Viele Grüße Sprotti

28.07.2023 - 12:19 Uhr

Ok, das war nun wirklich mal einfach.
VS zeigte im Projektmappen-Explorer in den betreffenden Projekten jeweils einen obj Ordner mit weißem Balken auf rotem Kreis.
Ich habe alle diese obj Ordner komplett abgelöscht und die "doppelte Member - Fehler" waren erledigt.

Leider kann ich nicht sagen, wodurch die obj Ordner entstanden sind und warum sie diese Fehlermeldungen verursachen.

Vielleicht hat da noch jemand Aufklärung parat.

28.07.2023 - 12:04 Uhr

Hallo zusammen,
wenn jemand einen Hinweis geben könnte, warum VS sowas tut...
CS0102 kommt aus der MainWindow.xaml für den Eintrag:

<Button x:Name="btnRestore" Content="Restore"...

zugehörig dazu meint der Compiler CS0229 aus der MainWindow.g.i.cs

Mehrdeutigkeit zwischen "MainWindow.btnRestore" und "MainWindow.btnRestore" für den Eintrag:

public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
	void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target){
		switch (connectionId)
		{
		...
		case 3:
		this.btnRestore = ((Sytem.Windows.Controls.Button)(target));
		return;
		...
		}
		this._contentLoaded = true;
	}

Kann mir jemand sagen, wie ich VS davon überzeuge, dass es selbst den Fehler macht 😉?

Oder sitzt der Fehler evtl. doch wieder vorm Rechner?

12.01.2016 - 14:41 Uhr

Danke für die Links. Mehr ist doch auch nicht erforderlich. Wenn ich die Antwort gefunden habe kann ich sie ja dann immer noch für das Forum aufbereiten. (Um das Thema rund zu machen=)

12.01.2016 - 10:44 Uhr

Es hat auch funktioniert. Ich hatte nur verpasst, dass ich aus Probierwut noch den DataContext auf den Key gesetzt hatte.


 <DockPanel LastChildFill="True" DataContext="OverviewVM">

Hab ihn entfernt und nun läuft es auch.

⚠ An alle WPF Anfänger wie mich... weniger ist mehr. Der notwendige Rest wird von WPF Magic erledigt. ⚠

Problem ist gelöst. Vielen Dank Euch.

Eine Frage hätte ich aber doch noch. Wie wird denn das ActiveViewModel aus dem MainViewViewModel zum DataContext für die View. Welche Stelle in meinem Code sorgt dafür? Blöd wenn etwas funktioniert was du machst und du weißt nicht warum... Hat das was mit dem DataTemplate zu tun? Wird der DataContext der MainView ergänzt oder geändert? Ich habe den DataContext für die MainView eigentlich nur einmal im Code gesetzt.


<Window.DataContext>
   <vm:ViewModelMainPage />
</Window.DataContext>

Von den anderen ViewModels habe ich eigentlich nirgendwo sonst deklariert, dass sie als DataContext für ihre View dienen sollen.

Ach ja, und es wäre natürlich arg hilfreich wenn IntelliSens weiterhin dazu gebracht werden könnte vernünftige Binding Vorschläge zu liefern. Wie muss ich denn MarkupExtension anwenden?

12.01.2016 - 10:02 Uhr

Warum denn? Das ist genau der Knackpunkt,...

Darüber kannst Du von der View aus aufs VM zugreifen.

Brauche ich denn keinen Key für die Bindungen in der View. Was gebe ich den Bindungen als Source mit wenn ich in den Resources den Key OverviewVM nicht mehr deklariere? Bisher habe ich ja die Bindungen der View so geschrieben...


<Button.Command>
  <Binding Source="OverviewVM" Path="CmdApplyPLCSettings"/>
</Button.Command>

Wenn ich die Deklaration in Resources und Source in den Bindungen einfach weglasse, scheint keine Datenbindung für die Felder zu existieren.

11.01.2016 - 15:55 Uhr

Hallo zusammen,
ich habe in CodeProject und hier im Forum schon viel Hilfreiches zum Thema MVVM gefunden und umgesetzt, bin aber nun auf ein ärgerliches Hindernis gestossen.

Situation:
View:
Ich habe eine MainView mit einem ContentControl und Buttons die den anzuzeigenden Inhalt (UserControl) in dieser umschalten. Jedes dieser UserControl entspricht also einer View mit einem dazu gehörenden ViewModel.


<Window.Resources>
 <DataTemplate  x:Key="OverviewTemplate" DataType="vm:ViewModelOverview">
   <local:Overview/>
 </DataTemplate>
 <helper:ViewTemplateSelector x:Key="VTemplateSelector"
  overviewVM="{StaticResource OverviewTemplate}" 
  infoVM="{StaticResource InfoTemplate}"
 />
</Window.Resources>
<Grid>
<ContentControl Content="{Binding ActiveViewModel}" ContentTemplateSelector="{StaticResource VTemplateSelector}"/>
</Grid>

ViewModel:
Im MainViewViewModel wird bei der Umschaltung der gebundenen ActiveViewModel Property das ViewModel der anzuzeigenden View zugewiesen. Im Konstruktor des MainViewViewModels werden alle ViewModels aller möglichen Views instanziiert.


public ViewModelMainPage()
{
   #region create ViewModel Instances
            _overviewViewModel = new ViewModelOverview();            
            _infoViewModel = new ViewModelInfo();
  #endregion
}

private ViewModelBase _activeViewModel;
public ViewModelBase ActiveViewModel
{
   get { return _activeViewModel; }
   set { _activeViewModel = value; RaisePropertyChanged( "ActiveViewModel" ); }
}

In der entsprechenden View wird das entsprechende ViewModel als Resource hinterlegt.


<UserControl.Resources>
   <vm:ViewModelOverview x:Key="OverviewVM"/>
</UserControl.Resources>


Nun wird also stets die dem gerade selektierten ViewModel entsprechende View im ContentControl angezeigt. Aber...

Herausforderung:
wenn ich von einer View in die andere wechsele wird jedes Mal beim erneuten Anzeigen eine neue Instanz der View erzeugt und was noch schlimmer ist, auch eine neue Instanz des zugehörigen ViewModel. Im CallStack ist ersichtlich, dass ausgehend von InitializeComponent der View der Konstruktor des zugeordneten ViewModels aufgerufen wird.

Frage:
Wie stelle ich meinen Code so um, dass die View stets auf die eine Instanz des ViewModel zugreift, welche in dem Konstruktor des MainViewViewModel beim Anwendungsstart erzeugt wurde? Die Instanziierung der ViewModel muss auch nicht unbedingt im MainViewViewModel erfolgen. Ich wäre hier für Vorschläge dankbar wo ein besserer Ort dafür wäre.

24.04.2014 - 21:20 Uhr

Danke Th69, werd gleich mal probieren ob es so funktioniert. Hm, macht sicher das Reindenken einfacher wenn man sich an Coding Conventions hält... werd es beim nächsten Mal versuchen zu beachten. Sorry

24.04.2014 - 16:09 Uhr

Hallo zusammen...

Ich versuche nach der im Netz gefundenen Anleitung Data Binding for Windows Forms eine Datenbindung zu erstellen. Ich habe nach einiger Suche zu Combobox und Datenbindung die Hoffnung verloren in vorhandenen Beiträgen eine sinnvolle Antwort auf mein Problem zu finden. Daher nun der Versuch mit einem eigenen Beitrag.

Test: Windows Form soll Combobox an data binden. Dabei soll ein enum die Quelle für die Items sein und die selected property die Auswahl der Combobox wiederspiegeln.
Problem: Was fehlt noch um die Datenbindung zum Funktionieren zu bewegen?

Hier der soweit erzeugte Code zu data (SelEnum ist halt mein Enum)


public class data
{
        public data()
        {               
        }
        public string selected { get; set; }
        public Array Selection { get { return Enum.GetValues(typeof(SelEnum)); } }
        public string defaultval { get { return SelEnum.dasDritte.ToString(); } }
}

nun hier noch die für die Datenbindung wesentlichen stellen aus InitializeComponent...


//Initialize
this.components = new System.ComponentModel.Container();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
this.label1 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();

//ComboBox
this.comboBox1.DataSource = this.bindingSource1;
this.comboBox1.DisplayMember = "selected";

//BindingSource
this.bindingSource1.DataSource = typeof(comboboxbindingtest.data);

//Label
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "defaultval", true));

//Form
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();


wie ihr seht habe ich versucht über den Designer die Datenbindung herzustellen. Program.cs und Form.cs sind unverändert geblieben.

Ich hoffe es hat jemand Lust sich reinzudenken der mich Nostalgiker unterstützen möchte. 😉

Vermutung: Ich sehe nirgends eine Instantiierung von data. Ich wüsste aber auch keinen Punkt wo ich eine data-Instanz der Datenbindung noch bekannt machen könnte...

02.08.2012 - 13:29 Uhr

Hallo zusammen,
ihr habt sicher recht. Der Aufwand ist zu hoch mit meinem ersten Ansatz.

@herbivore: Ich dachte immer die Sache mit der Wurzel allen Übels hat was mit Frauen und Geld zu tun... 😉 zum Beweis 😉

Vielen Dank an DaMoe80, die Lösung ist kurz, wirksam und prägnant

Ich hab mir aus einem VB Forum jetzt mal was ähnliches ins C# übersetzt. Nicht so kurz aber auch mit Bytevergleich und einigen zusätzlichen Abbruchkriterien im voraus.


////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>   Query if 'bmp1' is Bit by Bit equal to 'bmp2'. </summary>
///
/// <remarks>   Sprotti, 02.08.2012. </remarks>
///
/// <param name="bmp1"> The first bitmap. </param>
/// <param name="bmp2"> The second bitmap. </param>
///
/// <returns>   true if equal, false if not. </returns>
/// /////////////////////////////////////////////////////////////////////////////////////////////////
private bool IsEqual(Bitmap bmp1, Bitmap bmp2)
{
    bool res = true;
    if (bmp1 == null || bmp2 == null)
        return false;
    if (Bitmap.ReferenceEquals(bmp1,bmp2))
        return true;
    if ((bmp1.Width != bmp2.Width) || (bmp1.Height != bmp2.Height) || (bmp1.PixelFormat != bmp2.PixelFormat) )
        return false;
    Rectangle rect = new Rectangle(0,0,bmp1.Width,bmp1.Height);
    BitmapData bd1 = bmp1.LockBits(rect,ImageLockMode.ReadOnly,bmp1.PixelFormat);
    BitmapData bd2 = bmp2.LockBits(rect,ImageLockMode.ReadOnly,bmp2.PixelFormat);
    int intByteZahl = bd1.Stride * bd1.Height;
    Byte[] bmp1_Bytes = new Byte[intByteZahl - 1]; 
    Byte[] bmp2_Bytes = new Byte[intByteZahl - 1]; 
    System.Runtime.InteropServices.Marshal.Copy(bd1.Scan0,bmp1_Bytes,0,intByteZahl-1);
    System.Runtime.InteropServices.Marshal.Copy(bd2.Scan0,bmp2_Bytes,0,intByteZahl-1);

    for (int i = 0; i < intByteZahl-1; i++)
    {
	     if(bmp1_Bytes[i]!=bmp2_Bytes[i])
             {
                 res=false;
                 break;
             }
    }
    bmp1.UnlockBits(bd1);
    bmp2.UnlockBits(bd2);
    return res;
}

Ich denke ich werde dies und DaMoe80s Vorschlag kombinieren und dann auch so nehmen.

Vielen Dank für Eure Gedanken und Unterstützung. Immer wieder schön mit Euch...

02.08.2012 - 10:43 Uhr

Hallo gfoidl,

hab grad auch nach ner Lösung mit Nutzung der gpu gesucht. Bisher aber noch nix gefunden. Mit DirectX könnte sich doch da evtl. auch was drehen lassen... Na mal sehen. Werd mal weitersuchen.

@ gfoidl & herbivore: Bisher erstmal danke für Eure Wegweisung 👍. Wenn ich zu nem Ergebnis gekommen bin melde ich mich wieder.

02.08.2012 - 10:03 Uhr

Hallo herbivore,

Pixelvergleich hört scih nicht so an als gäbs dazu schon eine elegant weil einfach aufzurufende Methode einer schon im .net Framework vorhandenen Klasse, oder?

02.08.2012 - 08:52 Uhr

Hallo,

ich versuche einen UnitTest für mein Nutzerformular zu generieren. Ich prüfe z. Bsp. ab ob das Panle korrekt gedockt bzw. verankert ist, ob die Hintergrundfarbe dem CD unserer Firma entspricht und solche Geschichten... Das funktioniert auch schon prima.
Nun stehe ich beim Firmen Logo vor einem Rätsel

Wie kann ich bei einem Panel.BackgroundImage prüfen ob da auch das richtige Bild angezeigt wird? Ich habe es in den Resourcen und zur Designzeit dem Panel zugewiesen...

Also, wenn jemand ne gute Idee hat, immer her damit. Mir fällt im Moment leider dazu nix ein.

Gruß Sprotti

22.10.2010 - 10:18 Uhr

Hallo,

ich habe eine Bindung in einen Style - Bereich geschrieben und bekomme den gleichen Fehler zu sehen. Gibt es inzwischen Neuigkeiten zu dem Problem? Sind Bindungen in den Bereichen die außerhalb der Deklaration für den Anzeigebereich liegen evtl. deplaziert? Oder wie bekommt man eine solche Funktion ohne Fehler auf die Reihe?

Gruß Sprotti

achso, hier noch etwas code dazu


<UserControl ...
   DataContext="{Binding RelativeSource={RelativeSource Self}}">
   <UserControl.Resources>
      <Style>
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="Template">
               <Setter.Value>
                  ...
                  <GradientStop Color="{Binding Path=InnerCircle}" Offset="0.1" />
               </Setter.Value>
      </Style>
   </UserControl.Resources>
   <Grid>
      <Button ...Name="theButton"/>
   </Grid>
</UserControl>

dabei ist InnerCircle bei mir eine DependencyProperty im CodeBehind

05.05.2010 - 11:14 Uhr

meinst du mit Klassentemplate eine generische Klasse? ich frage wegen der hier beschriebenen Unterschiede: Difference Generics and templates

05.05.2010 - 10:06 Uhr

Kurz zusammengefasst:
bei Delegate/Event würden eben Kommandos ausgelöst wohingegen der Observer explizit auf ein Callback(Stichwort Notify!-Update) ausgerichtet ist.

Ich habe das Argument akzeptiert da sowas gerade bei einer Verwendung der Klasse in SOA zu späteren Designänderungen führen kann.

@JuyJuka: die zu implementierenden Methodenrümpfe der Schnittstelle sind auf diese Weise schon optimiert worden. Der angesprochene Punkt war hier eher die Wiederholung der Deklarationen in den verschiedenen abgeleiteten Klassen.

Ich denke ich werde erstmal den Weg über Snippets gehen. Danke das ihr mich auf den Weg gebracht habt.

05.05.2010 - 09:42 Uhr

Eine abstrakte Basisklasse wäre leider nicht möglich weil die zu erledigende Aufgabe eine Nebenaufgabe ist und die meisten Klassen die die Schnittstelle nutzen daher schon eine Basisklasse haben.

Ich habe vor kurzem ein Streitgespräch mit anderen Entwicklern darüber führen können ob die Event Delegate Geschichte dem Observer entspricht. Ich wurde anhand ausführlicher Betrachtungen zu Verhaltens- und oder Kommandopattern davon überzeugt, dass dies nicht der Fall ist. Daher möchte ich lieber den Weg gehen das Observerpattern auf altherkömmliche Weise umzusetzen.

05.05.2010 - 09:23 Uhr

Hm, ok also an ein Snippet hatte ich noch nicht gedacht. Ich war eher auf dem Weg da was am Design zu drehen.

Ich überlege mir grade ob es nicht möglich wär die Vererbung(der Schnittstelle) gegen Komposition auszutauschen...

Ich bin mir dabei aber etwas unsicher weil ich die pros und kontras nicht so recht einschätzen kann.

Mit nem Snippet wäre natürlich der Schreibaufwand erledigt. Allerdings stören mich hier immernoch die duplizierten Codeblöcke 🙁

05.05.2010 - 08:24 Uhr

Hallo,

über IntelliSense gibt es ja die Möglichkeit sich die Rümpfe der in der Schnittstelle vereinbarten Methoden und Properties anlegen zu lassen.
Ich habe eine Schnittstelle entworfen die ich in 95% aller Anwendungsfälle in den abgeleiteten Klassen immer wieder auf die gleiche Weise implementieren muss.

-Observer Pattern implementieren(Attach,Detach, Notify)
-Hashtable anlegen
-generische Liste anlegen
-Methode zum Vergleich der Daten in den Listen...
irgendwas in der Richtung

Das ist eine stupide Sisyphosarbeit. Kann man das nicht auf irgendeine Weise automatisieren?

Vielen Dank im Voraus für evtl. Hinweise

Gruß Sprotti

02.03.2009 - 09:24 Uhr

Vielen Dank für Eure Hilfe
jetzt komm ich weiter, dachte ich...
Wie passt denn -108 auf einen von den Werten oben? Ich komme doch selbst mit 2er Komplement aus Hex von keinem passenden Wert auf -108 ?(
Wie muß ich den Lparam aufarbeiten damit ich die -108 vergleichen kann?

Gruß Sprotti

27.02.2009 - 15:50 Uhr

@Khalid: welcher int stellt LVN_COLUMNCLICK dar? oder wo ist LVN_COLUMNCLICK als Konstante definiert (namespace.klasse???)

@ErfinderDesRades: DGV hab ich schon im Einsatz an der Stelle allerdings brauche ich Gruppen. ...
Wie ist das mit Parent Child View? Wie ist das gemient in dem Beitrag DGV LV?

27.02.2009 - 11:53 Uhr

leider wird bei der beschriebenen Aktion die 0x203 WM_LBUTTONDBLCLICK Nachricht nicht geschickt.
Mir würde schon das Click ausreichen. Den Rest kann ich im Nachhinein anhand der Resizereaktion des ListView feststellen.
Gruß Sprotti

27.02.2009 - 09:19 Uhr

Hallo mal wieder,

ich bin gerade dabei eine von ListView abgeleitete Klasse zu implementieren.
Die soll bei einem Doppelklick auf den Spaltenheader (Detail-Ansicht) die Spaltenüberschrift mit beachten. Normal passt die ListView die Spaltengröße so an, dass der Spalteninhalt zu sehen ist aber wenn die Überschrift breiter ist wird die mit Te... anstatt Text dargestellt. Jetzt möchte ich das Ereignis Doppelklick auf Spaltenheader halt irgendwie mitbekommen. Leider gibt es da von der ListView selber wohl nichts passendes, daher die Ableitung mit Abfangen der WM_NOTIFY.


        protected override void WndProc(ref Message message)
        {
            const int WM_PAINT = 0xf;
            const int WM_NOTIFY = 0x4E;

             switch (message.Msg)
            {
                case WM_NOTIFY:
                    Debug.WriteLine("pp " + message.LParam.ToString()); 
                    break;
                default:
                    break;
            }
            
            // pass messages on to the base control for processing
            base.WndProc(ref message);
        }

Jetzt bekomme ich aus der Geschichte bei folgender Bedienung eine Menge folgender Int ausgegeben.

Bedienung: Maus auf Spaltentrenner geführt, doppelt geklickt, Maus wieder runter vom ListView
LPARAM-Int Werte:
pp 71028848
pp 71035084
pp 71035092
pp 71034980
pp 71034980
pp 71035116
pp 71034840
pp 71035084
pp 71026684
pp 71026080
pp 71026684
pp 71017024

Jetzt ist mein Problem... welcher dieser int Werte ist der den ich für Doppelklick auswerten kann? Ich habe schon im Netz nach einer Liste mit den Notifications gesucht aber nichts gefunden. Ich denke ich muß auf LVN_MOUSECLICK reagieren. Gibt es da schon was zum einbinden oder hat jemand eine Idee zur Lösung meines Problems?

05.02.2009 - 15:14 Uhr

Hallo,
nicht nur ich habe dieses Verhalten festgestellt. In einem
anderen Forum gab es schon Diskussion über das Thema. Viel mehr hab ich beim Googlen aber auch nicht gefunden.
Das Problem tritt auf wenn die Scrollbar im Detailansicht bei Anzeige von Gridlines mit Klick in die vertikale Scrollbar (zum Seitenweisen Scrollen) bedient wird. D.h. nicht beim Stück für Stück scrollen sondern nur beim Scrollen größerer Abschnitte. Dann werden die Gridlinien nicht zu den Zeilen passend dargestellt, so dass die Schrift in den Zeilen von den Linien durchgestrichen wird.
Dabei gibt es keinen speziellen Code sondern nur die Standardlistview-Komponente. Die Reaktion ist eigentlich auch unabhängig von der eingesetzten Umgebung zu beobachten.
Hat jemand eine Idee wie ich ohne Refresh in die Handler zu schreiben den (D)Ef(f)ekt behebe?
Gruß Sprotti

12.01.2009 - 16:32 Uhr

Hallo nochmal

Habe weiter recherchiert und im
Thread von Mallet die entsprechende WindowsMessage gefunden die mir weiterhelfen kann. Ich stelle vor dem Ausblenden mit Hide jetzt meine Fenstergröße wieder her und habe somit beim windowstate=...normal wieder mein Fenster an der entsprechenden Stelle in entsprechender Größe stehen.

Wenn noch besssere WEge zur Lösung des Problems existieren immer her damit. Sonst ist für mich die Frage beantwortet.

Vielen Dank allen die sich den Thread durchgelesen haben

Gruß Sprotti

12.01.2009 - 15:38 Uhr

Hallo,
ich habe schon gesehen, daß einige Artikel zu dem Thema (auch in Verbinduung mit Tray-Applikationen) hier im Forum stehen und mir alle diesbezüglichen auch durchgearbeitet. In einem dieser Artikel ist das Problem sehr treffend angesprochen, leider aber nicht gelöst worden weil der Effekt (denke ich) nicht genau genug beschrieben wurde.

Das Problem ist, dass wenn showintaskbar auf false steht beim Betätigen des minimize-buttons in der titelleiste das fenster minimiert (auf titelleisten bzw. boxformat gebracht)und auf dem Desktop in der unteren linken Ecke dargestellt wird, bevor das resize-event oder auch die WM_Size Message auftritt. Wenn nun die Hide Methode des Forms ausgeführt wird, verschwindet das Fenster wie gewollt. Allerdings wird durch windowstate=...normal dann nur die minimierte fensterversion wieder in der linken unteren Ecke dargestellt und nicht das Fenster in der Originalgröße an der Originalposition wie vor dem Minimize.

Wie bekommt man dieses Problem in den Griff?

Ich hatte schon überlegt Position und Size vor dem Minimieren abzuspeichern, habe allerdings noch nicht das richtige Event dazu gefunden (also eines bevor das Fenster minimiert ist). Die abgespeicherten Werte könnte man ja beim windowstate=...normal durch einen Handler für WM_Size Restore wieder herstellen.

Habt Ihr Ideen dazu?

28.11.2008 - 14:13 Uhr

an GetMethod übergibt man aber einen string,
wo soll ich denn den + Operator als MethodInfo herbekommen? 🙁

28.11.2008 - 13:40 Uhr

Ich könnte Klasse X ändern. Die Trennung von Typinformation und Wert muß aber zwingend erhalten bleiben. Außerdem ist diese Klasse bei mir so exzessiv genutzt, daß eine Anpassung der Instanzen auf z.B. generisch echt weh tun würde.

@Herbivore wie würde die Nutzung von Reflection denn dann aussehen? Hast Du da mal ein Beispiel?

Ich könnte mir da einen switch basteln in dem ich jeden Typ auswerte und extra behandle aber gibt es da nicht auch noch was anderes als


switch (x1.T)
{
   case typeof(Int32):...
   case typeof(Int64):...
...
}

28.11.2008 - 12:38 Uhr

Ich habe genau die Situation wie in der X-Klasse gegeben. D.h. die Typinformation ist von der Wertinformation separiert. Der eigentliche Wert ist stets nur als object verfügbar. Wie könnte ich denn Generics einsetzen?

Das Problem ist nun wirklich, daß ich nicht weiß wie ich das x1.T dazu verwenden könnte um den x1.Value tatsächlich in einen Int32 casten zu können. (Bzw. in den jeweiligen Typ der in x1.T angegeben wurde, sei es UInt32, Single oder sonst ein numerischer Typ)

28.11.2008 - 12:25 Uhr

Hallo,

ich hätte da mal wieder gerne ein Problem... 😉

man nehme folgende Klassen...


class X
{
   private Type _t;
   private object _val;

   public object Value{get{return _val;}set{_val=value;}}
   public Type T{get{return _t;}set{_t=value;}}
}

class Test
{
   Main()
   {
      Calc c = new Calc();
      X xInt32 = new X();
      X xInt64 = new X();
      xInt32.T=typeof(Int32);
      xInt64.T=typeof(Int64);
      xInt32.Value=(Int32)1;
      xInt64.Value=(Int64)3;
      string s = c.calc(xInt32,xInt64);
      Debug.Write(s);
    }
}

class Calc
{
   public string calc(X x1, X x2)
   {
//***********
//Fehlender Code mangels Wissen
//***********
      Double d = x1.Value + x2.Value;
      return d.toString();
   }
}

⚠ Die hier geschriebenen Klassen sind so natürlich nur zur Verdeutlichung meines Problems vorhanden. Jede Ähnlichkeit mit von mir tatsächlich verwendeten Klassen ist sehr unwarscheinlich. ⚠

?( Jetzt kann ich natürlich keine zwei Objects addieren. Wie kann ich die Typinformation aus der X-Klasse nutzen um die Werte miteinander verrechnen zu können ?(

20.11.2008 - 11:15 Uhr

also im InteropServices hab ich nicht wirklich was hilfreiches gefunden. Es gibt zwar in der Marshal-Klasse eine Methode die mir Type aus einer ITypeInfo Schnittstelle aber wie ich aus dem VarEnum ein ITypeInfo-Objekt generieren soll fällt mir auf Anhieb auch nicht ein

20.11.2008 - 10:25 Uhr

wie ich den String in das enum parse weiß ich doch...
ich hab nur keine Idee wie ich jetzt den variant-Datentyp in die System Type Instanz kriege

20.11.2008 - 10:08 Uhr

VT_I4 ist ja ein Variant Datentyp. Genutzt in COM Unterhaltungen.
Ich habe eine Konfigurationsdatei in der angegeben wird welcher Varianttyp letzten Endes von einem IO-Objekt dargestellt werden soll. In der Konfigurationsdatei stehen die Bezeichnungen für Variant-Typen. Um nun die Systemtypen (VT_I4 entspricht an der Stelle Int32) in den Varianttyp casten zu können wollte ich erstmal den Typ aus der Konfigurationsdatei(als string angegeben) in den VarEnum parsen und dann das Ergebnis(hier als VT_I4 vereinfacht) als Type-Instanz in das IO-Objekt für den Output abspeichern.

20.11.2008 - 09:57 Uhr

Da bekomm ich aber doch VarEnum und nicht VT_I4 oder?

20.11.2008 - 09:47 Uhr

Hallo,
ich hab grad irgendwie 'ne Denkblockade. Könnt ihr mir nit ner Idee aushelfen?


IteropServices.VarEnum x = VarEnum.VT_I4;
System.Type t = //??? irgendwie soll hier jetzt x zugewiesen werden also VT_I4

15.05.2008 - 12:34 Uhr

schon mit


int n = 0; //n wäre hier der Index der ersten Kategorie
HolidayCategory cat = categories[n];//Zugriff auf Listenwert wäre dann z.Bsp. so möglich

versucht?

21.04.2008 - 16:59 Uhr

Danke für die raschen Antworten

21.04.2008 - 16:20 Uhr

wie sieht die Geschichte aus wenn ein expliziter cast herhalten soll. gehts dann?


int i = (int)bla;

21.04.2008 - 15:57 Uhr

Hallo,
was kann jetzt im MyStruct implementiert werden, um den intern-Wert standardmäßig auszugeben?


MyStruct bla = -2;
int i = bla;

Gruß Sprotti

31.01.2008 - 16:29 Uhr

ja, eben drum. ich nutze diesen stream in beide richtungen. daher wird er ja zum schreiben und beim lesen übergeben. ich brauche nur einen weg wie ich dem doc.load nun mitteilen kann, daß mein vorerst letztes XML-Tag übertragen ist ohne das der stream geschlossen wird.

30.01.2008 - 15:47 Uhr

Hallo,
Effekt: siebenköpfige Hydra X(
wenn ich Close() aufrufe wird der Stream mit geschlossen den ich noch zum hören auf weiteres brauche. Resultat: ich kann dann nicht mehr auf denselben Stream schreiben
Wie kann ich den Stream denn offen halten und den Reader trotzdem schließen?

29.01.2008 - 12:35 Uhr

Die Lösung des Problems... :evil:


        public void SendDataToStream(NetworkStream writeStream)
        {
            _writer = new XmlTextWriter(writeStream,null);

            myxmldoc.WriteTo(_writer);

            _writer.Flush();

            _writer.Close();
        }

Dann klappts auch mit'm Nachbarn. 👅
Reader wechselt dann in ReadState.EndOfFile und Load wird abgeschlossen.

Gruß Sprotti

29.01.2008 - 12:10 Uhr

der Reader steht im ReadState.Interactive
Eigentlich ist jetzt die Frage wie bekomme ich Ihn aus diesem Zustand wieder heraus.
Vielleicht noch dazu zu sagen:
Das übertragene XMLDokument sind auch mit der XMLDocument - Klasse zusammengestellte Daten


<?xml version="1.0"?><BOOKS ID="0"><PAGE ID="1" /></BOOKS>

Dieses Dokument schreibe ich mit dem entsprechenden TextWriter


        public void SendDataToStream(NetworkStream writeStream)
        {            
            _writer = new XmlTextWriter(writeStream,null);
            
            myxmldoc.WriteTo(_writer);
            
            _writer.Flush();
            
        }

29.01.2008 - 10:11 Uhr

Hallo,
ich empfange über einen SocketStream meine XMLDaten. diese kommen auch im XMLReader an. Jedenfalls kann ich den ersten Knoten mit reader.MoveToContent() finden.
Aber wenn ich mein XMLDocument mit der Load(reader) füllen möchte oder den reader.ReadOuterXML() ausführe bleibt der Thread in der Methode hängen.
Hat jemand eine Idee wie ich das beheben kann?


        public void GetDataFromStream(NetworkStream readStream)
        {
            
            XmlReaderSettings rdset = new XmlReaderSettings();
            rdset.ConformanceLevel = ConformanceLevel.Auto;
            _reader = XmlReader.Create(readStream, rdset);
            _reader.MoveToContent();
            string s = _reader.ReadOuterXml();
        }

Gruß Sprotti

17.01.2008 - 11:50 Uhr

mit verschiedenen ports ist es möglich einen socketserver und einen client in ein und derselben assembly zu betreiben.

27.07.2007 - 13:56 Uhr

das form wird einmal angezeigt bevor die änderungen im versteckten zustand gemacht werden sollen. Allerdings...
kann es sein, dass in Controls des Form enthaltene Komponenten auch ein Handle brauchen um Änderungen durchführen zu können?
Die werden nämlich in einem event handler einer im Form mit dock.fill abgelegten Komponente ausgeführt...

27.07.2007 - 12:52 Uhr

Hallo,
ich hab in meinem Main_Form-Konstruktor ein weiteres Form erzeugt (Lebenszeit wie Form_Main)
Ich möchte es nur sehen wenn ich es brauche, ansonsten verstecken(im Moment realisiert durch visible=false). Im versteckten Zustand aber auch aktualisieren.
Allerdings scheint das Handle für das Form beim verstecken flöten zu gehen. Mit BeginInvoke meckert mich das Programm jedenfalls an, es könnte nicht... blablabla weil kein Handle usw.
Wie verstecke ich das Form so, das ich das Handle drauf immernoch habe?
Gruß Sprotti

28.06.2007 - 10:25 Uhr

Hallo,
topMost war genau das was ich brauchte.
Vielen Dank für die wie gewohnt schnelle Hilfe

28.06.2007 - 09:37 Uhr

Hallo,
wie kann ich ein von Form abgeleitetes Fenster so anzeigen, das es immer zuoberst(z-layer) erscheint? Sozusagen always on top. Im Moment wird es grad von einem modalen Dialog verdeckt der von derselben Anwendung vorher geöffnet wurde.
Gruß Sprotti