vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 31.08.12 09:45

Naja, du musst den DLL Code selber ja nicht verstehen.
99% des Frameworks ist auch in C# geschrieben und z.b. WindowsForms Code würdest Du dann auch noch nicht verstehen, benutzt ihn aber.

Insofern ist doch das reine benutzen der DLL nicht schwieriger.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 23.08.12 15:52

Nehmen wir einmal an, ich möchte eine Anwendung programmieren, die u.a. Artikeldaten speichert und bearbeitet... Dann müssten die eingegebenen Artikeldaten ja auch irgendwie verifiziert werden. Daher dachte ich mir, es sei eine gute Idee eine eigene Klasse "Artikel" anzulegen und die übergebenen Werte mittels Propertys zu prüfen.

Herausgekommen ist dabei folgende Klasse (stark gekürzt):

Public Class cArtikel
    Private cArtNummer As Integer
    Private cArtGruppe As Integer
    ' Hier kämen dann noch weitere Daten hinzu 
 
    Public Property ArtNummer As Integer
        Get
            Return cArtNummer
        End Get
        Set(value As Integer)
            If value = 0 Or value > 999999 Then
                ' Fehlerhafter Wert
                MsgBox("Artikelnummer fehlerhaft. Gültige Werte 1 - 999999", _
                  MsgBoxStyle.Critical, "Fehler")
                cArtNummer = 0
            Else
                cArtNummer = value
            End If
        End Set
    End Property
 
End Class
Im Hauptprogramm hätte ich dann folgenden Code:

        Dim myArtikel As New cArtikel
        myArtikel.ArtNummer = 1234567 ' später natürlich kein fester Wert 
        ' sondern aus Eingabefeld
Das Ganze führt jetzt wie gewollt dazu, dass die in der Klasse definierte Fehlermeldung erscheint. Allerdings "merkt" das aufrufende Programm ja nichts davon, da es keine Rückmeldung gibt, dass im Set ein Problem bemerkt wurde.

Natürlich könnte ich anschließend prüfen, ob myArtikel.Artnummer = 0 ist, aber das erscheint mir irgendwie wenig elegant.
Die Prüfung aus der Klasse in die jeweilige Form zu verlagern allerdings auch nicht - zumal es dieses Prüfung später an diversen Stellen in diversen Forms geben wird.

Statt Propertys könnte man natürlich auch eine Function "checkArtNummer" die True oder False zurück gibt in die Klasse aufnehmen, aber deren Aufruf kann dann ja auch schon mal vergessen werden, wohingegen die Property auf jeden Fall ausgeführt wird und mir damit als der sicherere Weg erscheint.

Gibt es hier einen allgemeinen und eleganten Weg? Wie macht ihr als Profis das?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: keco
Datum: 23.08.12 17:25

Der allgemeine und elegante Weg liegt im Ausnahmemechanismus. Das heißt, dass du in der Property eine Ausnahme auslöst, wenn der Wert ungültig ist. Du solltest übrigens auch prüfen, ob der Wert kleiner 0 ist, da Integer auch negative Zahlen haben darf.

Wenn der Wert zu klein oder zu groß ist, dann löst du eine ArgumentOutOfRangeException aus. Die Aufgabe besteht dann darin im Hauptprogramm auf die ungültigen Werte vor der Zuweisung zu prüfen. Damit erzwingst du sozusagen, dass nur richtige und gültige Werte übergeben werden dürfen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 23.08.12 17:56

Hallo Keco,

vielen Dank für Deine Antwort.

"Damit erzwingst du sozusagen, dass nur richtige und gültige Werte übergeben werden dürfen."

Genau das war mein Ziel - das wollte ich mit der Property erreichen.

Wenn Du mir jetzt noch sagst, wie man eine solche Exeption auslöst bin ich glücklich
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: keco
Datum: 23.08.12 18:06

Dafür gibt es die Throw-Anweisung.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 23.08.12 19:28

Abermals Merci.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 23.08.12 20:16

Ich stolpere gerade über folgenden Absatz von dir: "Die Aufgabe besteht dann darin im Hauptprogramm auf die ungültigen Werte vor der Zuweisung zu prüfen."

Also das mit der Exeption habe ich verstanden. Das scheint mir wirklich der eleganteste Weg zu sein.

Aber die Prüfung auf ungültige Werte wollte ich ja gerade durch die Property erledigen, da sie sicherlich an dutzenden von Stellen des fertigen Programms vorkommen wird. Wenn ich vorher, z.B. per Function, prüfe, dürfte es ja nie mehr zu der Exeption kommen...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: keco
Datum: 23.08.12 20:32

Du kannst natürlich eine Methode schreiben, die die Daten validiert und entsprechend einen Boolean zurückgibt. Ob du das in der Klasse oder im Hauptprogramm erledigst steht dir im Grunde frei.

Dann müsstest du jedoch vor jeder Zuweisung zumindest diese Methode aufrufen und den Wert zuweisen, wenn die Daten richtig sind.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 23.08.12 21:00

Nein Exception ist nicht nur unelegant, es wiegt dich in trügerische Sicherheit.

Der richtige Weg wäre IDataErrorInfo UND INotifyPropertyChanged zu implementieren.
http://www.vbarchiv.net/forum/id22_i65200t65161_error-provider-laesst-sich-nicht-loeschen.html
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: keco
Datum: 23.08.12 21:31

