Klassen bzw. Module

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Klassen bzw. Module

Beitrag von vb6oldie » Fr 12. Mai 2017, 09:04

Hallo Leute,
ich habe nicht begriffen, wie man Klassen bzw. Module erzeugt (erzeugen ja, aber sie funktionieren nicht wie erwartet).
Ich will die Form vom vielen Code entlasten, der entsteht, wenn ich viele GriedViews, Buttons, Textlabels und Textboxen positionieren und (Gridviews) füllen muss.
Ich habe einiges probiert und einige Programme aus der Softwarefarm durchsucht, aber bringe nichts zustande.
Ich bekomme solche oder ähnliche Fehlermeldugen:
Bildschirmfoto vom 2017-05-12 09-58-12.png
Bildschirmfoto vom 2017-05-12 09-58-12.png (35.52 KiB) 6905 mal betrachtet
Kann mir bitte jemand erklären, wie ich Klassen bzw. Module erstelle?
Danke

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Fr 12. Mai 2017, 10:27

Bitte in solchen Fällen ein Beispielprojekt mitsenden, damit wir nicht raten müssen. An dem Bild ist nicht mal erkennbar, wo der Code steht, der den Fehler wirft.

Ich glaube, du musst dich erst mal grundsätzlich mit Objektorientierung beschäftigen.

Module sind im Prinzip Behälter für Methoden, die man immer wieder verwenden möchte. Eine Methode in einem Modul verwendest du so:
gambas code
Dim ergebnis as Integer
ergebnis = MRechner.Add2Int(1,2)
print ergebnis
Hier steht die Methode (oder Funktion) Add2Int im Modul MRechner. Du kannst diese Methode, soweit sie "Public" ist, von überall her in deinem Projekt verwenden. Aber du musst praktisch die richtige "Adresse" angeben.

Klassen sind hingegen so etwas wie Bauanleitungen für Objekte. Nahezu alle Objekte mit denen du bei Gambas umgehst, sind definiert durch Klassen. Klassen haben (in der Regel) Eigenschaften (Properties), (private und/oder öffentliche) Variablen und Methoden(Sub und/oder Function). Der entscheidende Unterschied zu einem Modul ist, dass du erst ein Objekt aus dieser Klasse definieren musst, erst dann kannst du es verwenden. Und der entscheidende Vorteil einer Klasse ist, dass du daraus eine beliebige Anzahl an Objekten erstellen kannst, die alle gleich funktionieren.

So, weil ich gerade Lust hatte, habe ich Dir ein kleines Projekt gebaut, es beinhaltet ein Modul und eine Klasse (die die Methode in dem Modul verwendet) und ein Form, das aús der Klasse zwei Objekte (primitive Integer-Addierer) macht und diese anzeigt. Diese beiden Rechner-Objekte funktionieren unabhängig voneinander und der Programmierer kann natürlich noch viele weitere davon erstellen.

Nur, um das Prinzip darzustellen:
modulundklasse-0.0.1.tar.gz
(11.84 KiB) 162-mal heruntergeladen
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von vb6oldie » Fr 12. Mai 2017, 11:30

Hallo 4tionoc,
hier das Projekt, das den Fehler wirft:
Objekt_Managemen_System-0.0.1.tar.gz
(14.86 KiB) 146-mal heruntergeladen
Die Bedienung: Im Menü klicke auf Adressen/Neu und schon gibt's nen Fehler.
In der Form FMain habe ich den SUB GridView6_Fill auskommentiert und in die Klasse GridView6Fill gestellt und angepasst.
Es ist hier nur ein Test, es sollen aber alle Fill's, Pos's, etc. in Module gestellt werden.
Das gezeigte Programm enthält bloß etwa ein viertel der benötigten Prozeduren, oder noch weniger.
Es sollte aber ein Modul (oder mehrere) werden, aber in den Moduln geht es auch nicht.
In den Prozeduren ..._Text_Pos sieht man die vielen TextLabels die ich benötige, dies ist nur ein geringer Teil davon.

Mit Modulen und Klassen kenne ich mich grundsätzlich aus (von VB6) auch mit Objektorientierung, aber ich weiß nicht wie ich das hier verwirklichen kann.
Wo muss ich z.B. "Export" einsetzen? Vielleicht habe ich auch schon wieder einiges aus VB vergessen.

Danke für weitere Hilfe

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Fr 12. Mai 2017, 14:46

