Laden...
A
Animal21
myCSharp.de - Member
48
Themen
144
Beiträge
Letzte Aktivität
vor 11 Jahren
Dabei seit
04.09.2008
Erstellt vor 11 Jahren

Eine Klasse.

Ich hab mein Problem lösen können; war mein Fehler.

Zum ersten habe ich ein "WorkingObj" und eine "ObjList" und den Fehler gemacht, dass das WorkingObj eine DeepCopy bekommt und dann erst die ObjList, wodurch das betreffende WorkingObj ein anderes war, als das ensprechende in der ObjList.
Ich muss zuerst die Liste mit DeepCopies füllen und dann ein Objekt daraus an das WorkingObj übergeben...

Zum zweiten habe ich nicht beachtet, dass in der Name-Property des Objekts erst das Event ausgelöst wird, und danach erst der neue Wert gesetzt wird (damit ich noch den alten Wert ins Event übergeben kann).

Dadurch konnte die Änderung in der Liste in Dialog A allerdings erst nach dem ausgelösten Event geändert werden. Habe das Debugging allerdings immer vorher abgebrochen, bzw. nicht weiterverfolgt, da ich einen Fehler gesehen habe...

Sorry für den Thread.

grüße

Erstellt vor 11 Jahren

Hallo herbivore,

Danke für die Antwort. Es geht nicht um die View.

Ich habe mir den Vorgang im Debug-Modus angeschaut:

Dialog A übergibt beim Doppelklick das Objekt mit einer Zuweisung (s.o.).
Nach der Änderung und dem Klick auf den OK-Button von Dialog B, wird z.b. der Name des Objektes geändert und Dialog A bemerkt dies, da es sich das entsprechende Event registriert hat. Und an dieser Stelle wird die ListView aktualisiert.

Aber in der "DeepCopy" in Dialog A, die ich vom Ausgangs-Form habe und die an das Dialog B übergeben wurde, welches das Objekt manipuliert hat, wurde nichts geändert.


1. Dialog_A.List[Obj1, Obj2, Obj3];
2. forall(Obj in Dialog A.List)
          Obj.NameChanged += NameOfObjChanged;
3. Dialog_B.Obj = Dialog_A.List[1];

4. Dialog_B.Obj.Name = "neuer Name";

5. Dialog_A.NameOfObjChanged(...){
     //Änderung des Namen registriert
     //ListView aktualisieren
}

6. Dialog_A.List[1].Name ?= "alter name";

Ich hoffe, damit ist das Problem etwas verständlicher geworden.

grüße

Erstellt vor 11 Jahren

Hallo Freunde,

entweder werde ich verrückt oder ich verstehe das Referenzmodell von C# nicht ganz.

Ich habe ein Programm indem Konfiguration-Daten über ein Dialog A bearbeitet werden können.
Die Daten werden als DeepCopy() an das Dialog A übergeben, damit ich beim "Abbrechen" der Bearbeitung keine Arbeit habe alles wieder umzubiegen. (Modell BusinessObjekt)

In dem Dialog A werden die Daten in einer Tabelle angezeigt, per Doppelklick kann man nun ein spezielles Objekt in einem weiteren Dialog B bearbeiten, dabei wird das Objekt mit


Dialog_B.Objekt = Dialog_B.List[X]

übergeben.

Weiterhin habe ich in Dialog A die Events der Objekte registriert, um auf Änderungen des Models in der View zu reagieren.

Ändert nun Dialog_B die Daten vom übergebenen Objekt, so wird der EventHandler korrekt ausgeführt, aber die Daten in der Liste von Dialog A wurden NICHT geändert.

Sollte ich das Objekt mit ref üdergeben (ist mir gerade eingefallen und werde ich gleich testen).
Wenn ja warum, ich dachte, es werden immer Referenzen bei ReferenzObjekten übergeben und keine Kopien.

Grüße
Mario

Erstellt vor 11 Jahren

Leider auch nicht, verschiedene Benennung führt zu den selben Fehlern.

Edit: ok hab meinen Fehler gefunden hatte eine endlod-scheife erzeugt -_-'

folgender Fehler taucht nun auf.

Kann mir einer die Hinweise erklären, die vom Compiler geworfen werden?

Fehlermeldung:
Fehler beim Deserialisieren von Parameter http://www.qpulse.com/QPulseWebServices/v1.2/:newOccurrence. Die InnerException-Nachricht war "Der Typ 'DataField2' mit dem Datenvertragsnamen 'Occurrence: http://www.qpulse.com/QPulseWebServices/v1.2/' wird nicht erwartet. Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie alle unbekannten Typen statisch der Liste der bekannten Typen hinzu, beispielsweise mithilfe des KnownTypeAttribute-Attributs oder indem Sie sie zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird.". Weitere Details finden Sie unter "InnerException".