Wieso sind die Ausnahmen unelegant und trügerisch?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 23.08.12 21:44

Hallo und erst einmal Danke FZelle,

mit IDataErrorInfo und INotifyPropertyChanged habe ich mich noch nicht befasst, aber das werde ich morgen nachholen. Vielen Dank für den Denkanstoss.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 23.08.12 23:16

Exceptions in Properties werden beim DataBinding häufig geschluckt.

Was machst du z.b. wenn die Daten durch einen ORMapper besetzt werden?
Willst du das der sofort aufhört, oder willst du dann über weitere Schalter das Auslösen der Exception verhindern.

Und o.g. Interfaces werden von vielen UI Elementen ( DGV z.b. ) von Haus aus unterstützt, auch unter WPF und Silverlight.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 23.08.12 23:17

Ist ja in dem Link von dem Link ein simples Beispiel das zeigt wie einfach das ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: keco
Datum: 23.08.12 23:32

Von DataBinding war keine Rede (oder ich habs überlesen). Ausnahmen für Properties sind auch im Framework (zumindest bei Controls) gängige Praxis. Aber hier gehts ja um eine Datenklasse - da hast du wohl recht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 24.08.12 07:54

Ja, habe ich gesehen und auch schon runter geladen. Gleich gehts mit frischem Kopf und ebensolchem Kaffee dran. Danke für die Hilfe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 30.08.12 17:13

Hallo FZelle,

leider konnte ich dein Beispiel nicht nachvollziehen, da es trotz Installation der notwendigen Controlls beim automatischen Konvertieren auf VB2010 zu Fehlern kommt, da sich die Version der Controls geändert hat.

Es wäre traumhaft, wenn Du Dein Beispiel noch einmal auf VB2010 (und mit Standard-Controls) anpassen könntest, denn ich würde das natürlich gerne verstehen, wie IDataErrorInfo und INotifyPropertyChanged arbeiten.

Zwischenzeitlich habe ich mir eine Alternative mit dem ErrorProvider erarbeitet und ich wüsste gerne was Du bzw. die anderen hier von dieser Varainte der Datenvalidierung halten.

In meiner Artikelklasse habe ich eine öffentliche Sub erstellt, der ich das aktuelle Control und den Errorprovider der aufrufenden Form übergebe...

    Public Shared Sub ValidateArtName(ByVal ArtName As String, ctrl As Control, _
      erp As ErrorProvider)
        If ArtName = "" Or ArtName.Length > 30 Then
            erp.SetError(ctrl, "Name fehlt oder ist zu lang")
        Else 
            erp.SetError(ctrl, "")
        End If
    End Sub
In meiner Hauptform habe ich folgenden Code:

    Private Sub tbxName2_TextChanged(sender As System.Object, e As _
      System.EventArgs) Handles tbxName2.TextChanged
        cArtikel.ValidateArtName(tbxName2.Text, Me.ActiveControl, _
        ErrorProvider1)
    End Sub
Vorteil der Sub in der Klasse ist aus meiner Sicht, dass ich diese Validierung von jeder Form und aus jedem Control heraus anspringen könnte. Sollte ich den Wert also später an sagen wir 5 verschiedenen Stellen eingeben können, könnte ich von jeder Stelle aus auf die Sub zugreifen und so immer mit demselben Code die Eingabe validieren. Doppelter Code wird vermieden, Die Validierung erfolgt immer gleich und der Errorprovider weist den Anwender auf den fehlerhaften Wert hin.

Oder freue ich mich völlig zu Unrecht und übersehe etwas grundlegendes?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 30.08.12 19:54

Anhang:  AnhangValidationDemo.ZIP (26k)  

Von shared Funktionen halte ich zur Validierung persönlich nichts.
Und es ist dann ja auch so das du das immer alles von Hand machen musst.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 30.08.12 20:50

Klasse, vielen Dank für das Muster-Projekt. So langsam formt sich das Bild wie das funktioniert.

Aber wie heißt es so schön bei in der Sesamstrasse: Wer nicht fragt....

Daher frage ich mich was genau die Validation.DLL macht. Die kommt ja scheinbar von einem Dritthersteller und wird für die Validationrules benötigt...

Ist die Open Source? Darf ich bzw. jemand anders die verwenden? Gibt es eine Dokumentation dazu?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: ModeratorFZelle (Moderator)
Datum: 30.08.12 21:13

Anhang:  AnhangValidation.ZIP (20k)  

Ist mal vor Jahren aus einer sehr frühen Version von CSLA heraus entstanden, ist aber in C#.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Property mit Rückgabewert möglich? 
Autor: Schudi
Datum: 30.08.12 21:41

Oh je...jetzt dachte ich, ich seh Licht am Ende des Tunnels, aber ich muss zugeben, dass ich bei dem Code aus der Validation.zip nur Bahnhof verstehe. Das ist noch 3 Nummern zu groß für mich.

Gibt es vielleicht auch eine "einfachere" Möglichkeit ohne die "Fremd-dll" die Prüfungen zu implementieren? Im Prinzip geht es ja immer nur um einfache Regeln, wie "darf nicht leer sein" "größer oder kleiner als" "email-adresse" "Telefonnummer" oder ähnliches.

Vielen Dank für Deine Hilfe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel