Mitgliederverwaltung - Hilfe bei der Erstellung sauberen Codes

  • VB.NET
  • .NET 4.5

Es gibt 134 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Neu

    DerSmurf schrieb:

    Was bedeutet das hier? Eben doch nicht das "normale" ​Dim Settings as new frmSettings / Settings.showdialog
    Doch, genau das. Ein Form 1 erzeugt eine Instanz eines anderen Forms 2. Damit ist die Form-2-Instanz nur der Wert einer lokalen Variable von Form 1. Damit ist die Form-2-Instanz eine SubForm aus der Sicht von Form 1. So definiere ich es.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Ah OK. dann hab ichs doch richtig verstanden.
    Also habe ich doch drei Möglichkeiten:

    1. UserControls - wenig empfehlenswert, wenn ich hier je nur eine Instanz von verwende
    2. und 3. eigene Forms für das Zeug was ausgegliedert gehört. Diese dann 2.mit MDI innerhalb der Form anzuzeigen, oder 3. mit Form.Show als eigene Fenster anzeigen zu lassen.
    Also beschäftige ich mich doch mal mit MDI, denn das finde ich (zumindest hier) schöner als eigene Fensterchen

    Neu

    DerSmurf schrieb:

    Das große graue Feld kann ich aber nicht anklicken. Was ist das?

    Das ist der Tab-Reiter vom TabControl. Es sind keine TabPages vorhanden, also wird da nix angezeigt. Das TabControl ist aber mit "Top" gedockt, das leere Fensterchen verschwindet also zur Laufzeit. (ist auch logisch, weil .Visible = False für das TabControl)
    Der Menustrip deiner Childs wird auf der frmMain mit dessen MenuStrip zusammengemerged (kannste ja schnell mal ausprobieren, wie das aussieht)

    DerSmurf schrieb:

    Und ich musste, bevor dein Projekt lauffähig ist, aus der Resx Datei dei RessourcenBilder entfernen, weil diese nicht gefunden wurden.

    Jo, da hab ich einfach deine Images aus dem Ordner genommen und im Projekt eingebunden, damit ich die über My.Resources.... griffbereit hab. Dann brauchste die net überall manuell im Designer einfügen.

    DerSmurf schrieb:

    schöner als eigene Fensterchen

    das sehe ich genauso. In deinem Anwendungsfall sehe ich das sogar noch eher so, weil du ja mit Stifteingabe (Touch) arbeiten willst. Da solltest du Dialoge / Popups nur nutzen, wo auch sinnvoll.

    Wenn du Fragen zum Mdi hast, meld' dich. Ich würde dir aber empfehlen, dir das einfach mal genau anzugucken -sooo kompliziert is das nicht. Und deine Grafiken würd' ich dir raten in die Resources reinzupacken. Warum der die nicht mit übernommen hat,
    beim Zippen frag' ich mich grad selbst.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    Neu

    tragl schrieb:

    Jo, da hab ich einfach deine Images aus dem Ordner genommen und im Projekt eingebunden, damit ich die über My.Resources.... griffbereit hab

    Aber die sind in meinem Download nicht zugreifbar. Ich habe sie aus der Resx Datei entfernen müssen, damit die Solution kompiliert.

    tragl schrieb:

    (kannste ja schnell mal ausprobieren, wie das aussieht)

    Damit ist die Solution dann lauffähig - aber ohne dass sich im MenuStrip was tut. Das Ding bleibt leer.

    Neu

    DerSmurf schrieb:

    aber ohne dass sich im MenuStrip was tut. Das Ding bleibt leer.


    ... geht doch. ICh hab einfach ne neue Form angelegt und der ein Menustrip mit Standard-Einträgen verpasst.
    Die ist nun geöffnet über Mdi und dessen Menustrip vereint sich mit dem von frmMain (das MenuStrip von frmMain beinhaltet ja nur dein Häuschen als Grafik und dient als "Home-Button")



    EDIT: hier übrigens mal ohne die Tab-Buttons und die Control-Boxes:


    TabControl-Dock entfernen, den grauen Kasten auf den Menustrip schieben und rechtsklick -> in den Hintergrund
    Im Code vom Mdi folgendes hinzufügen / auskommentieren bzw. entfernen oder so übernehmen:

    VB.NET-Quellcode

    1. ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets, sowie verstecken des TreeView nach Öffnen der Form und App-Icon</summary>
    2. <Extension>
    3. Public Sub ShowMdiChild(Child As Form)
    4. RegisterMdiHandle() ' Registrierung der Handle-Methoden
    5. With Child
    6. If .MdiParent Is App._mdiParent Then
    7. .Select()
    8. Else
    9. With App._tabControl
    10. .SizeMode = TabSizeMode.Fixed
    11. .ItemSize = New Size(0, 1)
    12. End With
    13. App._mdiParent.SuspendLayout()
    14. Dts.Register(.Self, False) ' Optional nur mit den Helpers von ErfinderDesRades: Registriert das DataSet auf der Form
    15. ControlStyling.StyleControls(.Self)
    16. .WindowState = FormWindowState.Maximized ' Je nach Anwendungsfall entweder alle Childs maximiert öffnen, oder nur das 1.
    17. #If False Then
    18. If _mdiParent.MdiChildren.Count = 0 Then .WindowState = FormWindowState.Maximized
    19. #End If
    20. '.Icon = App.Icon
    21. .ShowIcon = False
    22. .ControlBox = False
    23. .MdiParent = App._mdiParent
    24. .MinimizeBox = False 'Minimize-Boxen auf Child-Forms finde ich unnötig
    25. .KeyPreview = True
    26. .Show()
    27. 'idiotischerweise muss der ChildForm-Menustrip, dessen Items einerseits automatisch in den Parent-Menustrip
    28. ' eingemerged werden, andererseits explizit versteckt werden - sonst verbleibt ein leerer Menustrip auffm ChildForm
    29. Child.Controls.OfType(Of MenuStrip)().SingleOrDefault()?.Hide()
    30. App._mdiParent.ResumeLayout()
    31. End If
    32. End With
    33. End Sub
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    Neu

    Bei meiner deiner Solution nicht.
    Hab ein paar Bilder angehängt.
    Bilder
    • Unbenannt.png

      107,42 kB, 1.920×1.080, 9 mal angesehen
    • Unbenannt1.png

      117,59 kB, 1.920×1.080, 8 mal angesehen
    • resX.png

      268,69 kB, 1.920×1.080, 9 mal angesehen
    • runtime.png

      174,45 kB, 1.920×1.080, 9 mal angesehen

    Neu

    DerSmurf schrieb:

    Bei meiner deiner Solution nicht.


    dann entfern in den Projekteigentschaften die Bilder und Symbole und zieh die aus deinem Explorer neu da rein.
    Einzige Änderung die ich machen musste: ich musste dein App-Icon auf 16x16 verkleinern, sonst sprengt das die Form komplett.
    Sonst biete ich dir das hier nochmal an, bevor das etliche Posts hin- und her geht:
    Wir können gerne ne telefon/skype/teamviewer oder was auch immer Sitzung machen (aber morgen erst) dann gucken wir grad dabei.
    Bilder
    • unbenannt.png

      33,11 kB, 2.454×343, 9 mal angesehen
    Dateien
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Neu

    Oh ja. Das klappt. Die Lösung war zu einfach :)
    Auch das verbergen der Tab Reiter klappt Mega!
    Ich werde mir morgen den Code dahinter zu Gemüte führen und versuchen das ganze in meiner Solution unterzubringen.
    Macht zwar nicht so den Sinn, aber sollte mir beim Codeverständnis helfen.
    Außerdem habe ich mir überlegt, die Startseite zu entfernen und die Verkaufsseite beim Start anzeigen.
    Die Buttons zum zeigen der anderen Forms (Einstellungen, Adressen, usw.) können ja ins MenüStrip wandern.

    Aber jetzt mag ich erstmal nicht mehr.
    Melde mich die Tage.

    Bishierhin erstmal vielen Dank :)

    Neu

    DerSmurf schrieb:

    Verkaufsseite beim Start anzeigen.

    jo, da brauchst ja nur den Aufruf im load-event der frmMain abzuändern. Das mdi-gedöns muss aber in ein Modul ausgelagert werden, weil du ggf. von den childs aus ein neues Child anzeigen lassen willst. Bei mir hab ich sowas nicht,
    weshalb ich den Kram auf meiner frmMain rumfliegen hab.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Neu

    DerSmurf schrieb:

    Das heißt du nutzt eigentlich immer mdi für einmalig vorkommende Dinge?
    Und @ErfinderDesRades nutzt scheinbar immer ucl?
    Ich weiß immer nicht, was ich tun soll, wenn zwei Menschen mir was unterschiedliches raten :)
    Tja, Pech - hier liegen numal zwei verschiedene Ansätze vor.
    Jo - EDR verwendet immer ucl. MDI und MDI-ChildForms hälter für konzeptionellen Murks.
    Tragl hat sich da Infrastruktur hinzugebastelt, der den Murks deaktiviert, sodass seine MDIChilds vom prinzip her agieren wie ucls.

    Der Kern der Technologien ist derselbe: Sowohl ein Form als auch ein Ucl ist eine geschlossene eigenständige Einheit, wo man Gui-Funktionalität höchst sinnvoll und anschaulich thematisch zusammenfassen kann, und so verschiedene "Themen" eben auch auseinanderhalten.
    Beides wird im Form-Designer designed, und zugehörige Logik im Codebehind entwickelt.
    Tatsächlich sind die Unterschiede marginal: Im DesignerCode steht bei Forms Inherits System.Windows.Forms.Form und bei Ucl steht Inherits System.Windows.Forms.UserControl.
    Dieser kleine Unterschied bewirkt die Verhaltens-Unterschiede:
    Ein Form kannste öffnen, schliessen, minimieren, maximieren, verschieben und resizen.
    Diese Dinge: öffnen, schliessen, minimieren, maximieren, verschieben, resizen - sind bei einem Ucl nicht gewollt. Ich will das Ucl auffm Tab haben, und zwar da, wo ichs hintu - soll mir keiner schliessen, resizen oder sonstwas.

    Was fürs Form gilt, gilt auch fürs MDI-ChildForm - nur statt auffm Bildschirm zu agieren, ist ein MdiChild im Mdi-Bereich des Mdi-ParentForms "gefangen".
    Tragls Infrastruktur deaktiviert nun alle die unerwünschten Form-Features, und zeigt die MdiChildren immer als Maximized an.
    Jo - kommt im Ergebnis fast dasselbe raus wie bei einem TabControl versteckten Reitern, mit je TabPage ein Ucl.

    Ein Unterschied der Tragl-MdiChilds zu TabControl-Ucls ist, dass bei Tragl die MdiChilds immer geschlossen und neu erzeugt werden.
    Während TabControl-Ucls wie gesagt zunächstmal da sind, wo ich sie hingetan hab, und da bleiben - die ganze Zeit.
    Bei viielen Einheiten wirkt sich das aus - TabControl-Ucls laden initial langsamer, der Wechsel der Tabs ist aber schneller.
    Man könnte auch für Ucls Infrastruktur schaffen, wo die Ucls on Demand erstellt und disposed werden - so wie die Tragl-Mdi-Childs.
    Dann käme das TabControl weg, und man würde einen WinForms-ContentPresenter erfinden, wie er inne Wpf üblich ist - (ach potzblitz! - das habich ja schon irgendwo!)



    VaporiZed schrieb:

    Kannst machen, wie Du willst. Aber ein Form ist nun mal … ein Formular. Wie eines in ner Behörde: Eine Ansammlung von Controls, um bestimmte Daten einzugeben und diese dann simpel oder komplex weiterzuverarbeiten. Ein UC ist eher dafür gedacht, dass man bestimmte Dinge, die ein einzelnes Control nicht allein hinbekommt, zusammenfasst und dieses mit mindestens 2 Instanzen (ggf. können diese 2 Instanzen auch in unterschiedlichen Programmen zum Einsatz kommen) nutzt. Ein UC mit nur einer Instanz geht m.E. am Sinn des Erfinders vorbei.
    Seh ich nicht so.
    Ein Ucl ist exakt 100% genau so ein (Behörden-)Formular, wie ein Form son Formular ist - nur eben ohne den unerwünschten Window-Kram (open, close, move, resize, maximize, minimize).
    Die allermeisten Forms werden ja auch immer nur in einer Instanz genutzt.



    Jo, aber mit Vaporized haben wir nun eine dritte Gui-Strukturierungs-Variante: die SubForms.
    Das sind eiglich auch so Tragl-Forms, nur eben nicht als MdiChild, sondern die fahren richtig - wie Forms numal gedacht sind - auffm Bildschirm herum.
    Ich benutze sowas nur als Dialog, also modal angezeigt, sodass der User gezwungen ist, erforderliche Eingaben zu tätigen oder zu canceln.
    Man kann SubForms auch unmodal anzeigen, aber das gefällt mir garnet, von einem Programm mehrere Forms rumfahren zu haben, die womöglich noch verdeckt sind oder anderes verdecken.

    Aber für Settings, oder auch Stammdaten kann ich mir modale SubForms auch gut vorstellen. Nur ich arbeite meist mit maximierten Fenstern - das finde ich bei einem Dialog nicht so schick, wenn der das Haupt-Fenster verdeckt.
    Aber für Touch-Screen und dicke Finger vielleicht grad richtig.

    nochmal zusammengefasst

    tragl schrieb:

    Hast ja nu 4 Berater, und folglich 4 Varianten:

    - Smurf: deine eigene
    - Edr: UCL
    - Tragl: Forms (mit Mdi)
    - Vaporized: Forms (ohne Mdi)
    Wobei "deine eigene" (also alles ins MainForm stopfen) sich wohl dem Ende nähert. Nämlich wenn der Lieferanten-Tab und der Verkauf-Tab implementiert wird, ist Übersichtlichkeit glaub nicht mehr zu gewährleisten.



    achja - Regions als Strukturierung:
    Ich mag die nicht.
    Zugeklappt sehe ich nicht, was gecodet ist, aufgeklappt ist mir der Editor zu voll.
    In meinen Augen verschleiern Regions v.a. schlechte Architektur.
    Dann lieber Partiale Klassen - wobei das auch nur eine Verschleierung ist.

    Neu

    Ja, wie gesagt, dass sich meine eigene Mögliochkeit dem Ende nähert sehe ich absolut ein.
    Aber es scheint ja tatsächlich so zu sein, dass es wurscht ist, ob ich tragls MDIChild Variante verwende, oder eben die UCLs.
    Bzw. gibt es für beides Gründe das nicht zu verwenden (weils für was anderes gedacht ist, usw.), ebenso gibt es ja aber auch für beides Gründe es zu verwenden. Also kommt es wohl darauf an, wen ich Frage, bzw. was diese Person dann BEVORZUGT.
    Letztlich erfüllt ja aber hier beides seinen Zweck, nämlich die Trennung des Codes.
    Also werde ich das Projekt nun auf tragls MDIChild Idee umbauen.
    Hier finde ich @tragls Infrastruktur sehr interessant. Ich glaube mein Lernpotential ist hier höher.

    Neu

    Aus der Diskussion, was wofür gedacht ist, halte ich mich raus.
    Wichtig ist für mich, dass es (gescheid) umsetzbar ist - und das ist ja nunmal beides.

    ErfinderDesRades schrieb:

    Auch ists damit viel einfacher umzusetzen - eben ohne zusätzliche Infrastruktur.

    deswegen finde ich @tragl Variante interessanter. Kann ich mehr lernen und es macht Sinn damit mal gearbeitet zu haben, bevor ich es in andere Projekte integriere. Ein UC kann ich ja problemlos mit meinem jetzigen Wissen erstellen.

    Neu

    So. @tragl ich bin nun dabei deine Lösung in mein Projekt einzubauen.
    Dazu habe ich zunächst ein neues Modul hinzugefügt (LocalHelpers.vb) und den entsprechenden Code dort eingefügt.
    Aber ich erhalte nur Fehler. Da das in diesem Modul 46 sind, nehme ich mal an es ist offensichtlich, was ich falsch gemacht habe?