"New" bei Positionsänderungen zur Laufzeit?

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von mixing_guy.

    "New" bei Positionsänderungen zur Laufzeit?

    Hallo :)

    als (Noch)-VBA-ler brauch ich mal ein bissel Unterricht, zum besseren Verständnis von VB:

    Ich bin grade dabei ein bissel mit ersten Schritten zu experimentieren, und musste dabei feststellen, dass man, um ein Steuerelement neu zu positionieren, den Befehl "New" verwenden muss. Also z.B. "lblTest.Location = New Point(100, 200)".
    aber wozu ist das nötig? "New" erzeugt doch meines Wissens normalerweise eine neue Instanz einer Klasse, die Eigenschaften "Location.X" bzw. "Location.Y" existieren aber doch schon als Eigenschaften der Klasse "lblTest".
    Bedeutet das, dass die alte Instanz der Position dann noch im Speicher ist, und wenn ja, wie kann ich die wieder aufrufen? Oder wozu ist das sonst gut?

    Liebe Grüße

    SG
    Es ist quasy du Kurzbeschreibung von

    Dim test As New Point(100, 200)
    Button1.Location = test
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Sach ich doch
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Der alte ist weg!

    edit1:
    durch das = wird die alte Location überschrieben.
    Die Location ist ja ein Punkt x,y dieser wird von dem neuen Punkt 100,200 überschrieben

    edit2:
    Quasi genau so wie
    Text1.text = "Testtext"
    da bleibt der alte Text ja auch nicht irgendwo im Speicher
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    In .Net regelt solche Dinge der Garbage-Collector. Dieser prüft immer wieder mal ob es Objekte im Speicher gibt welche keinen Zeiger mehr besitzen.
    Der Zeiger wird in diesem Fall ja gelöscht, da ein neuer der Property Location zugewiesen wird.

    Somit wird beim nächsten Durchlauf des GC die alte Instanz gelöscht.

    lg

    EDIT:

    Schamash schrieb:

    durch das = wird die alte Location überschrieben.

    Nein wird sie nicht. Die "alte" Location liegt im Speicher ohne Zeiger und wird erst beim nächsten GC Durchlauf gelöscht. Somit gibt es kurzzeitig 2 Point-Instanzen.
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    damit würdest du aber nur die das X der Location ändern mit new poin(x,y) änderst du beides
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Du hast hier halt den Sonderfall vorliegen, dass Point keine Klasse, sondern eine Struktur ist. Du kannst dir eine Struktur einfach als Gruppierung von Werten vorstellen, eine Struktur kann keine wirklichen Instanzen besitzen. New sagt in diesem Fall also einfach, lege zwei Integer-Werte hintereinander im Speicher ab und interpretiere sie als X- und Y-Koordinaten eines Punktes.
    Es ist in .Net halt etwas komplizierter, was liegt im Heap, was auf dem Stack, was ist ein Zeiger, was nicht, was ist eine Instanz, was nicht, was hat eine Identität, was nicht usw. Wenn ich da jetzt näher drauf eingehen würde, müsste ich ne Din A4 Seite füllen.
    @fichz:
    danke für den Link und die Erklärung. Jetzt wird mir das schon klarer :)

    @sonne
    hm, in VBA ist das alles ein bissel anders. ich dachte, als ich den Code heute entdeckt habe, es geht da generell um Positionsveränderungen bei Steuerelementen. Was sind das denn für Fälle, in denen ich einen Punkt brauche; und wann brauche ich keinen, und es reicht eine simple Eigenschaftsveränderung?

    @Artentus
    ja das stimmt, es ist um einiges komplizierter. Deswegen frag ich ja. Danke auf alle Fälle für die Antwort :)
    Oder etwas anders erklärt:

    Wenn du lblTest.Location.X = 100 schreiben könntest, dann würdest du in der Tat nur den X-Wert des Location-Objekts ändern. Das Location-Objekt kriegt also mit: 'aha, mein X-Wert ändert sich'. Das Dumme daran ist nur, dass wir eigentlich wollen, dass das Label diese Änderung erfährt. Tut es aber nicht. Und darum passiert das, was unter dem Link, den fichz gepostet hat, beschrieben wird.

    Mit lblTest.Location = irgendwas (wobei irgendwas ein neuer Point oder auch ein bereits irgendwo erzeugter und/oder geänderter Point sein kann) änderst du aber eine Eigenschaft des Labels, und damit kann das Label auf die Änderung reagieren und seinen Container veranlassen, es zu invalidieren, damit es an der neuen Position neu gezeichnet werden kann. So in etwa zumindest...

    Im Übrigen is Point keine Klasse, sondern "nur" eine Struktur. (...ah ja, Artentus geht bereits näher auf diesen Umstand ein)
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Danke Arby,

    jetzt hab ichs, denk ich, verstanden. Location ist ein eigenes Objekt. Bissel ungewohnt das Ganze noch. In VBA ist zwischen dem Label und der X-Position kein Objekt, das gesondert behandelt werden müsste. Da kann man direkt auf die entsprechende Eigenschaft zugreifen.

    Liebe Grüße

    Genauere Erklärung

    Hääh?!?

    Klar kannst du einen X Wert setzen!

    Nochmal:

    Die Eigenschaft Location hat 2 (Unter-) Eigenschaften, welche X und Y lauten.

    Um nun die Lage eines Objektes zu ändern gibt es 2 Möglichkeiten:
    • Man setzt einzeln über die X und Y Eigenschaft der Location den neuen Lagepunkt

    Dazu verwendet man dann die Codezeilen:

    VB.NET-Quellcode

    1. MeinSteuerelement.Location.X = 10
    2. MeinSteuerelement.Location.Y = 25


    Oder:
    • Man greift direkt auf die Location Eigenschaft zu - ohne die Untereigenschaften X und Y anzusprechen. Hierzu benötigt man dann aber als Zuweisungswert ein Objekt mit der Klasse Point, welches direkt beide Werte (X und Y) in sich "vereint"
    Selbes Beispiel:

    VB.NET-Quellcode

    1. Private ptNeuerPunkt As Point = New Point(10, 25)
    2. MeinSteuerelement.Location = ptNeuerPunkt


    Das New() ist ja der Konstruktor für eine neue "Klasse" und kennt bei der Klasse Point 2 Möglichkeiten:
    1. Es werden keine Werte übergeben (Dann wird für X und Y jeweils der Wert 0 verwendet)
    2. Oder es werden 2 Werte übergeben (Dann werden für X und Y die übergebenen Werte zugewiesen, wobei der 1. Wert X und der 2. Wert Y darstellt)
    Jetzt sollte klar werden, was der Konstruktor New in Verbindung mit der Klasse Point macht:

    Der Point bekommt X und Y Wert angegeben und kann dann direkt der Location zugewiesen werden. Die Location bekommt dabei X und Y Wert geliefert, statt dass die Location einzeln X und Y geliefert bekommt.

    Jetzt klar?!

    Das selbe gilt übrigens auch für die Eigenschaft Size eines Steuerelements.

    Diese vereint die (Unter-) Eigenschaften Width und Height in sich - auch wieder 2 Integer Werte.

    Wieder 2 Möglichkeiten die Größe zu ändern:
    1. "Direkt" per MeinSteuerelement.Size.Width und MeinSteuerelement.Size.Height
    2. Oder über ein Objekt der Klasse Size, welches die neue Breite und Höhe als Konstruktor-Übergabeparameter bekommt - und das dann der Eigenschaft Size statt den Untereigenschaften Width und Height übergeben wird!
    Jetzt musses klar sein!

    LG

    tamazu


    *Das Topic war über ein Jahr alt und bereits erledigt! Thread hiermit geschlossen.*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()