Laden...

(User)Control für Uhr erstellen

Erstellt von bluedragon vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.333 Views
B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren
(User)Control für Uhr erstellen

Hallo Leute,
irgendwie konnte ich keinen aussagekräftigen Titel finden [EDIT=herbivore]Titel geändert[/EDIT], was wahrscheinlich auch daran liegen kann, dass ich es nicht wirklich gut beschreiben kann. Naja egal 🙂

Es geht darum, dass ich für ein großes Projekt, dass ich mit einem Kumpel zusammen mache, gerade eine Klasse TimezoneClock erstelle. An diese Klasse kann man entweder nur Koordinatan (x,y) oder Koordianten und eine Zeitzone übergeben, sodass eine Digitale (per Methodenaufruf auch analog) Uhr generiert werden soll.
Nun die Berechnung der entsprechenden Zeitzonen habe ich bereits gelöst. Nun möcht ich, dass die Uhr an den Koordinaten angezeigt wird und weiß leider nicht genau wie ich es anstellen soll. Also mir ist klar, dass ich eine Methode dazu verwenden muss, aber mich würde interessieren ob es so etwas, wie Invalidate, für Klassen gibt, sodass intern dann die Methode (die ich dann überschreiben werde) OnPaint aufgerufen wird und sich die Klasse quasi selbst aktualisiert.
Ich habe schon häufiger gesehen, dass man einzelne Abschnitte oder Steuerelemente per Invalidate erneuern kann. Wüsste aber nicht ob das bei Klasse so möglich ist. Ich möchte es z.B. auch später ermöglichen, dass per Drag&Drop die Uhr verschiebbar wird (aber das kann warten) und da müsste ich die Uhr dann auch komplett neu zeichnen und die alte Stelle aktualisieren.

Ich weiß nicht genau wie ich mein Problem noch näher erläutern soll, aber ich hoffe es ist halbwegs verständlich gewesen, was ich vorhabe und wo ich nicht weiter komme.

MfG
bluedragon 🙂

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

1.346 Beiträge seit 2008
vor 15 Jahren

Zuerst musst du von der Klasse UserControl ableiten. Sie befindet sich in System.Windows.Forms

Darin kannst du dann die OnPaint Methode überschreiben

pdelvo:O

946 Beiträge seit 2008
vor 15 Jahren

Zuerst musst du von der Klasse UserControl ableiten. Oder Control. Wobei UserControl für eher für zusammengesetzte, Control eher für einzelne, neue Komponenten geeignet ist.

1.346 Beiträge seit 2008
vor 15 Jahren

Stimmt

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Danke erstmal für die Antworten, werde mich daran probieren, und was genau ist der unterschied zwichen UserControl und Control. Denn "einzelne" und "neue" (deine Argumente) treffen ja beide zu oder nicht ?

MfG
bluedragon

*EDIT* schon gut. Habe deinen Post falsch gelesen. Ich habe jetzt verstanden was du meinst 😃

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

946 Beiträge seit 2008
vor 15 Jahren

Meine Argumente waren wirklich nicht besonders gut erklärt. Ich würde dir Control raten, da UserControl dafür gedacht ist, mehrere andere Controls zu besitzen. Z.Bsp. eine TextBox mit einem Button und einem ErrorProvider . Control für ein einzelnes Steierelement, was eine Uhr eigentlich ist.

Siehe auch Eigene Outlook Sidebar - Control oder UserControl?

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Alles klar, jetzt war es verständlicher =)

So nun habe ich das hier in meiner Klasse (ist von Control abgeleitet):


//diff, zone, x,y sind verfügbar, weil sie für die oberste Ebene private deklariert sind
protected override void OnPaint(PaintEventArgs e)
{
    //base.OnPaint(e);
    dt = DateTime.Now + new TimeSpan((int)diff, (int)((diff % 1) * 60), 0);
    MessageBox.Show(dt.ToShortTimeString());
    
    e.Graphics.DrawString(zone.PadLeft((int)(e.ClipRectangle.Width/2), ' ') + ":\n" + dt.ToShortTimeString(), new Font(new FontFamily("Arial"),12 ), new SolidBrush(Color.Black) , x,y );
}

Und das hier in der Form um es zu testen:


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        TimezoneClock t = new TimezoneClock(50, 30);
        t.Invalidate();
    }
}

Aber er zeichnet den angegebenen String bei 50, 30 nicht.
Es kommt auch keine Fehlermeldung. Wenn ich jetzt testweise eine MessageBox in die OnPaint-Methode schreibe, kommt auch diese nicht. D.h. muss es irgendwie am Aufruf liegen.

MfG
bluedragon

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

1.346 Beiträge seit 2008
vor 15 Jahren

Hast du daran gedacht dem Control eine größe zu geben?

pdelvo

946 Beiträge seit 2008
vor 15 Jahren

Du musst dein Control erst deiner Form zuweisen

t.Parent = this;
// oder alternativ:
this.Controls.Add(t);
B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Danke hat wunderbar geklappt, hatte vergessen ne größe zu deklarieren und die Control hinzuzufügen =)

Jetzt hab ich noch eine Frage:
Und zwar wie würdet ihr es am besten realisieren, das die Uhr sich selbst neu zeichnet. Also klar OnPaint wird ja durch Sachen aufgerufen wie, wenn man jetzt die Form deselektiert und wieder selektiert oder wenn man die ausserhalb das Bildschirmrandes zieht. Dadurch aktualisiert sich die Uhrzeit ja, aber wie kann ich am besten die Uhr kontinuierlich aktualisierbar machen. Selbstverständlich habe ich bereits an Timer gedacht, aber ich mag Timer nicht so gerne und Threading in Kombination mit Thread.Sleep(), weiß ich nicht ob sich das dafür lohnt.
Wie würdet ihr das realisieren ?

MfG
bluedragon

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

946 Beiträge seit 2008
vor 15 Jahren

Selbstverständlich habe ich bereits an Timer gedacht, aber ich mag Timer nicht so gerne...

Warum? Ein Timer ist die beste Lösung. Er tickt zwar nur alle 15.5ms, aber für eine Uhr reicht das völlig aus, zumal es unter Windows ja eh nicht genauer geht.

...und Threading in Kombination mit Thread.Sleep(), weiß ich nicht ob sich das dafür lohnt.

Nein, das lohnt sich sicher nicht.

PS: Aber warum erstellst du eine Komponente, die es schon viel besser gibt?

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Ich weiß nicht warum ich Timer nicht so mag, irgendwie habe ich immer das Gefühl, dass da etwas im Hintergrund meine Ressourcen aufbraucht, aber wahrscheinlich bin ich nur paranoid 😁 Werds dann wohl so machen.

Und zu deiner Frage: Es ist einfach so, das es mir viel mehr Spass macht solche Dinge selber zu programmieren, zusätzlich möchte ich einige mehr Funktionen zur Verfügung stellen. Z.B. Alle 36 Zeitzonen stehen zur Verfügung (optional), die Anzeige(nur Uhrzeit oder Uhrzeit+Zeitzone), analoge oder digital Anzeige, zur Laufzeit per Drag&Drop die Uhr verschieben. Denn wenn ich auch so kleine Dinge selber mache und noch erweitere, dann habe ich nicht nur eine tolle Klasse die ich auch in anderen Projekten wiederverwenden kann, sondern dadurch erweitere ich auch mein Programmierkontingent. Leider bin ich noch nicht mal annähernd gut in C# und arbeite mich seit ich anfing damit, von Tutorial zu Tutorial und von Buch zu Buch. Ich programmiere zwar seit 6 Jahren in allen möglichen Sprachen (ca 14 an der Zahl, auch unter UNIX) aber mein Hauptaugenmerk sind PHP(und Co) und C#(seit ca 1 Jahr). Also auch so kleine Sachen selber zu programmieren ist nur förderlich um mein , ich sag mal, "Können" zu verbessern. Man könnte auch sagen, dass ich dadurch, nach und nach, erlerne eine gewisse Routine bei solchen "Problemen" zu erhalten und stehe später bei wirklichen Problemen nicht vor verschlossener Tür, weil es schon beim Start hapert. Ausserdem ist die Uhr nur ein kleiner Teil des Projektes das ich mit einem Freund programmiere, d.h. wissen wir beide woran wir sind und müssen uns später nicht um fehlende Funktionen ärgern, sondern brauchen schon vorhandenen Komponenten nur geringfügig zu erweitern.

