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:

Allgemeiner Codecheck

Beitrag von vb6oldie » Fr 5. Mai 2017, 07:32

Hallo Leute,
1. kann mir bitte jemand den Code cheken ob der so in Ordnung ist? Es funktioniert zwar, aber ist das so korrekt?
Test3-0.0.1.tar.gz
(12.93 KiB) 63-mal heruntergeladen
Die Funktion: Wenn ich von der Hauptform (FMain) in eine Unterform springe, und dort entweder abbreche ode OK klicke, soll das Programm wieder in die Hauptform springen und diese aktivieren. (Im Moment habe ich hier noch nichts programmiert)
Einige Fragen:
2. Kann man Buttons (oder anderes) in ein Array stellen um diese Buttons später mit einer For..Next-Schleife abarbeiten zu können? Und wie?
3. Wie gestalte ich Klassen (Module), um zB. Unterroutinen hier unterzubringen, die von überall angesprochen werden können?
4. für später: Wie gestalte ich einen Datenbankaufruf an eine MySQL/Maria-DB?
[50] cDBVerbindung.Close()
[51] cDBVerbindung.Type = "?????????????" ' Der Typ muss klein geschrieben werden!
[52] cDBVerbindung.Host = Application.Path &/ "?????????" 'Home/franz/Gambas/Test3 ??
[53] cDBVerbindung.Name = "Liste" ' Das ist der Datenbank-Name, hier vielleicht "oms" (ist noch nicht endgültig festgelegt)
[54] cDBVerbindung.User = sUser 'User-Name
[55] cDBVerbindung.Password = sPwd 'User-Pwd(unverschlüsselt)
[56] cDBVerbindung.Port = iPort 'welchen Port nehme ich hier, die DB ist auf dem Rechner installiert.

Bitte um Hilfe

Benutzeravatar
gambi
Moderator
Beiträge: 312
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von gambi » Fr 5. Mai 2017, 19:49

Hallo vb6oldie,
zu 1): Das sieht doch schon gut aus. Ich würde nur statt des Form_Activate() den Form_Open() Event bevorzugen.

zu 2 und 3: siehe anghängtes Projekt.
Das Programm listet dir die Controls der Form in einer For/Each-Schleife auf, springt dann in die Klasse "meineKlasse" und schriebt etwas in die Konsole. Kehrt dann mit einem Rückgabewert vom Typ String zurück und gibt diesen ebenfalls auf der Konsole aus.

zu 4 habe ich zu wenig Erfahrung mit DBs

gg
Dateianhänge
Auflisten_von_TextBoxen_usw-0.0.1.tar.gz
(11.51 KiB) 63-mal heruntergeladen

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Sa 6. Mai 2017, 08:00

Hallo gambi,
ich glaube da gab es wieder Mißverstände, ich wollte so was wie hier beschrieben haben:
Codewunsch.txt
(1.86 KiB) 71-mal heruntergeladen
Ich will nicht alle Controls auf einmal bearbeiten, sondern einzelne Gruppen davon separat (unterschiedlich) bearbeiten können.
In VB6 gab es die Möglichkeit, Buttons etc. bereits bei der Erstellung als Mitglieder von Array's zu definieren mit einheitlichen Namen aber mit Indizes.

Die "Form_Activate()" habe ich inzwischen alle auf "Form_Open()" geändert.

Kann man versehentlich namentlich falsch definierte Forms nachträglich ändern oder löschen, das habe ich bisher noch nicht hinbekommen. :?: :!:

Bitte um weitere Hilfe

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

Re: Allgemeiner Codecheck

Beitrag von 4tionov » Sa 6. Mai 2017, 09:50

vb6oldie hat geschrieben:
Fr 5. Mai 2017, 07:32
4. für später: Wie gestalte ich einen Datenbankaufruf an eine MySQL/Maria-DB?
[50] cDBVerbindung.Close()
[51] cDBVerbindung.Type = "?????????????" ' Der Typ muss klein geschrieben werden!
[52] cDBVerbindung.Host = Application.Path &/ "?????????" 'Home/franz/Gambas/Test3 ??
[53] cDBVerbindung.Name = "Liste" ' Das ist der Datenbank-Name, hier vielleicht "oms" (ist noch nicht endgültig festgelegt)
[54] cDBVerbindung.User = sUser 'User-Name
[55] cDBVerbindung.Password = sPwd 'User-Pwd(unverschlüsselt)
[56] cDBVerbindung.Port = iPort 'welchen Port nehme ich hier, die DB ist auf dem Rechner installiert.
So läuft das bei mir (und Postgresql, wenn du die Wahl hast,würde ich das empfehlen):
gambas code
        Dim DB as Connection
        Dim qry as String
        Dim res as Result
        
        DB.Type = "postgresql" 'alternativ mysql
        DB.Host = "derhostname" ' auch ip oder "localhost"
        DB.Name = "namederdatenbank"
        DB.Login = "benutzer"
        DB.Password = "password"
        
        qry = "select count(*) as anzahl from tbkunden;"
        res = DB.Exec(qry)
        
        Debug res!anzahl
