Allgemeiner Codecheck

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 23. Mai 2017, 09:51

Hallo 4tionov,
es tut mir leid, wenn der Eindruck entsteht, dass ich die Posts nicht beachte.
Zur Verdeutlichung, was ich will: in einer Form stelle ich eine qry zusammen (der je nach Eingabe des Benutzers verschieden ausfällt), das Ergebnis soll in einer GridView dargestellt werden. Deswegen rufe ich die DB erst hier auf.
Der Benutzer wählt aus dem Grid einen Eintrag zum Bearbeiten aus.
Der wird dann in einer Form angezeigt (und mit einigen zusätzlichen Daten aus verschiedenen DB-Aufrufen ergänzt).
Alles das können als Edit-Formen angezeigt werden(je nach Auswahl: Adress-Daten, ACode-Daten, etc.).

Nun zu deinem Posting:
Was ich verstehe:
In der Klasse CAdresse sind einige Propertys angelegt: Name, Straße, etc.
Weiters sind unten einige Getters/Setters angelegt die die Daten Speichern/ausgeben (in/von den Propertys)
Eine Frage dazu: Was beinhaltet der Property "PkAdresse"? ist hier die Adressnummer drinnen? Oder enthält es das komplette Ergebnis/Result?
In der Sub Edit() gibt es eine fmAdresse, ist das eine (weitere) Form, die die Daten anzeigt, also keinen Grid enthält?
Wie ist das: 'fmAdresse hat eine Property Adresse As CAdresse zu verstehen?
Ist das eine weitere Form?

Liebe Grüße

gambasso
Foriker
Beiträge: 1021
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von gambasso » Di 23. Mai 2017, 11:36

moin,

zur Spaltenbreite ein Beispiel: TableView22.Columns.Width = -1
Gruss

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 12:05

Kein Problem, es macht nur keinen Sinn,wenn wir aneinander vorbeireden. Ich denke, ich verstehe schon, was du machen möchtest, aber meiner Erfahrung nach führt das, was ich sehe, wie du das umsetzen möchtest, zu schlechtem Code.

Ich verstehe Deine Situation so:

Du hast viele Adressen.

Der Benutzer soll eine Adresse suchen und sie anzeigen können (dazu sollen noch zusätzliche Angaben und Infos angezeigt werden).
Der Benutzer soll sich mehrere Adressen in einem Grid anzeigen lassen (nach Auswahlkriterien).
Der Benutzer soll eine Adresse bearbeiten und speichern können.
Der Benutzer soll eine neue Adresse erstellen können.

Richtig?

Zu deiner Frage: PkAdresse ist der Primarykey (den du für die Speicherung in der DB brauchst).

Was die Sub Edit macht:

Hier ist der Vorgang "Der Benutzer soll eine Adresse bearbeiten und speichern können." aus der objektorientierten Sicht umgesetzt.

Edit() ruft ein Form (FmAdresse) auf, mit dem der Benutzer eine Adresse editieren kann. Dieses Form hat eine Property Adresse ("As CAdresse"), damit bekommt es das Adressobjekt (Me) übergeben und es füllt daraufhin seine Textfelder mit den Variablen der Adresse. Wenn der Benutzer in den Textfeldern etwas ändert, übernimmt das Form diese Änderungen in das Adressobjekt. Außerdem speichert es $WurdeGeaendert = True, das es als die Property WurdeGeaendert zur Verfügung stellt.

Sobald das Form geschlossen wird (es wird nur unsichtbar, weil es noch Persistent ist), prüft das Adressobjekt, ob die Property des Forms WurdeGeaendert wahr ist, wenn ja, speichert sich das Adressobjekt in der Datenbank. Danach erst schließt das Adressobjekt das Form wirklich.

Das relevante ist: Das Form weiß gar nichts von der Datenbank, es zeigt die Daten, lässt sie ändern, speichert sie im Adressobjekt und teilt mit, dass etwas geändert wurde. Das Adressobjekt selbst ist für seine Speicherung zuständig.

Das Adressobjekt CAdresse kann noch weitere Funktionen zur Verfügung stellen, z.B. Text(), um die Adresse als Text auszugeben, Suche(Suchstr as String), um eine Adresse zu suchen, etc ...
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 12:35

