| |
VB.NET - Ein- und UmsteigerRe: Constant Expression is required | | | Autor: Manfred X | Datum: 09.07.11 09:09 |
| Hallo!
Überladungen von Routinen und optionale Parameter bei Routinen
sind meiner Ansicht nach zwei verschiedene Programmier-Techniken,
die sich nicht gegenseitig ersetzen. Optionale Parameter kann
man einfach auslassen (=Vorgabewert), wenn es mehrere solcher Parameter
gibt. Auch die IDE-Unterstützung ist anders.
MfG
Manfred
Beitrag wurde zuletzt am 09.07.11 um 09:12:25 editiert. | |
Constant Expression is required | | | Autor: Caddy | Datum: 08.07.11 12:49 |
| Ich habe folgende Methode geschrieben:
Public Sub ControlColor(ByVal c As Control, ByVal back As Color, Optional _
ByVal fore As Color = Color.Black)
c.BackColor = back
c.ForeColor = fore
End Sub Nun meckert er bei Oclor.Black mit folender Meldung
Constant Expression is required Was bedeutet das? Warum will er dort eine Konstante haben?
Gruss Caddy | |
Re: Constant Expression is required | | | Autor: Manfred X | Datum: 09.07.11 06:51 |
| Hallo!
''' <summary>Festlegung der Farben eines Controls</summary>
''' <param name="c">Das Control</param>
''' <param name="back">Hintergrundfarbe</param>
''' <param name="fore">optional Vordergrundfarbe (sonst: schwarz)</param>
Public Sub ControlColor(ByVal c As Control, ByVal back As Color, _
Optional ByVal fore As Color = Nothing)
c.BackColor = back
If fore = Nothing Then
c.ForeColor = Color.Black
Else
c.ForeColor = fore
End If
End Sub MfG
Manfred | |
Re: Constant Expression is required | | | Autor: Manfred X | Datum: 09.07.11 07:51 |
| Hallo!
Ineffizient?
Das Problem bei einer derartigen Nutzung von Structures
als optionale Parameter besteht darin, dass "Nothing" den
Standard-/Initial-Wert der Struktur repräsentiert.
Dieser Wert wird ggf. durch den internen "Default" überschrieben.
Gibt es einen anderen Weg, um Structures als optionale
Parameter zu nutzen?
MfG
Manfred
Beitrag wurde zuletzt am 09.07.11 um 07:52:08 editiert. | |
Re: Constant Expression is required | | | Autor: RalfE (Moderator) | Datum: 09.07.11 09:40 |
| Klar sind es nicht die selben Techniken, aber die Wirkung ist sehr ähnlich, denn beide erlauben es mir, unterschiedliche viele Argumente zu übergeben. Bei optionalen Parameter sehe ich den Default-Wert (zumindest durch VS), bei Überladungen nicht. Dieser kann dokumentiert sein (entweder in den XML-Dokutags, die VS auch anzeigt, oder in einer separaten Dokumentation).
Auf der anderen Seite finde ich verschiedene Überladungen einfacher zu erfassen als eine Methode, die von 8 Parametern nur 3 benötigt, da der Rest Optional ist.
Um bei deinem Beispiel für Caddy zu bleiben: Bei zwei Überladungen könnte die einfache die komplexere aufrufen und letztere weißt einfach die Werte. Ich brauche dafür kein If, wie in deinem Beispiel, wodurch der Code etwas einfacher ist. Verzweigungen möchte ich für die Logik verwenden und nicht, um eine Sprachanforderung (hier konstanter Ausdruck für optionalen Parameter) zurecht zu biegen.
Richtig unübersichtlich wird es imho, wenn der Standardwert ein valides Argument ist - wie tut man dann entscheiden zwischen Standardwert und Wert für optionalen Parameter?
Ralf | |
Re: Constant Expression is required | | | Autor: Caddy | Datum: 09.07.11 11:40 |
| Ich wollte das mit den Optionalen Parametern nur mal ausprobieren und bin dann darauf gestossen.
Aber mit Überladung gäb ich bei meinem überdachten Problem nicht weiter..wenn ich z.B. mehrere Parameter des selben Typs über gebe:
z.B.
Public Sub test( )
Button.Left=0
Button.Top=0
Button.Width=0
Button.Height=0
End Sub
Public Sub test( ByVal x as Integer)
Button.Left=x
Button.Top=0
Button.Width=0
Button.Height=0
End Sub
Public Sub test( ByVal x as Integer,ByVal y as Integer)
Button.Left=x
Button.Top=y
Button.Width=0
Button.Height=0
End Sub
Public Sub test( ByVal x as Integer, ByVal y as Integer, ByVal w as Integer)
Button.Left=x
Button.Top=y
Button.Width=w
Button.Height=0
End Sub
Public Sub test( ByVal x as Integer, ByVal y as Integer, ByVal w as Integer, _
ByVal h as Integer)
Button.Left=x
Button.Top=y
Button.Width=w
Button.Height=h
End Sub Was mach ich in dem Fall ich habe z.B. nur 200 und 400. Dann geht er in dei 3. Sub rein und füllt sie mir mit falschen Werten, wenn 200 für x stehen soll und 400 für w.
Denn bei einer weiteren Überladung wie:
Public Sub test( ByVal x as Integer,ByVal w as Integer)
End Sub würde er doch meckern. Abgesehen davon wüßte er nicht welche er jetzt nehmen soll.
Gruss Caddy | |
Re: Constant Expression is required | | | Autor: Manfred X | Datum: 09.07.11 12:00 |
|
Public Sub SetValues(ByVal ctl As Control, _
Optional ByVal pTop As Integer = 0,
Optional ByVal pLeft As Integer = 0, _
Optional ByVal pWidth As Integer = 100, _
Optional ByVal pHeight As Integer = 100)
Try
With ctl
.Top = pTop : .Left = pLeft
.Width = pWidth : .Height = pHeight
End With
Catch
'nicht nachmachen
End Try
End Sub | |
Re: Constant Expression is required | | | Autor: Caddy | Datum: 09.07.11 12:17 |
| Hi Manfred,
Danke so habe ich es ja auch gelöst, aber ihr habt euch ja drum gestritten, dass man Optional nicht nutzen sollte....Darum ging es mir
Gruss Caddy | |
Re: Constant Expression is required | | | Autor: FZelle (Moderator) | Datum: 09.07.11 12:38 |
| Da hast du aber grundsätzlich etwas nicht verstanden.
Warum solltest Du so eine weitere Funktion schreiben wollen?
Auch wäre die Implementation so viel zu fehleranfällig.
Public Sub test( )
test(0,0,0,0)
End Sub
Public Sub test( ByVal x as Integer)
test(x,0,0,0)
End Sub
Public Sub test( ByVal x as Integer,ByVal y as Integer)
test(x,y,0,0)
End Sub
Public Sub test( ByVal x as Integer, ByVal y as Integer, ByVal w as Integer)
test(x,y,w,0)
End Sub
Public Sub test( ByVal x as Integer, ByVal y as Integer, ByVal w as Integer, _
ByVal h as Integer)
Button.Left=x
Button.Top=y
Button.Width=w
Button.Height=h
End Sub | |
Re: Constant Expression is required | | | Autor: Maas | Datum: 09.07.11 16:08 |
| Mit C# 4.0 wurde ja auch dort der Optional Parameter eingeführt und C# ist ja nun im Gegensatz zu VB nicht dafür bekannt den Fokus auf Programmierfreundlichkeit/-faulheit zu setzen. Fragt sich halt nur, für welchen Anwendungszweck das dann gedacht war, aber irgendeinen Sinn wird es wohl schon machen (oder?).
Maas | |
Re: Constant Expression is required | | | Autor: Maas | Datum: 09.07.11 17:50 |
| Wie? Wer? Was? RalfE?
Maas | |
Re: Constant Expression is required | | | Autor: Maas | Datum: 09.07.11 18:01 |
| War schon richtig, aber ich hab einfach nicht erwartet, dass RalfE's Meinung noch eine Bestätigung braucht. ^^ Aber doppelt hält ja bekanntlich besser.
Maas | |
Re: Constant Expression is required | | | Autor: Caddy | Datum: 10.07.11 06:49 |
| Naja meine Frage ist ausgiebig beantwortet..ich nutze, dass wir man "sinnvollsten" für meine Zwecke erscheint ob mehrfach Deklarationen, oder Optionale Parameter...Ich bin grade in einer ExperimentierPhase da man mir sagte, ich sollte mich mal in die Materie Vb.net einlesen. Ob das was ich tue schlechter Stil ist, ist erstmal zweitrangig..Es erfüllt für mich erstmal meine Zweck und ob die eine oder andere Methode später besser ist, für meine Zwecke, kann ich dann ja wohl selbst entscheiden:-D
Aber diskutiert ihr ruhig weiter über den Stil einer Rangehensdweise...Vielleicht kann ich da das eine oder andere noch lernen aus eurer Argumentation...
Danke aber an die Beantwortung meiner eigentlichen Frage.. s.o.
Gruss Caddy | |
Re: Constant Expression is required | | | Autor: FZelle (Moderator) | Datum: 10.07.11 11:32 |
| Du solltest dich nicht in VB.NET und seine (un)möglichkeiten einarbeiten, sondern Grundlagen von OOP und .NET erarbeiten, das ist viel Sinnvoller als zu versuchen etwas irgendwie machen zu wollen und zu schauen ob man das dann auch genauso irgendwie mit VB.NET umsetzen kann. | |
Re: Constant Expression is required | | | Autor: DotNetErbse | Datum: 12.07.11 11:36 |
| he, Caddy,
Du kannst Dir auch eine Klasse schreiben, die alle für Controls relevanten Werte übernimmt, der Du dann Dein(e) Control(s) übergeben kannst und die Dir dann die Werte ins Control schreibt.
Somit kannst Du mehrere Controls mit einmal "designen"
Mit freundlichen Gr??en
DotNetErbse
[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)] | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|