Ich selbst definiere die Connection einmalig in einem Modul als Property, dadurch wird sie zu einem Singleton (oder einer globalen Variable). Beim ersten Zugriff auf die DB wird die Connection aufgebaut, danach bleibt sie zur Laufzeit des Programmes bestehen. Das läuft so:
gambas code
        Property Read DegShop As Connection
        Private $Degshop As New Connection
        
        Private Function Degshop_Read() As DegConnection

		If Not $Degshop.Opened Then

			'Debug "Open connection to db Shopdb"
			$Degshop.Type = "postgresql"
			$Degshop.Host = "hostname"
			$Degshop.Login = "user"
			$Degshop.Password = "passwoooord"
			Open($Degshop)

		Endif

		Return $Degshop
	Catch
		Error.Propagate

	End
Alles Gute,

4tionov

Benutzeravatar
gambi
Moderator
Beiträge: 312
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von gambi » Sa 6. Mai 2017, 12:15

Hallo,
gambi hat geschrieben:
Fr 5. Mai 2017, 19:49
Kann man versehentlich namentlich falsch definierte Forms nachträglich ändern oder löschen, das habe ich bisher noch nicht hinbekommen
Ja, selbstverständlich. Im Projektexplorer mit rechter Maustaste auf die Form, deren Namen du ändern oder die du löschen möchtest, klicken und im Kontextmenu "Umbenennen" oder "Löschen" wählen. Umbenennen mit der Return-Taste bestätigen!

gg

besenmuckel
Foriker
Beiträge: 70
Registriert: Di 4. Nov 2014, 21:11
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von besenmuckel » Sa 6. Mai 2017, 12:24

Kann man versehentlich namentlich falsch definierte Forms nachträglich ändern oder löschen, das habe ich bisher noch nicht hinbekommen. :?: :!:
Meinst du das.
1.
Rechtsklick auf die Form und Kontext auswählen. Bei Auswahl Umbenennen, muss dann im Code der Name auch umgestellt werden geht nicht automatisch. Das gleiche gilt für Löschen. Falls noch ein Menüeintrag oder Button für die gelöschte Formname.show existiert. Unter Umständen kann sich das Programm aufhängen.
2.
Mit Rechtsklick auf die grüne Form kannste mit Kontext Menüeditor die Namen für Menü1, Menü2, usw. auch ändern. Im Code muss dann das auch angepasst werden.
3.
Ändern des Namens für ein Element(Button1, Label1, usw.) mit Linksklick auf der Form auswählen und bei Eigenschaften kann dann der Name geändert werden. Die Änderungen im Code geht automatisch. Wird das ausgewählte Element gelöscht(per Kontexmenü oder Taste Entf bei einigen Tastaturen auch Del) werden die Funktion im Code automatisch nicht mit gelöscht.
.
gbr3_form_kontext3.png
gbr3_form_kontext3.png (188.72 KiB) 2228 mal betrachtet
Zuletzt geändert von besenmuckel am Sa 6. Mai 2017, 17:26, insgesamt 8-mal geändert.

Benutzeravatar
gambi
Moderator
Beiträge: 312
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von gambi » Sa 6. Mai 2017, 13:24

Hallo,
gambi hat geschrieben:
Fr 5. Mai 2017, 19:49
Ich will nicht alle Controls auf einmal bearbeiten, sondern einzelne Gruppen davon separat (unterschiedlich) bearbeiten können.
In VB6 gab es die Möglichkeit, Buttons etc. bereits bei der Erstellung als Mitglieder von Array's zu definieren mit einheitlichen Namen aber mit Indizes.
nun, diese Möglichkeit kenne ich zumindest nicht in Gambas.
Du hast ja aber die Auflistung aller Controls in deiner Form.

In dem angehängten Beispiel werden die Controls durchlaufen und in Anhängigkeit ihres Namens - in dem Fall TextBoxen - entsprechend positioniert (siehe Klasse posTBs.class).
Du könntest aber auch über die Tag-Eigenschaft gehen und den Controls dann entsprechende Tags mitgeben (z.b. TB1, TB2 usw.).

gg
Dateianhänge
Auflisten_von_TextBoxen_usw_02-0.0.1.tar.gz
(12.03 KiB) 66-mal heruntergeladen

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Sa 20. Mai 2017, 13:17