MfG
bluedragon

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

5.299 Beiträge seit 2008
vor 15 Jahren

Es ist einfach so, das es mir viel mehr Spass macht solche Dinge selber zu programmieren

Ich tät sagen, in .Net zeichnet es einen Programmierer aus, die passenden vorgefertigten Klassen zu finden und korrekt einsetzen zu können.

Das ist tatsächlich ein anderer Programmierstil, aber nicht wirklich unkreativer.

Zur Uhr: mit OwnerDrawing sollte sich auch eine Uhr zusammenschustern lassen.

Bei meine Zeichnereien nehme ich immer nur Control als Zeichenfläche. Wenn Buttons und Pipapo hinzukommen sollten, dann wird mein Control mit aufs UserControl gepackt.

Der frühe Apfel fängt den Wurm.

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Tja das ist wieder mal reine Frage der Ansicht, ich sagte, dass ich nicht annähernd gut bin in C#. Ich verstehe grundsätzliche Semantik durch bisherige Sprachen, aber die Syntax ist noch mal ne andere. Und zeige mir bitte eine Klasse in .Net die meine gewünschten Funktionen bereitstellt.
Man kann jetzt noch etlich Stunden darüber philosophieren, ob es sinnvoller ist, ne eigene Uhr zu machen oder eine vorhandene zu nehmen, aber Tatsache ist einfach, das es ja hier um mein Projekt geht, dass ich selber machen will, wenn ich mir Sachen einfach downloade (wegen des Linkes), dann brauch ich erst gar nichts machen. Ich programmiere ja wegen des programmierens, nicht damit ich einfach schnell schnell schnell an mein Ziel komme !! Und wenn ich dann irgendwann an meinem Ziel angekommen bin, kann ich sagen, dass ich was geschafft habe und bei Bedarf kann man mit leichtigkeit Kleinigkeiten verändern und muss nicht, wenn es schon beinahe zuspät ist und man merkt, dass von .Net bereitgestellte Klassen nicht ausreichen, dann erst anfangen hier und da ne eigene Klasse zu erstellen, lediglich die eigene erweitern.
Wenn ich dann mit dem Studium anfange nächstes Jahr und danach eine Ausbildung zum Anwendungsprogrammierer mache, werde ich sicher oftmals, entgegen meiner eigenen Strebung, schon vorhanden Komponenten benutzten, aber nur weil es dann vom Arbeitgeber so verlangt wurde und nicht weil ich das so für richtig halte.
Aber wie gesagt: Ansichtssache !

MfG
bluedragon

PS: Man muss nicht darüber streiten, regelrecht alles selber zu machen, das wäre schwachsinn, dann bräuchte man .Net ja nicht. Aber solche Dinge wo es merklich lohnt, ansonsten gäbe es ja noch immer die tolle Vererbung.

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

946 Beiträge seit 2008
vor 15 Jahren

Ich programmiere ja wegen des programmierens, nicht damit ich einfach schnell schnell schnell an mein Ziel komme !! Und wenn ich dann irgendwann an meinem Ziel angekommen bin, kann ich sagen, dass ich was geschafft habe und bei Bedarf kann man mit leichtigkeit Kleinigkeiten verändern und muss nicht, wenn es schon beinahe zuspät ist und man merkt, dass von .Net bereitgestellte Klassen nicht ausreichen, dann erst anfangen hier und da ne eigene Klasse zu erstellen, lediglich die eigene erweitern.

Das sehe ich auch so, aber so für so etwas Elementares wie eine Uhr gibt es massenweise auch professionell und sicher ist unter anderem auch noch der Source dabei. Allerdings existiert da noch der Lerneffekt, der um einiges höher ist, wenn man es selber macht, anstatt vorhandene Komponenten zu nehmen (nicht nur vom .NET). Wenn man das dann geschafft hat, sind andere Implementationen noch interessant zu sehen, da diese meist einen anderen Ansatz (der vielleicht sogar besser ist) enthalten.