Ok, ich seh, das ist zu kompliziert zu erklären. ich habe dir schnell ein Beispiel geschrieben:
adressbeispiel-0.0.3.tar.gz
(12.37 KiB) 121-mal heruntergeladen
Da sind noch ein paar (notwendige) Tricks drin, z.B. die Weitergabe von dem Wahrheitswert "cancel" in Edit() und Save(), dass in FmAdresse die Textfelder der Gruppe "Eingabe" angehören und dass FmAdresse intern mit $Started registriert, ob es bereits gefült wurde.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 23. Mai 2017, 12:52

Hallo 4tionov,
ich wollte soeben eine Antwort auf deinen letzten Post schicken.
Deine neuer Post beantwortet viele meiner Fragen.
Ich werde das mal ausprobieren.
Kann ich ohne Probleme die diversen Bezeichnungen austauschen?
Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 12:57

vb6oldie hat geschrieben:
Di 23. Mai 2017, 12:52
ich wollte soeben eine Antwort auf deinen letzten Post schicken.
Deine neuer Post beantwortet viele meiner Fragen.
Ich werde das mal ausprobieren.
Kann ich ohne Probleme die diversen Bezeichnungen austauschen?
Ok, super! Sicherlich kannst du die Namen ändern, ich benenne die Dinge so, wie ich es selbst gerne mag.

Ich habe das Beispiel noch mal etwas geändert.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 13:07

Grmbl. Ich habe es nochmal geändert. "WurdeGeaendert" braucht es nicht in CAdresse.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 23. Mai 2017, 13:55

Hallo 4tionov,
ich habe den neuen Code nun übernommen, dazu eine Frage:
Deine Form FmAdresse ist das die Form in der die Adresse angezeigt wird oder die Form in der man Änderungen durchführt, oder beides?
Ich trenne ein meinem Programm stets die Anzeige von der Bearbeitung damit man den alten Stand noch sehen kann und wenn man die Bearbeitung verwirft, man in der Anzeige nichts zu verändern hat.
ObjektManagementSystem-0.0.1.tar.gz
(48.44 KiB) 119-mal heruntergeladen
Mein Programm reagiert noch nicht auf den neuen Code.
Vielleicht habe ich auch einen Teil des Codes in die falsche Form gestellt.
Hier mal wieder das ganze Programm, um nachzusehen, ob ich bisher alles einigermaßen richtig gemacht habe.

Was muss ich tun, damit die Daten in der Anzeige (fAdr) erscheinen und bei klick auf Edit in der fAdrEdit-Form erscheinen?

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Mi 24. Mai 2017, 01:15

Hallo,

der Code beantwortet Dir eigentlich alle Fragen. Weißt Du noch nicht, wie man in Gambas debuggt... ? Und was die Startklasse ist?
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mi 24. Mai 2017, 08:48

Hallo 4tionov,
ich denke das Debuggen funktioniert so: man setzt einen Haltepunkt, lässt das Programm laufen bis zum Haltepunkt und geht dann Schritt für Schritt weiter mit Einzelschritt oder Prozedurschritt, etc.
Das bringt bei mir nix.
Ich verstehe anscheinend nicht richtig wie bei gambas eine Klasse/Property funktioniert.
Ich habe eine Gridview (in fAdrListe) in der die Daten richtig angezeigt werden und eine "Anzeigeform - fAdr" mit TextBoxen etc. die wird zwar angezeigt aber ohne Daten.
Für die GridView habe ich eine Routine die mir die Header anzeigt und eine Sub "Gridview_Data" die mir die Daten liefert.
In der Anzeigeform habe ich nur eine Funktion "Adresse_Read" und eine Sub "Adresse_Write", die mir die Daten liefern sollten.
Die Property in der Anzeigeform verweist auf die Klasse "CAdr".

Das sollte doch so funktionieren?

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Do 25. Mai 2017, 11:15

Sorry, aber was du da programmiert hast, ist mir jetzt wirklich zu konfus, um es verstehen zu wollen. Das Programm ist so voll mit den verschiedensten Objekten und Widgets, die alle nicht funktionieren. Ich habe Dir ganz zu Beginn im Thread gesagt, wenn du die Grundlagen nicht verstehst, kommst du da bei Gambas nicht weit. Stoppe einfach mal dein Projekt, lehne dich zurück und beschäftige dich erst mal mit den Grundlagen.
Ich verstehe anscheinend nicht richtig wie bei gambas eine Klasse/Property funktioniert.
Ja genau, das denke ich auch. Wenn Du den Thread noch mal durchliest, ich habe Dir extra zwei kleine Beispiele programmiert, die zeigen, wie das mit den Modulen, Klassen, Forms und Properties funktioniert. Aber statt einfach den Code daraus in dein sowieso schon übervolles Projekt zu kopieren, solltest du erst mal nachvollziehen, was diese kleinen Projekte eigentlich machen. Du musst es verstehen!!!