Hallo 4tionov,
ich habe alles in ein Modul (DBRead.module) geschrieben, so wie du es angezeigt hast.
Bildschirmfoto vom 2017-05-20 13-59-23.png
Bildschirmfoto vom 2017-05-20 13-59-23.png (33.61 KiB) 2154 mal betrachtet
Ich habe noch nichts weiter dazu programmiert.
Wenn ich das Programm starte erhalte ich sofort die Fehlermeldung in der ersten Zeile:
Unbekannter Bezeichner: Connection in DBRead.module
Ich habe auch anderes probiert z.B. die Anleitung aus dem Buch 17.7.5, nichts geht.
Das einmalige starten der Connection will ich auch beibehalten, und ev. am Schluss des Programms wieder closen.

Wenn es dann funktioniert, wie rufe ich die property auf?
Wo gebe ich eigentlich an, wie die Datenbank heißt? $DegShop.name = "oms01" wie im Buch beschrieben?

Bitte um Hilfe

PS.: Wenn ich etwas im Editor eingebe, muss ich manchmal auf den "Down"-Pfeil und die angezeigte funktion klicken, damit die Eingabezeile abgeschlossen wird. Kann man das irgendwo einstellen, damit man automatisch aus der Zeile herauskommt?

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

Re: Allgemeiner Codecheck

Beitrag von 4tionov » Sa 20. Mai 2017, 14:04

Du musst dafür in deinem Projekt die Komponenten gb.db und gb.db.mysql einbinden. Vorher kennt dein Projekt keine Connection-Klasse.

"DegShop" ist übrigens ein Bezeichner für eine bestimmte DB in meinem Projekt. Bei mir heißt das Modul "DBs, der Name ist kurz, weil ich den oft verwende". Der Aufruf geht dann so:
gambas code
Dim qry As String
Dim res As Result

'Beispielquery
qry = "select name from tbanyname;"
res = Dbs.DegShop.Exec(qry)

If res.Count > 0 Then
	For Each res
		Print res!name
	Next
Endif
Durch die Verwendung eines Modules und seiner Properties, ist das ein Singleton, die Connection steckt also in einer programmweit eindeutigen globalen Variablen. Auch wenn sonst bei Gambas fast immer von der Verwendung globaler Variablen abzuraten ist, hier hat sie starke Vorteile. Besonders wenn Du Transactions verwenden solltest, kann es sonst leicht zu DeadLocks kommen, wenn zwei Teile deines Programmes je eine eigene Connection aufmachen und auf den selben Tabellen der DB arbeiten.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » So 21. Mai 2017, 05:58

Hallo 4tionov,
wieder mal eine blöde Frage: wie binde ich die beiden Komponenten ein?

Es war mir bewusst, dass "Degshop" eine deiner Komponenten ist, ich habe das ganze nur einfach kopiert, damit kein zusätzlicher Fehler auftritt.

Natürlich werde ich ausreichend Transactions verwenden um zusammengehörige Dinge auch zusammen verarbeiten zu können.

Wie funktioniert das Modul "Data"? und wie installiere ich es, wenn ich es benötigen sollte?

Eine weitere Frage: Ich habe in der Deklaration des Hauptfensters einige Public-Variablen angegeben, aber in andern Forms muss ich sie trotzdem Qualifizieren, ich dachte, das währen damit "Globale" Variablen?

Bitte um Hilfe

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

Re: Allgemeiner Codecheck

Beitrag von 4tionov » So 21. Mai 2017, 07:47

vb6oldie hat geschrieben:
So 21. Mai 2017, 05:58
wieder mal eine blöde Frage: wie binde ich die beiden Komponenten ein?
In Gambas3 Strg-P (= Projekt bearbeiten), da links Komponenten. Hier sind die Komponenten beschrieben:
http://gambaswiki.org/wiki/comp
Es war mir bewusst, dass "Degshop" eine deiner Komponenten ist, ich habe das ganze nur einfach kopiert, damit kein zusätzlicher Fehler auftritt.
Nein, das ist keine Komponente, sondern eine Property. :-)
Wie funktioniert das Modul "Data"? und wie installiere ich es, wenn ich es benötigen sollte?
Meinst du "DBs", was ich erwähnt habe? Sonst verstehe ich das nicht. Wenn ja, "DBs" heißt bei mir das Modul, in dem ich die Connection(s) definiert habe (Das ist bei Dir DBRead.module).
Eine weitere Frage: Ich habe in der Deklaration des Hauptfensters einige Public-Variablen angegeben, aber in andern Forms muss ich sie trotzdem Qualifizieren, ich dachte, das währen damit "Globale" Variablen?
Nein, Forms sind spezielle Klassen, die von Form erben. Eine Klasse ist aber nur eine Beschreibung eines Objektes, das erst "lebt", wenn es mit "new" instantiiert wurde. In einer Klasse kannst du nichts speichern, das geht erst in dem daraus erstellten Objekt. Dafür kannst du von einer Klasse beliebig viele Objekte erstellen. Selbst wenn das Objekt nun öffentlich beschreibbare Properties (oder auch Variablen) hat, die kannst du nur beschreiben oder lesen so lange das Objekt existiert.