Ok, ich sehe es. Also, diesen Code auszulagern, ist völlig sinnlos. Denn die Dinge, die in einem Form passieren, sollte man auch in der Klasse des Forms selbst abhandeln. Du verminderst nicht die Komplexität, indem du denselben Code auf mehrere Klassen/Module verteilst. In dem Code veränderst du nur ein einziges Objekt, daher macht es überhaupt keinen Sinn, diesen in ein Modul oder eine Klasse auszulagern.

Auslagern macht nur einen Sinn, wenn du etwas "generisch" schreibst, das also für viele Objekte gültig ist. Aber hier würde es wahrscheinlich auch reichen, wenn du die eine Methode, die mehrere gleichartige Objekte innerhalb eines Forms verändern kann, innerhalb der Formklasse selbst ablegst, z.B. so (nur als Beispiel):
gambas code
Private Sub GVFill(GV As GridView, ColTitles As String[], Colwidths As Integer[])

  Dim i As Integer

  With GV
    .Resizable = True  ' Muss vor allen anderen Eigenschaften gesetzt werden
    .Mode = Select.Single
    .Columns.Count = ColTitles.Count
    .Header = .Both

    For i = 0 To ColTitles.Count - 1
      .Columns\[i\].Width = Colwidths\[i\]
      .Columns\[i\].Title = ColTitles\[i\]
    Next
  End With

End
(Die Backslashes musst du bitte entfernen ...)

Aber insgesamt: Wenn ich mir dein Projekt so ansehe, dann sind da sehr viele grundlegende Dinge falsch. Das Problem ist, dass du auf einem Komplexitätslevel beginnst, der zu hoch ist. Denn dir sind offensichtlich Grundlagen noch nicht klar, und nein, Objektorientierung hast du noch nicht ausreichend verstanden, sonst würdest du den Code gar nicht auslagern wollen.

Wenn du mit dem, was du da hast, weiterabeitest, kriegst du eine uferlose Menge unwartbaren Spaghetticode, Riesenfrust, und dann hast du irgendwann keine Lust mehr und wirst sagen: Gambas ist Mist.

Was willst du da eigentlich machen?
Alles Gute,

4tionov

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Fr 12. Mai 2017, 14:54

vb6oldie hat geschrieben:
Fr 12. Mai 2017, 11:30
Wo muss ich z.B. "Export" einsetzen? Vielleicht habe ich auch schon wieder einiges aus VB vergessen.
Export verwendet man nur in Bibliotheken, also Projekten, deren Klassen/Module man in anderen Projekten wiederverwenden möchte.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von vb6oldie » Fr 12. Mai 2017, 16:17

hallo 4tionov,
4tionov hat geschrieben:
Was willst du da eigentlich machen?
Im Grunde bin ich noch mit testen beschäftigt.
Ich will einmal ein Programm schreiben, das die Adressen neben dem Auftrag und neben den Objekten gleichzeitig anzeigen kann, daraus soll später von jeder Zeile eines Grids ein Update, ein "neu erstellen" oder ein löschen möglich sein, auch von anderen Dingen, die kein Grid sind, etc.
Daher die vielen Buttons, Labels und Textfelder die ich nicht auf einmal auf der GUI-Area darstellen kann und sie daher gedrängt zeichnen muss und im Code dann positionieren und die Größe einstellen muss.
Dabei habe ich noch nicht einmal eine Datenbank angehängt.
Die Daten der Db will ich dann in einen Zwischenspeicher einlesen und von dort in eine Liste und in den Update-Bereich lesen.
Wenn dann der Benutzer den Update abbricht, stehen die Originaldaten immer noch im Zwischenspeicher.
Dieser Inhalt wird erst geändert, wenn der Benutzer den Update bestätigt und die Prüfprozedur der eingegebenen Daten erfolgreich verlief, dann werden die geänderten Daten gespeichert.
Dein Muster zeigt mir jedoch, wie ich die Grids vorteilhaft füllen kann, wenn ich den dann Daten zur Verfügung habe.

Wahrscheinlich bin ich noch zu sehr mit der Programmierung in VB verbandelt.

Danke

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Fr 12. Mai 2017, 18:13

