Michas Anfängerfragen...



  • Hallo Leute,

    ist das ok für Euch, wenn ich hier mal einen Thread eröffne, in dem ich meine Anfängerfragen gesammelt poste?

    So müll ich das Forum nicht so sehr zu.

    Also hier die Frage1:

    int x = 10;
    int y = 10;
    btn_ok.Location.X = x;
    btn_ok.Location.Y = y;

    bei diesem Code möchte ich einem Button eine Position zuweisen, was aber mit einem Fehler quittiert wird:

    "Der Rückgabewert "System.Windows.Forms.Control.Location" kann nicht geändert werden, da er keine Variable ist."

    Wie also kann ich dem Button eine Position innerhalb des Forms zuweisen?
    Wenn ich tippe

    btn_ok.Location.

    dann geht wegen "IntelliSense" ein Fenster auf und ich kann X oder Y wählen. Es geht auch eine kleine Erklärung auf in der es heisst: Liesst die X-Koordinate aus oder LEGT SIE FEST!
    Warum also kann ich sie nicht festlegen?

    EDIT1:
    Wenn ich im Code vom Form1.Designer.cs mal gucke, dann finde ich:

    this.btn_ok.Location = new System.Drawing.Point(-1, -1);

    Diesen Code verstehe ich überhaupt nicht!
    Muß man das so kompliziert machen?
    Was bedeutet das "new"?

    EDIT2:

    Point pt = new Point();
    int x = 10;
    int y = 10;
    pt.X = x;
    pt.Y = y;
    btn_ok.Location = pt;

    So scheint es jetzt zu funktionieren! Man ist das umständlich! Geht das nicht einfacher?

    Frage2:

    Random rand = new Random();
    int r = (byte) rand.Next();
    double rr = r / 256;

    r enthält immer schöne Zufallszahlen zwischen 0 und 255!

    Aber nun müßte doch die Division r / 256 Fließkommazahlen zwischen 0 und 0,9999999 liefern.
    Beispiel:
    0 / 256 = 0
    128 / 256 = 0,5
    255 / 256 = 0,996...
    Es kommt aber immer nur 0 heraus! Wer weiss, was hier falsch ist?

    Frage 3:
    bin ein blutiger Anfänger in Puncto OOP. Habe bisher viel mit Pascal oder
    Basic gemacht.

    Herzstück der OOP sind ja die Klassen.
    Wie löse ich nun folgendes Problem mit der OOP in C#:

    (Prinzip-Code ähnlich Basic)

    Function Flächeninhalt (a, b as real);

    Flächeninhalt = a*b;

    Ende Funktion

    'Beginn Hauptprogramm

    DIM Länge, Breite As real;

    Länge = 10
    Breite = 25

    Print Flächeninhalt (Länge, Breite);

    Ende Hauptprogramm



  • Schiff ahoeu,

    Micha369 schrieb:

    Wenn ich im Code vom Form1.Designer.cs mal gucke, dann finde ich:

    this.btn_ok.Location = new System.Drawing.Point(-1, -1);

    Diesen Code verstehe ich überhaupt nicht!
    Muß man das so kompliziert machen?
    Was bedeutet das "new"?

    Also zu new müsstest du in der C#.Net Dokumentation was finden. Vom Prinzip wird da Speicherplatz für die Klasse da reserviert.

    Micha369 schrieb:

    EDIT2:

    Point pt = new Point();
    int x = 10;
    int y = 10;
    pt.X = x;
    pt.Y = y;
    btn_ok.Location = pt;

    So scheint es jetzt zu funktionieren! Man ist das umständlich! Geht das nicht einfacher?

    Klar geht das einfacher. Lookie Lookie....

    int x = 10;
    int y = 10;
    btn_ok.Location = new Point( x, y );
    

    Oder noch einfacher...

    btn_ok.Location = new Point( 10, 10 );
    

    Micha369 schrieb:

    Frage2:

    Random rand = new Random();
    int r = (byte) rand.Next();
    double rr = r / 256;

    r enthält immer schöne Zufallszahlen zwischen 0 und 255!

    Aber nun müßte doch die Division r / 256 Fließkommazahlen zwischen 0 und 0,9999999 liefern.
    Beispiel:
    0 / 256 = 0
    128 / 256 = 0,5
    255 / 256 = 0,996...
    Es kommt aber immer nur 0 heraus! Wer weiss, was hier falsch ist?

    Sieht zwar scheiße aus aber so müsste das Funzen. Du hast den Fehler gemacht das du eine Ganzzahlen Division durchführst und das Ergebnis in einen Double konvertiert. Auf sowas aufpassen.

    double rr = (double)r / (double)256;
    


  • Micha369 schrieb:

    Frage2:

    Random rand = new Random();
    int r = (byte) rand.Next();
    double rr = r / 256;

    r enthält immer schöne Zufallszahlen zwischen 0 und 255!

    Aber nun müßte doch die Division r / 256 Fließkommazahlen zwischen 0 und 0,9999999 liefern.
    Beispiel:
    0 / 256 = 0
    128 / 256 = 0,5
    255 / 256 = 0,996...
    Es kommt aber immer nur 0 heraus! Wer weiss, was hier falsch ist?

    Versuch es mal mit
    double rr = r / 256**.0**;
    Sonst dividierst du nämlich einen Int durch Int und das gibt wieder Int (Nachkommastellen werden einfach abgeschnitten). Erst im Anschluss daran wird der int dann zu double konvertiert.

    Grüße

    EDIT: Verdammt, zu langsam 🙂 Oder halt so wie mein Vorredner 🙂



  • Micha369 schrieb:

    Frage 3:

    public class Rechteck
    {
        private int Laenge;
        private int Breite;
    
        // Konstruktor
        public Rechteck( int Laenge, int Breite )
        {
            // Mit This spricht man die Membervariablen der Klasse an.
            // Nötig da hier die Übergebenen Variablen die
            // Membervariablen überladen.
            this.Laenge = Laenge;
            this.Breite = Breite;
        }
    
        public int Flaecheninhalt()
        {
            return (Laenge * Breite);
        }
    }
    

    Wolla Fertig ist die Klasse. Das diese natürlich noch net fertig ist, sieht man ja sofort. 😃



  • Hallo de_Bert,

    Danke für Deine Hilfe!
    Und vor allem für diese schöne Musterklasse "Rechteck"!

    Aber sag bitte mal, wie hast Du das schöne Listing da so hineinbekommen?

    Gruß,

    Micha



  • Wenn du den Nachtrichtentext ein gibst dann gibt es darunter so einen "C#" Button... und dann kommt das:P



  • Hallo Ihr,

    Wärt Ihr mal so nett und lasst den u.a. Code bei Euch laufen?
    Der Button läuft so ein paar Sekunden in dem Formular bis das Progrämmchen dann einfriert, sprich, Keine Rückmeldung mehr.
    Warum das denn?
    Derart Spielerchen habe ich schon auf jeden Computer gemacht und immer hat es funktioniert. Was ist denn hier mit C# falsch an dem Code?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace Viele_Tests
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            int x=10;
            int y=10;
            int dx=1;
            int dy=1;
            Point pt = new Point();
            private void btn_ok_MouseHover(object sender, EventArgs e)
            {
                while (true)
                {
                    if ((x > -1) & (x < ClientSize.Width - btn_ok.Size.Width))
                    {
                        x = x + dx;
                    }
                    else
                    {
                        dx = -dx;
                        x = x + dx;
                    }
    
                    if ((y > -1) & (y < ClientSize.Height - btn_ok.Size.Height))
                    {
                        y = y + dy;
                    }
                    else
                    {
                        dy = -dy;
                        y = y + dy;
                    }
                    pt.X = x;
                    pt.Y = y;
                    btn_ok.Location = pt;
                    //Thread.Sleep(1);
                }   // End While
            }
    
        }
    }
    

    Vielen Dank im Voraus!

    Gruß,

    Michael



  • Vielleicht wegen der Endlosschleife mit while(true)?



  • Schau mal nach ob du es mit Timer geregelt bekommst. Mir ist noch net so ganz ersichtlich was du vor hast^^



  • Hallo Talla,

    Talla schrieb:

    Vielleicht wegen der Endlosschleife mit while(true)?

    Die Endlosschleife ist erwünscht!

    @ all:

    Ich möchte aus Trainingsgründen einen Button über das Formular gleiten lassen, der an der Grenzen des Formulars abprallt und weiter gleitet.

    Das ganze geht auch einige Sekunden, aber dann wird das ganze Formular weiss und dann kommt "Keine Rückmeldung".

    Was passiert da?

    Gruß,

    Micha



  • Also da gibt es einen sogenahnten GUI-Thread. Der ist dafür zuständig das wenn du auf einen Button klickt das dann die Befehler ausgeführt werden. Dieser Thread ist auch dafür zuständig das das Fenster und alle Controls neu gezeichnet werden. Wenn du nun diesen Thread in einer Entlosschleife laufen lässt macht er nur noch das was in der Entschlosschleife steht. Als wird das Fenster irgendwann weiß, weil er ja nur noch sich in deiner Entlosschleife befinden. Die Lösung dafür sind Timer. Du startes den Timer und veränderst mit jedem Event ein bissel die Position von dem Button. Und wola haste eine schöne Animation die den GUI-Thread nicht komplett dicht macht.

    PS: Und du kannst mir nicht erzählen das das auf anderen Rechnern ein anderes Verhalten an den Tag legt. Das der Sourcecode ein weißes Fenster erzeugt ist auf allen Platformen zu 100% gegeben!!!



  • @Micha369:

    Mir scheint es, dass du das prinzip der OOP überhaupt nicht verstanden hast.

    Als kleiner Tip:

    - Les erst mal in Büchern/Ebooks/im Inet, was OOP ist.
    - Les nen Anfängerbuch zu C# durch
    - Programmiere erst mal im Konsolenbereich

    Es ist nicht böse gemeint, doch wirst du dich so nurverrennen und irgendwann die Lust verlieren.

    @Topic:

    Die Endlosschleife ist erwünscht!

    wie de_Bert schon sagte ist eine Endlosschleife in der GUI absoluter Blödsinn.

    Um auf das new nochmal zurueckzukommen. Grob gesagt erzeugt das new ein Objekt einer Klasse. Sprich du legst einen Button ein, dann erzeugst du immer mit new einen Button. Ok es ist weng merkwürdig erklärt, aber wenn du dir das nochmal in nem Buch durchliest wirst du es verstehen.

    Mal nen kleines Beispiel zu new:

    class probe
    {
       public int i;
    }
    
    class main_klasse
    {
       // Hier möchtest du nun ein Objekt der Klasse probe anlegen
       probe objekt_probe = new probe();
    }
    


  • Lyrix schrieb:

    - Les nen Anfängerbuch zu C# durch

    Kannst da nen gutes empfehlen?? ich bin auch noch auf der suche!!



  • Auf der Microsoft Seite gibt es z.B. Video Tutorials die ganz brauchbar sind. Würde ich aber auch erst empfehlen wenn man schon ein bissel in der Materie drin ist. Ansonsten weiß Mister google immer was 😛



  • de_Bert schrieb:

    Ansonsten weiß Mister google immer was 😛

    Da weiß man aber nie, ob es gut ist!! Ich dachte es könnte jemand seine erfahrung hier einbringen!!sonst kauf ich mir nen übelst teures Buch und kann damit nichts anfangen weil ich nix check!! oder zumindest so ähnlich!!

    //edit: Aber nichts für ungut, ich möchte nicht diesen Thread verfremden!!



  • freggel schrieb:

    Lyrix schrieb:

    - Les nen Anfängerbuch zu C# durch

    Kannst da nen gutes empfehlen?? ich bin auch noch auf der suche!!

    Ich weiss nicht wie das "Jetzt lerne ich C#" - Buch ist. Aber wenn man wirklich kaum Erfahrung im programmierern hat ist das sicherlich gut.

    ich hab das "C# kompendium" von markt und Technik gelesen. und muss sagen dass das Buch echt gut ist. Man muss zwar bei dem ein oder anderen Kapitel um weitere Informationen suchen, da es manches ziemlich mager erklärt, aber das bringt auch wiederum Positives mit sich.

    Was ich noch empfehlen kann ist das tutorial von www.mycsharp.de !



  • Ic bin grad dieses eBook am durchlesen. Ist ziemlich umfangreich und von einem C#-Entwickler geschrieben.



  • Sagt mal Leute verstehe ich hier was net oder was??? 😕
    Wo liegt das Problem in Google nach einem Tutorial zu suchen und sich das mal anzulesen.

    Wenn ihr es checkt, arbeitet ihr das durch...
    Wenn net dann sucht ihr euch ein neues bis ihr fündig werdet.

    Also ein bissel selbstständigkeit wird man wohl noch verlangen können. Also ob ihr Angst hättet eure wertvolle Zeit mit irgendwelchen Tutorials zu verschwenden. man man man

    PS: Ist kein Angriff aber das muss man wirklich bei fast jedem Thread in diesem Forum sagen.



  • Hallo de_Bert,

    Danke erst mal für Deinen Tip!

    de_Bert schrieb:

    PS: Und du kannst mir nicht erzählen das das auf anderen Rechnern ein anderes Verhalten an den Tag legt. Das der Sourcecode ein weißes Fenster erzeugt ist auf allen Platformen zu 100% gegeben!!!

    Nein, nein, da haben wir uns falsch verstanden! Ich habe solche Spielereien noch nie unter Windowsprogrammierung gemacht!
    Da war alles noch MS-DOS! Oder sogar noch früher in Assembler auf dem C64 oder 80386SX (vor 16 Jahren oder so).

    Gruß,

    Micha



  • Versuch es mal mit.

    delegate void MoveButtonDelegate(Point location);
    private void MoveButton(Point pt)
    {
        if (button.InvokeRequired)
            button.Invoke(new MoveButtonDelegate(MoveButton), new object[] { pt });
        else
            button.Location = pt;
    }
    
    private void CalcButtonPosition()
    {
        while (true)
        {
            // Berechnung
            MoveButton(pt);
        }
    }
    
    private void button_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(CalcButtonPosition));
        thread.Start();
    }
    

    Der Code erhebt keinen Anspruch auf Vollständigkeit. Um Fehlerbehandlung und ein ordnetliches Beenden der App. musst Du Dich selbst noch kümmern.


Log in to reply