Module hingegen sind Behälter für Methoden, die du aufrufen kannst, ohne, dass erst ein Objekt daraus erstellt werden muss. Sie sind einmalig und statisch. Darum funktionieren sie (Properties darin) als Globale Variablen. Aber Globale Variablen musst du generell vermeiden! Es gibt nur ganz seltene Ausnahmen. "DBRead.DegShop" ist eine davon.

Bitte schau noch mal das Beispiel an: viewtopic.php?f=3&t=5422#p12125
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » So 21. Mai 2017, 11:47

Hallo 4tionov,
ich habe nun die beiden Komponenten installiert.
Die Code habe ich inzwischen angepasst:
Bildschirmfoto vom 2017-05-21 12-14-56.png
Bildschirmfoto vom 2017-05-21 12-14-56.png (39.98 KiB) 2120 mal betrachtet
und in FMain:
Bildschirmfoto vom 2017-05-21 12-14-12.png
Bildschirmfoto vom 2017-05-21 12-14-12.png (33.21 KiB) 2120 mal betrachtet
Es tritt ein neuer Fehler auf:
Syntaxfehler in FMain.

Der Fehler tritt in der Exec-Zeile vor dem Select auf.
Ich habe aus der Wiki den Code übernommen, aus "How To Open a MySQL connection and use it", wie er im Exampel1 beschrieben wurde.
Der Fehler tritt auch auf, wenn ich nur "SELECT * FROM adr" eingebe.
In der Datenbank habe ich bis jetzt nur einen einzigen Satz hinterlegt, in der Tabelle "adr", die anderen 35 Tabellen sind bis jetzt leer.
* Bitte mir zu verzeihen, wenn ich statt Prozedur Komponente sage oder sonstige Teilbereiche des Codes falsch benenne.

* Globale variablen will ich dann benutzen, wenn sie überall mit dem gleichen Inhalt vorkommen und nur einmal belegt werden, z.B.:
fh = screen.Height
fh5 = fh / 4.2
fh6 = fh / 6.3
fw = screen.Width
fw2 = fw / 2.07
bh = 32
Diese kommen in (fast) allen Forms immer wieder vor.

* Das "Data" habe ich irgendwo gesehen und ich dachte, es hat etwas mit der Ausgabe von Daten aus der DB zu tun, aber das ist anscheinend so nicht richtig/nicht nötig.

Ich taste mich eben Schritt für Schritt vor um zu richtigen Ergebnissen zu kommen. :)

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von 4tionov » So 21. Mai 2017, 11:58

Der Syntaxfehler: Es fehlt eine schließende Klammer bei Exec. Gambas sagt Dir doch die Zeilennummer beim Fehler, da kannst Du gleich schauen.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von 4tionov » So 21. Mai 2017, 12:04

Insgesamt: Deine Prozedur Connect() ist nicht gut. Weil sie Public ist, kann sie in deinem Programm von verschiedenen Seiten vielfach aufgerufen werden. Schau mal an, was ich Dir zu Beginn gezeigt habe, mit der Property, auf die nur lesend zugegriffen werden kann, und die nur beim ersten Zugriff die Connection startet...

In posting.php?mode=reply&f=3&t=5418#pr12142 hattest du das schon richtig.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » So 21. Mai 2017, 15:41

Hallo 4tionov,
den Fehler mit der Klammer hatte ich selber bald behoben.
Aber dann trat ein neuer Fehler im Modul auf.
Dann habe ich den ursprünglichen Code wiederhergestellt.
Dann habe ich versucht den "DegShop" (den ich ja nicht habe) durch "Con" zu ersetzen, das erste Problem, ich kann in der Funktion das "DegConnect" nicht durch "DegConnect" ersetzen, sondern ich verwende als Test nur "Connect".
Es erscheint der Fehler: "Unbekannter Bezeichner: Open" in der Open-Zeile.
Was habe ich nun schon wieder falsch gemacht?
Bildschirmfoto vom 2017-05-21 16-31-58.png
Bildschirmfoto vom 2017-05-21 16-31-58.png (41.94 KiB) 2116 mal betrachtet
Liebe Grüße

Gesperrt

Wer ist online?

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