Mach ein neues Projekt und versuche das mal nachzuvollziehen. Programmiere das, was ich dir da vorgezeichnet habe, einfach mal selbst nach und spicke nur ein kleines bisschen, wenn du nicht mehr weiter weißt.

Nochmal:
Eine Klasse ist eine Bauanleitung für ein Objekt. Du kannst eine vorhandene verwenden (z.B. die Textbox: http://gambaswiki.org/wiki/comp/gb.qt4/textbox), oder du kannst selbst eine schreiben. Du kannst daraus (mit New) ein konkretes Objekt erstellen, das genau so funktioniert, wie in der Klasse definiert.

Properties sind quasi die Ein- und Ausgaben eines Objektes, damit kannst du die Daten, die in dem Objekt gehalten werden, eingeben und auslesen. Du kannst dafür sorgen, dass, wenn Du Daten in das Objekt gibst, das Objekt irgendwas damit macht. Du kannst über Properties einem Objekt ein anderes übergeben (das habe ich Dir gezeigt in dem Adressbeispiel – da übergibt das Objekt Adresse sich selbst dem anderen Objekt FmAdresse).

Objektorientierung ist zu Beginn sehr, sehr schwer zu verstehen. Wenn du das aber mal verstanden hast, kannst du damit sehr elegant programmieren und deine Objekte vielfach wiederverwenden. Du sparst dir dann später jede Menge Arbeit. Aber zuerst musst du es verstanden haben.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Do 25. Mai 2017, 13:46

Hallo 4tionov,
ich habe nun das Adressbeispiel 0.0.3 gründlich studiert.

Die erste Erkenntnis daraus ist, das jede Property ein Objekt darstellt.
Also sind die Propertys "nachname", "vorname" und "PkAdresse" eigentlich Objekte in einem Objekt (CAdresse).
Auch die Property "Adresse" ist ein Objekt der Form"FMAdresse".
Das "Property Read" in der Form dient dazu, den Übergebenen Wert auszulesen und ist ein Objekt der Form.

Das "_new" dient dazu, einen Wert dem Objekt zu übergeben, siehe oben.
Der Bezeichner des Subs "Eingabe_Change" ist ein Bestandteil von einer Textbox, wenn sie wie hier der Gruppe "Eingabe" angehören.
* Du hast die TextBoxen der Gruppe "Eingabe" zugewiesen, damit sie mit nur einer Sub bearbeitet werden können?
* Im Objekt selber wird in Edit() der Variablen "fm" eine Form zugewiesen, damit sie kürzer angesprochen werden kann oder hat es einen anderen Grund?
* Was bewirkt die Zeile "fm.Adresse = Me" wirklich? Ich befinde mich hier doch im Objekt!
Wird damit der (neuen) Form das Objekt "Adresse" aus der Form zugewiesen?
Ich denke, so ist es, aber wozu? Damit der Austausch von diversen Daten funktioniert?

Bitte kommentieren und liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Do 25. Mai 2017, 16:39

vb6oldie hat geschrieben:
Do 25. Mai 2017, 13:46
ich habe nun das Adressbeispiel 0.0.3 gründlich studiert.
Super!
Die erste Erkenntnis daraus ist, das jede Property ein Objekt darstellt.
Also sind die Propertys "nachname", "vorname" und "PkAdresse" eigentlich Objekte in einem Objekt (CAdresse).
Nein, nicht ganz. Properties sind so etwas wie die Ein- (Write) und Ausgänge(Read) eines Objektes/ einer Klasse. In den o.g. Fällen sorgen sie dafür, dass die internen (privaten) Variablen von außen beschrieben und gelesen werden können.

Du könntest die Klasse CAdresse natürlich auch so definieren, dass du öffentliche Variablen verwendest (z.B. Public nachname As String). Allerdings haben Properties den Vorteil, dass du so innerhalb der Klasse den übergebenen String prüfen kannst (in Private Sub nachname_Write). Vielleicht möchtest du später mal Prüfungen einführen? Dann kannst du die Klasse ändern, ohne dass sich "außerhalb" der Klasse, also im Rest deines Programmes irgendetwas ändern muss.
Auch die Property "Adresse" ist ein Objekt der Form"FMAdresse".
Das "Property Read" in der Form dient dazu, den Übergebenen Wert auszulesen und ist ein Objekt der Form.
Nein, nicht ganz, bzw stimmen da die Bezeichnungen nicht. Das Form "FMAdresse" hat eine interne private Variable $Adresse, die über die Property Adresse gefüllt oder ausgelesen werden kann. Die interne Variable $Adresse (wie auch die Property) hat den Typ(!) CAdresse, kann also nur mit einem Objekt gefüllt werden, das aus einer Klasse CAdresse entstanden ist.

Eine Property beschreiben bedeutet immer, dass intern "Propertyname_Write(Value)" aufgerufen wird, Lesen einer Property liefert das Ergebnis von "Propertyname_Read()" Diese Funktionen hast Du als Programmierer unter Kontrolle. Du kannst damit auch einen Wert übergeben, der nur dazu dient, eine Funktion aufzurufen...
Das "_new" dient dazu, einen Wert dem Objekt zu übergeben, siehe oben.
Ja! (bzw Ja, auch). In der Public Sub _new() kannst Du Code schreiben, der abläuft, wenn das Objekt "instantiiert" wird, also neu entsteht. Ein Objekt wird immer mit "New" instantiiert. Wenn Du dir das andere Beispiel ansiehst, das mit den Rechnern, dann siehst du, dass dort aus einer Klasse zwei Objekte gebaut werden, je mit "New".

In _new(Variable1 As ..., Variable2 As ..., ...) kannst du einem Objekt beliebige Werte beim Start übergeben.
Der Bezeichner des Subs "Eingabe_Change" ist ein Bestandteil von einer Textbox, wenn sie wie hier der Gruppe "Eingabe" angehören.
Du hast die TextBoxen der Gruppe "Eingabe" zugewiesen, damit sie mit nur einer Sub bearbeitet werden können?
Genau.
Im Objekt selber wird in Edit() der Variablen "fm" eine Form zugewiesen, damit sie kürzer angesprochen werden kann oder hat es einen anderen Grund?
fm existiert nur(!) innerhalb Edit. Wenn Edit fertig ist, hat die Sub auch das Form geschlossen.
* Was bewirkt die Zeile "fm.Adresse = Me" wirklich? Ich befinde mich hier doch im Objekt!
Wird damit der (neuen) Form das Objekt "Adresse" aus der Form zugewiesen?
Fast richtig. Das Adress-Objekt übergibt sich selbst an das Form FmAdresse und kontrolliert zugleich die Lebensdauer des Forms.
Ich denke, so ist es, aber wozu? Damit der Austausch von diversen Daten funktioniert?
Genau. Das Ganze dient verschiedenen Zwecken. Zuerst werden in CAdresse die Daten gekapselt. CAdresse hat alleine die Kontrolle über die enthaltenen Daten, an dieser Stelle erfolgt die Verarbeitung. So lange Du die öffentlichen Interfaces (Properties/Funktionen) nicht änderst, kannst du nachträglich den Code deiner Klasse ändern wie du möchtest (z.B. Prüfungen einführen), ohne das restliche Programm zu tangieren.

Dadurch kannst du in deinem Programm mehrere Adressen zugleich anzeigen/bearbeiten (siehe das Beispiel mit den Rechnern). Da jedes Objekt seine Verarbeitung in sich selbst besorgt, ist dein Programm davor sicher, dass Objekte versehentlich die Daten anderer Objekte überschreiben.

Der dritte Grund ist die Möglichkeit der Vererbung. In meinem Betrieb z.B. verarbeiten wir eine Menge verschiedener Arten von Datensätzen, die Personen betreffen, in unseren Programmen. Die verschiedenen Klassen erben aber alle von einer übergeordneten CPerson und erweitern diese. Dadurch kann man Code wiederverwenden. Man schreibt ihn einmal (in CPerson) und kann die selbe Funktion in CMitarbeiter aufrufen (wenn CMitarbeiter von CPerson erbt).

Dann gibt es noch die Lebensdauer eines Objektes, seine Integrität, und dass es während seiner Laufzeit einmalig ist. Einmal mit New instantiiert, kannst du es dann beliebig verwenden. Das siehst du an der Stelle, als CAdresse sich selbst an das Form FmAdresse weiterreicht. Obwohl FmAdresse geschlossen wird, "lebt" das Objekt immer noch und kann dann anschließend weiter verwendet werden, es it in diesem Fall unabhängig von der Laufzeit des Forms. Du kannst das Objekt im Programm an verschiedener Stelle verwenden und bearbeiten, es ist und bleibt das eine Objekt. Es beendet sein "Leben" zum Ende der Laufzeit seiner Umgebung. "fm" in Edit() lebt nur, solange die Funktion läuft. Die Connection, über die wir uns unterhalten haben, so lange das Programm läuft.

Wenn du mit solchen Dingen fließend umgehen kannst, kannst du sehr robuste Programme schreiben, die überdies besonders gut wartbar sind, weil der Code sich praktisch immer da befindet, wo er auch verwendet wird. Die Kapselung von Code in Klassen ist praktisch unumgänglich wenn Programme größer werden. Vielleicht kennst du das: Du hast eine Menge Spaghetticode, an einer Stelle wird was geändert und das Programm bricht dann an etlichen anderen (davon völlig unabhängigen) Stellen. So was passiert mit Objekten nicht (mehr so leicht ;-) ).
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Fr 26. Mai 2017, 06:49