Server stack trace:
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart (XmlDictionaryWriter writer, PartInfo part, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter (XmlDictionaryWriter writer, PartInfo part, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameters (XmlDictionaryWriter writer, PartInfo[] parts, Object[] parameters)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody (XmlDictionaryWriter writer, MessageVersion version, String action, MessageDescription messageDescription, Object returnValue, Object[] parameters, Boolean isRequest)
bei System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents (XmlDictionaryWriter writer, MessageVersion version, Object[] parameters, Object returnValue, Boolean isRequest)
bei System.ServiceModel.Dispatcher.OperationFormatter. OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BodyWriter.WriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.Message.OnWriteMessage (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.Message.WriteMessage (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage (Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota)
bei System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage (Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
bei System.ServiceModel.Channels.MessageEncoder.WriteMessage (Message message, Int32 maxMessageSize, BufferManager bufferManager)
bei System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage (Message message)
bei System.ServiceModel.Channels.HttpOutput.Send (TimeSpan timeout)
bei System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest (Message message, TimeSpan timeout)
bei System.ServiceModel.Channels.RequestChannel.Request (Message message, TimeSpan timeout)
bei System.ServiceModel.Dispatcher.RequestChannelBinder.Request (Message message, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime operation)
bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage message)

Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData& msgData, Int32 type)
bei QPulse_01.QPulseWebServices.Occurrence.IOccurrence.CreateNewOccurrence (CreateNewOccurrenceRequest request)
bei QPulse_01.QPulseWebServices.Occurrence.OccurrenceClient.CreateNewOccurrence (CreateNewOccurrenceRequest request) in .........\Reference.cs:Zeile 3363.
bei Programm.Main (String[] argv) in .........:Zeile 150.

++++++++++++++++++++++++++++++

InnerException:

Der Typ 'DataField2' mit dem Datenvertragsnamen 'Occurrence: ht****tp://www.qpulse.com/QPulseWebServices/v1.2/' wird nicht erwartet. Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie alle unbekannten Typen statisch der Liste der bekannten Typen hinzu, beispielsweise mithilfe des KnownTypeAttribute-Attributs oder indem Sie sie zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird.
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType (XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei WriteArrayOfDataFieldToXml (XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract )
bei System.Runtime.Serialization.CollectionDataContract.WriteXmlValue (XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei WriteOccurrenceToXml (XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )
bei System.Runtime.Serialization.ClassDataContract.WriteXmlValue (XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.DataContractSerializer.InternalWriteObject (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.XmlObjectSerializer.WriteObject (XmlDictionaryWriter writer, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart (XmlDictionaryWriter writer, PartInfo part, Object graph)

Erstellt vor 11 Jahren

OK, hab ich soweit verstanden und scheint auch soweit zu klappen, aber es hat sich noch ein weiteres Problem ergeben, evtl. könnt ihr mir da aber garnicht helfen.

Ich habe ein Objekt A, welches ein Array besagter Klasse DataField beinhaltet.
Wenn ich nun meine neue Liste mit der erweiterten Version DataField2 erstellt habe und an Object A hänge, funktioniert noch alles wunderbar.

Wenn ich im Debug-Modus mir nun die Liste ansehen, ist der "ForeignKey" mit einem roten Ausrufezeichen versehen mit der Beschreibung: "ForeignKey = Die Funktionsauswertung wurde abgebrochen." (An dieser Stelle steht normalerweise der zugewiesene Wert)

Weiterhin, bekomme ich, wenn ich das Objekt per Webservice übermittle eine StackOverflowException.

grüße
Ani

PS: Habe die Klasse wie folgt erweitert:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField2 : DataField{
    [DataMember]
    public string fk;
    Public string FK{ get; set; }
}

Wenn ich wie folgt erweitere, kann ich meine Version2 Liste nicht der Liste von Objekt A zuweisen (da ja keine Verbindung existiert)


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField2 : IExtensibleDataObject{
    [DataMember]
    public string fk;
    Public string FK{ get; set; }
 
    //Alle Properties und Attribute vom Original übernommen
}

Erstellt vor 11 Jahren

@Abt Danke für die Antwort.

Die Klasse DataField wird bereits von dem WebService implementiert und existiert (praktisch Version 1)

Nun möchte ich gern eine Version 2, indem ein ForeignKey (FK) Feld dazukommt.

Dazu muss ich doch eigentlich nur folgendes schreiben:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
    [DataMember]
    public string fk;
    private ExtensionDataObject data;

    public ExtensionDataObject ExtensionData {
        get { return data; }
        set { data = value; }
    }
}

Aber beim erstellen eines DataField sehe ich nun nur das .fk field und die ExtensionData Property.
Eigentlich müsste ich doch aber alle Properties von Version 1 plus mein fk sehen, oder?

gruß
ani

Erstellt vor 11 Jahren

Hallo Leute,

ich nutze einen WebService, der bei uns auf dem Server im Keller läuft.
Eine Klasse DataField implementiert das IExtensibleDataObject:

    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="DataField", Namespace="NamespaceXYZ")]
    [System.SerializableAttribute()]
public partial class DataField : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {...}

Wenn ich das richtig verstanden habe, kann ich mittels des Interfaces nun die DataField-Klasse um eine gewünschte Property "ForeignKey" erweitern:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
    [DataMember)]
    public string FK { get; set; }

    public ExtensionDataObject ExtensionData { get; set; }
}

Aber vermutliche habe ich die nutzung des ganzen nicht richtig verstanden oder angewendet, wenn wenn ich nun ein DataField anlege, ist darin nur der ForeignKey und das ExtensionDataObject enthalten und nicht die restlichen Properties ebenfalls...

folgende Links habe ich genutzt:
Dynamic -VAR
IExtensibleDataObject-Schnittstelle

MfG
Ani

Erstellt vor 11 Jahren

OK, für den Render-Bereich ist mir nun klar, einfach das entsprechende Rechteck nur Zeichnen, den Rest ignorieren.

Für den Ladevorgang, bzw Update Vorgang heißt das was:

  • ich Lade die Ressource (also das Bild) erst, wenns es gezeichnet werden soll
  • oder ich lade trotzdem alle Mesh-Ressourcen schon, aber zeichne sie nur wenn ich sie brauche?
Erstellt vor 11 Jahren

Die Bewegung soll eigentlich frei sein.

Das mit den Layern klingt gut, wie realisiert sich das genau?

Ich hab aktuell mit den Objekten so gedacht:
Alle Objekte in einer Liste, welche bei jedem Render-Cycle durchgegangen wird und einen Draw für jedes Ojekt ausführt.

Layer würde ja heißen das ich entweder mehrere Listen habe, die einfach nur eine bestimmte Reihenfolge haben:
foreach(Mesh m in Background) m.Draw(...);
foreach(Mesh m in Objects) m.Draw(...);
foreach(Mesh m in Player) m.Draw(...);
foreach(Mesh m in Foreground) m.Draw(...);
foreach(Mesh m in Text) m.Draw(...);
foreach(Mesh m in UI) m.Draw(...);

oder die Objekte sind einfach in einer Liste entsprechend sortiert. Abe rich denke eine Trennung wäre da einfacher

Im Prinzip würde ich Tiles im Kachelmuster schon schön finden (oder gibt es noch eine bessere variante das umzusetzen?).
Ich dachte an soetwas wie: Player ist z.b. 30x30 Groß und ein Tile 5x5 (für Boden, Sand Wasser z.b.), um eine feinere Struktur zu bekommen.
Objekte etc. wären halt größer.
Dinge wie Wolken könnte man als pngs ja einfach "drüber schweben" lassen.

Womit ich glaube das grüßte Problem habe, ist die Karte nur teilweise zu laden. Also ich muss ja nur meinen aktuellen "Viewport" zeichnen und icht alles was es gibt.

Jedes Tile müsste dann ja trotzdem eine entsprechende Graphik laden...

Erstellt vor 11 Jahren

Hallo Freunde,

ich versuche mich aktuell an Game-Development mit GDI+, um mich etwas an das Thea heran zu tasten.
Es soll ein 2D-Old-School-Single-Player-Mini-RPG werden. ^^

Ich hab aktuell einen TickBasierten Game-Cycle und die Basis-Klassen für meine Game-Objekte. (Bitmap sprite, Point pos, Size size, ..., so etwas)

Nun soll es an die Weltkarte gehen und ich frage mich, ob ich eine Karte als Bitmap mache und die nach Bewegung des Helden einfach verschiebe, oder ob ich lieber ein Array mit Cells und Tile-Informationen machen soll.

Bei der Bitmap-Variante müsste ich natürlich noch Objecke, wie Berge, extra auf der Map plazieren. Bei der Array-Variante könnte ich diese direkt in die Tile-Information mit reinschreiben, bzw erkennen.

Was ist besser, schlechter oder lauf ich komplett in die falsche Richtung?

gruß
ani