vb6oldie hat geschrieben:
Fr 12. Mai 2017, 16:17
4tionov hat geschrieben:
Was willst du da eigentlich machen?
Im Grunde bin ich noch mit testen beschäftigt.
Ich will einmal ein Programm schreiben, das die Adressen neben dem Auftrag und neben den Objekten gleichzeitig anzeigen kann, daraus soll später von jeder Zeile eines Grids ein Update, ein "neu erstellen" oder ein löschen möglich sein, auch von anderen Dingen, die kein Grid sind, etc.
Daher die vielen Buttons, Labels und Textfelder die ich nicht auf einmal auf der GUI-Area darstellen kann und sie daher gedrängt zeichnen muss und im Code dann positionieren und die Größe einstellen muss.
Dabei habe ich noch nicht einmal eine Datenbank angehängt.
Ok. Also so was in der Art?
crm.jpg
crm.jpg (68.7 KiB) 6886 mal betrachtet
Du kannst so was im Gambas gut bauen, für mich ist Gambas ein RAD, ein Rapid Application Development Environment, mit dem man wunderbar Fat Clients unter Linux für den eigenen Betrieb bauen kann. Genau das, wofür man früher z.B. VB6 oder auch Access verwandte. Nur ohne Vendor Lockin. Trotzdem (trotz RAD) musst du die Entwicklungszeit für so was in Mannjahren rechnen.

Was du in dem Screenshot siehst, ist die Darstellung einer Vielzahl von Objekten, die zu einem Gesamtbild zusammengefügt werden, Adresse(n), Bestellungen, verschiedene Kommunikationsformen und Aktionen. In Gambas kann man sehr gut einzelne Forms bauen, die jeweils einen Teilbereich einer Sache darstellen und man kann diese Forms zusammen in einem Hauptform oder in Tabs kombinieren.

Aber da muss man klein beginnen. Z.B. kannst du eine Klasse "CAdresse" bauen, die alle Eigenschaften (Anrede, Vorname, Nachname, Strasse ...) enthält. Dazu ein Form, das diese Adresse zeigt und ein weiteres, mit dem die Adresse editiert werden kann. Dann kann die Klasse Adresse Methoden haben, z.B "ShowAsForm", "GetAsString" und "Edit" und schließlich "Load" und "Store".

Dann gibt es vielleicht verschiedene Adressen (Kunden, Mitarbeiter von Kunden, Lieferanten, Mitarbeiter von Lieferanten, Freunde...) und du könntest weitere Klassen bauen, die von CAdresse erben ("CAdresseKunde Inherits CAdresse") und spezielle Eigenschaften und Methoden einführen, die die spezielle Klasse zusätzlich benötigt. Durch das Erben spart man sich das Neuschreiben und kann Code gut wiederverwenden. Z.B. erbt CAdresseKunde die Methode "Edit" und zeigt beim Aufruf das Adressform ...

Es ist aber wichtig, dass man zu Beginn schaut, wie man seine Objekte strukturiert, bei uns ist z.B. "Person" ein zentrales Objekt, von dem weitere erben. Firma ist eine juristische Person, Kunde ist eine Person, Mitarbeiter ist eine Person. Eine Person hat eine Adresse (oder auch zusätzliche, z.B. Versandadressen, weiterer Firmensitz, usw). Dann gibt es Aktionen, die mit der Person verknüpft werden können (Mails, Telefonanrufe, Bestellungen ...), oder weitere Objekte, wie Telefonnummern oder Firmenwagen ... was weiß ich.

Bei uns zeigte es sich als natürliche Art der Entwicklung, zuerst für die konkreten Objekte, die mit der Applikation bearbeitet werden, Datenbanktabellen anzulegen, sodass "Load" und "Store" auch gleich mit der DB korrespondieren, allerdings setzt unsere App auf einer vorhandenen DB auf, vielleicht kann man da auch ganz andere Wege gehen.

Vielleicht löst du dich auch erst mal vom Grid und vor allem andern von der Idee, alles in einem einzigen Form anzuzeigen. Grid ist nur eine Art, ein Objekt anzuzeigen. Vielleicht kannst du erst mal Forms machen für einzelne Objekte, die du dann in Container innerhalb eines übergeordneten Forms einfügen kannst. Die Positionierung kannst du komplett Gambas bzw QT überlassen. Dazu solltest du dich gerade mit den Containern befassen, sie sorgen dafür, dass die Sache schön angezeigt wird, auch wenn sich Größen (des Forms oder eines Teilbereiches) verändern. Du findest große Hilfe dazu im Gambas Buch.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von vb6oldie » So 14. Mai 2017, 12:25