Hallo 4tionov,
ich werde mal versuchen, das alles zu verdauen.
Dann werde ich ein neues Projekt schreiben mit nur einer Form(neben der FMain), eine Klasse zur Form und ein Modul für die Connection.
Kann ich die nötige Gestaltung der Form (top,left.etc,) auch in das Objekt verlagern oder muss das in der Form bleiben.
Ich möchte das Ergebnis der Form/des Objekts, in diesem Fall einen String in eine Datei ausgeben, aber ohne die Verwendung eines Steuerelementes.
Ich habe eben folgendes gefunden k7.5.0.6:

Code: Alles auswählen

Public hFile As File
Public sFilePath As String = Application.Path &/ "log.txt"
     hFile = Open sPath For Write Create ' Die Exportdatei wird stets neu angelegt  <= das ist das was ich will!
     Write #hFile, sSQL  <= geht das so?
     Close #hFile 
Ist das das was ich will?
Ich finde in diesem Schnipsel keine Definition der Variablen "sPath" oder gehört das zum "Open", wie "For Write Create"?
Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Fr 26. Mai 2017, 08:49

vb6oldie hat geschrieben:
Fr 26. Mai 2017, 06:49
ich werde mal versuchen, das alles zu verdauen.
Ja, ich weiß schon, das ist alles nicht so einfach. Aber es lohnt sich.
Dann werde ich ein neues Projekt schreiben mit nur einer Form(neben der FMain), eine Klasse zur Form und ein Modul für die Connection.
Kann ich die nötige Gestaltung der Form (top,left.etc,) auch in das Objekt verlagern oder muss das in der Form bleiben.
Das hätte im Objekt überhaupt nichts zu suchen. Aber: Vergiss es insgesamt, Elemente per Code zu platzieren, das ist veraltet, macht furchtbar viel Arbeit und bringt absolut nichts! Arbeite stattdessen mit Containern:

http://gambas-buch.de/dw/doku.php?id=k18:start

Container platzieren Steuerelement automatisch! Du wirfst deine Elemente einfach rein, definierst,wie sie angeordnete werden sollen, und fertig.
Ich möchte das Ergebnis der Form/des Objekts, in diesem Fall einen String in eine Datei ausgeben, aber ohne die Verwendung eines Steuerelementes.
Ich habe eben folgendes gefunden k7.5.0.6:

Code: Alles auswählen

Public hFile As File
Public sFilePath As String = Application.Path &/ "log.txt"
     hFile = Open sPath For Write Create ' Die Exportdatei wird stets neu angelegt  <= das ist das was ich will!
     Write #hFile, sSQL  <= geht das so?
     Close #hFile 
Ist das das was ich will?
Ich finde in diesem Schnipsel keine Definition der Variablen "sPath" oder gehört das zum "Open", wie "For Write Create"?
sPath sollte eine String sein und gibt den Pfad zum File an, z.B.:

"/tmp/test.txt"
Alles Gute,

4tionov

Gesperrt

Wer ist online?

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