Hallo 4tionov,
dein Muster hat mich auf einige Möglichkeiten gebracht wie ich die Formulare gestalten kann.
Ich habe alles wieder umgestellt.
Jetzt sieht es so aus:
ObjektManagementSystem-0.0.1.tar.gz
(15.05 KiB) 250-mal heruntergeladen
Zur Bedienung: Klicke auf Adresse/Neu so siehst du unten das Panel mit den 4 Reitern "Person","Branche","Text" und "Code".
Die Form fAPer soll in den Tab Person und die Form fABra soll in den Tab Branche, u.s.w. den Rest habe ich noch nicht erstellt.
Muss ich da irgendwo einen Index setzen?

Ich bringe das nicht zu Stande.

2. In der Form fAPer soll ein ToolPanel mit den gezeigten Menüpunkten vorhanden sein, ich bekomme das nicht so richtig hin, ich habe statt dessen 3 Panels angelegt.
Gleiches gilt für die Formen fABra und fACode.
Nimmt man hier überhaupt eine Toolbar?

Wo finde ich die ToolBar? Wenn ich die dann finde, wie stelle ich dann Buttons, etc. hinein? Ist das die ToolBox?

Danke für deine Hilfe

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Di 16. Mai 2017, 21:37

Sorry, ich bin nicht gleich zum Antworten gekommen. Hier ist die Lib, mit der ich selbst TabPanels verwalte, da hast du auch ein Beispiel drin:
deg-tabpanel-1.0.6.tar.gz
(15.13 KiB) 142-mal heruntergeladen
Und mit einem Toolpanel habe ich noch nicht gearbeitet. Oder meinst du eine Toolbar? Da schrub unser BDFL hier, wie das geht:

http://gambas.8142.n7.nabble.com/How-to ... 51682.html

Da verweise der Gute noch auf den Code der IDE. Das ist überhaupt das beste Lehrstück. Ziehe Dir einfach den Code von Gambas selbst. Dort findest du unter /app/src/gambas3/.src die IDE als Sourcecode. Da kannst du dir dann genau anschauen, wie so was elegant programmiert wird.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von vb6oldie » Mi 17. Mai 2017, 08:47

Hallo 4tionov,
und wieder habe ich mich nicht genügend ausgedrückt, was ich haben will:
Bildschirmfoto vom 2017-05-17 09-14-36.png
Bildschirmfoto vom 2017-05-17 09-14-36.png (39.06 KiB) 6851 mal betrachtet
Ich möchte ein Menü installieren, das so aussieht, wie im Bild unter Person.
Nur habe ich hier ein Panel vergewaltigt und ich kann auf die einzelnen Punkte (wie bei einem richtigen Menü) nicht zugreifen.
Habt ihr eine Idee, wie man sowas bewerkstelligen kann?
Oberhalb der Person habe ich im Moment ein richtiges Menü probiert, aber das gefällt mir nicht, da man auf die erste Zeile des Menüs nicht zugreifen kann, sonder erst auf die zweite, u.s.w.
Die Variante mit den Buttons funktioniert zwar, aber sie gefällt mir auch nicht.
Letztes mal habe ich auch mit den Toolbars probiert, geht aber nicht, zumindest nicht so wie ich das will.

Zwischendurch eine weitere Frage, ist im Moment nicht so wichtig, da es mit der Anbindung an eine DB dann gelöst ist:
Kann man in einem Gridview die Breite der Spalten generell an die Länge der darin enthaltenen Texte anpassen, ohne auf den Input zugreifen zu müssen (z.B. auf die Daten aus einer DB)?

Bitte weiter um Hilfe

Benutzeravatar
tionov
Site Admin
Beiträge: 286
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Klassen bzw. Module

Beitrag von tionov » Mi 17. Mai 2017, 20:56

vb6oldie hat geschrieben:
Mi 17. Mai 2017, 08:47
Ich möchte ein Menü installieren, das so aussieht, wie im Bild unter Person.
Das richtige Widget dafür sollte eine Toolbar sein, hier ist es beschrieben, mit Beispielprojekt:
http://www.gambas-buch.de/dw/doku.php?i ... 13.5:start

Sorry, aber ich selbst habe damit noch nicht gearbeitet.
Alles Gute,

4tionov

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste