Anfänger-Fragen

Gelöstes und einfache Beispiele
psp
Junior Member
Beiträge: 32
Registriert: 8. September 2010, 09:28
Kontaktdaten:

Anfänger-Fragen

Beitrag von psp »

Hallo,

hier ist auch einer der wechselwilligen, die eine Alternative zu Alaska Xbase++ suchen. Eine Programmversion von WinDEV 15 ist gekauft und installiert.

Ich versuche mich schon an ein paar GUI-Geschichten. Doch kommen hier und da ein paar Fragen auf. Die man bei Alaska mehr oder weniger gelöst hatte und hier neu aufkommen.

Dann fange ich mal an:

1. Checkbox-Verhalten beim Speichern und lesen:

Bei Xbase++ über ein Datalink gelöst, wenn True, dann sollte das Programm ein "J" in die Datenbank speichern, bei einem False ein "N".

WinDEV speichert mir in die Datenbank ein "O" für True und ein "N" für False.

Ich hätte dies gerne etwas differenziert, dass weiterhin ein "J" und ein "N" gespeichert werden. Die Möglichkeiten von BOOL-Feldern in den dBase-Datenbanken haben wir absichtlich nie genutzt, um die Variabilität zu wahren, wenn noch mehr Optionen auf dem selben Schalter kommen sollen.

2. Combbox-Verhalten
Das Erstellen der Combobox ist mittels WYSIWYG ist ja ganz nett. Daten kann ich auch in Abhängigkeiten von Parametern auch aus einer Tabelle herauslesen und darin speichern. Doch auch hier wird das zu speichernde Ergebnis anders gehandhabt. Das Beispiel sind hier Bundesländer und die Abhängigkeit ist ein Land.
Bei Alaska fragte man entsprechend das Objekt bzw. das Unterobjekt (SLE) ab um an die Information zu gelangen und diese dann zu speichern.
WinDEV speichert mir die Position des Wertes ab. Das Speichern passiert automatisiert über das ScreenToFile(), was einem allerhand Arbeit abnimmt aber auch etwas Freiheit.

3. Parameter-Übergabe
Ich habe in meinem Beispielprogramm ein Hauptfenster mit einem Hauptmenü, damit steuer ich weitere Programmfenster.
Gestartet wird ein solcher Eintrag mit "Open(WIN_Programmfenster)"
Das klappt auch wunderbar. Nun habe ich vor, dem noch einen Parameter mit zu übergeben, was laut Hilfe möglich sein sollte: "Open(WIN_Programmfenster,1)". Hierbei wird die Procedure WIN_Programmfenster um den Parameter (nTabMode) erweitert. Doch einen Test lässt er nicht zu. Die Fehlermeldung sagt aus, dass 1 Parameter übergeben wurde, doch die aufgerufene Procedure nur 0 Parameter unterstützt werden. Gibt es noch andere Stellen, wo ich die Definition hinterlegen muss?

Wenn mir weitere Fragen einfallen, werde ich sie hier reinposten. In der Hoffnung, dass es fleißige Mitleser gibt und den einen odere anderen Ansatz für mich haben.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

Hi,

Grundsätzlich wird bei Listbox und Combobox das gespeichert, was angezeigt wird, aber wenn du dem Anzeigetext einen GLINK() anhängst, dann kannst du diesen Wert als Standardrückgabe festlegen (ich glaube unter Details) oder aber im Code abfragen. Beispiel:

ListAdd( oCB, "Deutschland" + gLink("DE"))
oCB[oCB] gibt normalerweise die gewählte Zeile zurück, unter Details könnte man das umschalten, aber auch so abfragen.
Info("Anzeige:"+oCB[oCB]..DisplayValue + CR + ...
"Rückgabe:"+oCB[oCB]..StoredValue)

Bei der Checkbox hätte ich jetzt 1 oder 0 bzw. True oder False erwartet.
So wie ich die Dokumentation verstehe, kann man keine Checkbox mit einem anderen Datentyp versehen (man kann natürlich eine Funktion verwenden).

Eine Checkbox in Xbase++ ist aber etwas anders:
In Xbase++ ist eine Checkbox genau eine Option, die dann mit mehreren in eine Gruppe gepackt wird. Ähnlich wie auch bei Radiobuttons, nur dass dort die Gruppe den Rückgabewert bestimmt.

In Windev - so scheint es mir - ist die Checkbox eine Gruppe von Optionen, wobei auch eine Option erlaubt ist. Diese Gruppe wird - bei mehr Elementen - wie ein Array angesprochen.

Eventuell kann man bei den Optionen auch GLINK() nutzen, ansonsten musst du eine eigene Funktion zwischenschalten die Übersetzt.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

WinDEV speichert mir die Position des Wertes ab. Das Speichern passiert automatisiert über das ScreenToFile(), was einem allerhand Arbeit abnimmt aber auch etwas Freiheit.
du kannst in dem Quellcode vor dem ScreenToFile() natürlich noch die Felder der Datenbank ändern, Der LINK geht nämlich nur in den Puffer. Vermutlich sollte man die selbst zu ändernden Felder nicht verlinken, sondern selbst behandeln, so genau weiß ich das aber auch noch nicht.

Beispiel:

Du verwendest eine Query die den gewünschten Datensatz anzeigt mit Schreibrecht: oQRY

oQRY..Name ist verlinked und eigentlich ok ...
oQRY..Option soll J oder N speichern, die CheckBox liefert True oder False
oCheckBoxOption soll hier genau eine Option darstellen.

im Quellcode gibt es die Zeile ScreenToFile() ( ich vermute du hast das Fenster automatisch bauen lassen, ansonsten z.B. im Click Event vom Speichern Button)

davor könntest du die Zeile einfügen:

if oCheckBoxOption then
oQRY..Option = "J"
else
oQRY..Option = "N"
end
// nach den Änderungen alles Speichern.
ScreenToFile()

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

"O" ist auf französisch der erste Buchstabe von "Ja" wie "Y" in englisch,
"N" steht in allen Sprachen für "Nein".

Du solltest zumindest auf ein numerisches Feld wechseln, wenn die Zwischenübersetzung nicht geht. Dann hast du teilweise auch noch die Auswahl -1 für undefiniert ;-)

psp
Junior Member
Beiträge: 32
Registriert: 8. September 2010, 09:28
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von psp »

Danke, das mit dem gLink funktioniert sogar. Hab das wohl überlesen, wobei ich die Hilfe nicht ganz so hilfreich wie bei Xbase++ finde.

Die Checkbox habe ich auch so manipuliert, dass beim Speichern ein "J" und ein "N" speichert wird. Das Setzen der Werte beim Anzeigen funktioniert ebenfalls.


Dann bleibt nur noch die Sache mit der Übergabe von Variablen an Programmfenster. Die Hilfe sagt, ich darf das. Bei einem anderen Beispiel klappt das auch, was ich nicht nachvollziehen kann.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

Hi,

du darfst OPEN() Parameter übergeben, deine Fehlermeldung lese ich aber so, dass dein FENSTER noch keine Parameter definiert hat.
Hierzu die Hilfe

> 1. Declare a procedure in the "Declaration process of global variables" of the window.
> The name of this procedure and the name of the window must be identical.
> The parameters of this procedure correspond to the parameters that must be passed to the window.

Angenommen dein Fenster heißt "MeinFenster" und erwartet 1 Parameter, dann musst du in dem Quellcode Editor zu den Definitionen gehen,
ganz oben gibt es "Declaration process of global variables":

-- Declaration of global variables of MeinFenster --
PROCEDURE MeinFenster (sMeinStringParameter)

Ich vermute, dass alle Funktionen, Fenster und Prozeduren - wie in Basic üblich - Parameter standardmäßig PER REFERENZ übergeben, als wie mit @ Operator bei Xbase++.
Wenn ich mich richtig erinnere könnte man einen PER VALUE (also geschützt) in der PROCEDURBESCHREIBUNG so definieren:

PROCEDURE MeinFenster (LOCAL sMeinStringParameter)

Hierbei bin ich mir aber nicht sicher und ich habe WinDev nicht offen ;-)

psp
Junior Member
Beiträge: 32
Registriert: 8. September 2010, 09:28
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von psp »

Aufruf in der betreffenden Zeile:

Open(WIN_Firmenstamm, 2)

Das Fenster WIN_Firmenstamm ist wie folgt deklariert:

PROCEDURE WIN_Firmenstamm(nTabMode)

heraus kommt folgende Fehlermeldung:

Error at line 5 of Click BTN_Modify process.
Compilation errors found in code: it cannot be run.

----- Technical Information -----

Project : Test

WL call:
Process of 'Click BTN_Modify' (WIN_Table_BFIRM.BTN_Modify), line 5, thread 0

What happened?
Compilation errors found in code: it cannot be run.

Error code: 1001
Level: fatal error (EL_FATAL)

Dump of the error of 'WD150VM.DLL' module (15.00Ou).
Identifier of detailed information (.err): 1001
Debugging information:
The 'WIN_Firmenstamm' window expects up to 0 parameters while 1 parameters have been passed.
Additional Information:
EIT_PILEWL :
Click BTN_Modify (WIN_Table_BFIRM.BTN_Modify), line 5
Double Click of TREE_TreeView1 (WIN_MENU.TREE_TreeView1), line 6
EIT_DATEHEURE : 14/09/2010 16:18:16


Gegenprüfung -Aufruf in der betreffenden Zeile:

Open(WIN_Firmenstamm)

Das Fenster WIN_Firmenstamm ist wie folgt deklariert:

PROCEDURE WIN_Firmenstamm(nTabMode)

heraus kommt folgende Fehlermeldung:

Error at line 5 of Click BTN_Modify process.
Open function called.
Wrong parameters for WIN_Firmenstamm window: 1 parameters are required while 0 parameters have been passed.

----- Technical Information -----

Project : Test

WL call:
Process of 'Click BTN_Modify' (WIN_Table_BFIRM.BTN_Modify), line 5, thread 0
'Open' function, syntax 0

What happened?
Wrong parameters for WIN_Firmenstamm window: 1 parameters are required while 0 parameters have been passed.

Error code: 1002
Level: fatal error (EL_FATAL)

Dump of the error of 'WD150VM.DLL' module (15.00Ou).
Identifier of detailed information (.err): 1002
Debugging information:
Fonction (1,1)
Additional Information:
EIT_PILEWL :
Click BTN_Modify (WIN_Table_BFIRM.BTN_Modify), line 5
Double Click of TREE_TreeView1 (WIN_MENU.TREE_TreeView1), line 6
EIT_DATEHEURE : 14/09/2010 16:21:35

Gibt es denn evtl. noch eine Stelle, wo ich etwas deklarieren muss? Nachdem ich die Variable nTabMode in den Prozeduraufruf gesetzt habe, kann ich die Variable nutzen und selbst Intellisense bietet sie willig mir an. Damit wäre sie im Programmfenster bzw. der Prozedur WIN_Firmenstamm nutzbar. Nur übergeben will das Programm die Variable nicht haben.

Selbst wenn ich das aufrufende Programm mit einer Variablen bediene folgt eine Meldung wie die erste Fehlermeldung ganz oben. Logisch für mich nicht nachvollziehbar.

nTest is int
nTest = 2
Open(WIN_Firmenstamm, nTest)

dierau
Junior Member
Beiträge: 4
Registriert: 20. August 2010, 16:35
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von dierau »

Versuch's mal so :
PROCEDURE WIN_Firmenstamm(nTabMode=0)
Aus welchen Grund auch immer muss man einen Defaultwert angeben.
Statt 0 kannst du natürlich auch irgendeinen nWert angeben.

Dieter

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

Hallo,

zur Ergänzung, wenn man einen DEFAULT Wert angibt, dann ist der Parameter OPTIONAL !
So vermeidet man die Fehlermeldung mit dem fehlenden Parameter bei der Übergabe, aber nach der Beschreibung dürfte der Fehler gar nicht auftreten wenn die Definiton richtig ist. :s

psp
Junior Member
Beiträge: 32
Registriert: 8. September 2010, 09:28
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von psp »

Guten Morgen,

das mit der Default-Vorgabe hat auch nicht so funktioniert wie man das vorsieht. Vielleicht hab ich irgendwann etwas falsch gemacht.

Nun hab ich noch eine andere Möglichkeit entdeckt, das *. Und siehe da, da nimmt er den Wert an und ich bekommen ihn per Trace ausgegeben.

Im Anschluss kommt gleich die nächste Anfänger-Frage.

Wie verhält sich das mit den Panes? Ich habe auf meinem Programmfenster ein TAB-Objekt, muss ich auf jedes TAB-Fenster ein Pane anlegen, damit ich es einzeln ansprechen kann? Daher auch die angedachte Variable nTabMode.

Benutzeravatar
BRANDELH
Site Admin
Beiträge: 199
Registriert: 30. Juni 2010, 14:31
Wohnort: Germersheim
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von BRANDELH »

Hi,

probieren ;-)

aber ich glaube nicht, denn ein TabPage-Control ist ja ein Control, während eine Pane eine Ebene des Fensters ist, die Controls aus und einblendet.
TabControls habe ich noch nicht verwendet, aber bei meinem ersten Programm (WD Mobile) habe ich PANES benutzt um mir Fenster zu ersparen.
Ein Smartphone ist doch recht begrenzt. Bei einer MDI Anwendung würde ich das eher nicht verwenden.

psp
Junior Member
Beiträge: 32
Registriert: 8. September 2010, 09:28
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von psp »

Man darf beim setzen der TabPages nicht bei dem falschen Event Einträge setzen.

Nun geht das auch. Das mit den Panes ist im Moment noch etwas verwirrend, weil man das nicht weiter kennt.

Benutzeravatar
klammerauf
Member
Beiträge: 116
Registriert: 28. November 2010, 15:11
Wohnort: bei Karlsruhe
Kontaktdaten:

RE: Anfänger-Fragen -> Panes

Beitrag von klammerauf »

Ganz kurz meine Erfahrung mit den Panes

Bei den TabPages absolut nicht notwendig. Genauso wenig übrigens bei ShowHide.

Pane bedeutet übersetzt etwa 'Ebene' ähnlich wie bei PhotoShop.

Stell dir ein Wizard-Fenster vor, bei dem Seitenweise im gleichen Fenster Variablen abgefragt werden, immer unten der 'Weiter' oder 'Zurück' Button. Hier nimmt man ein Fenster, auf den Pane 0 legt man die Buttons. Dann drückt man auf der Tastatur PgDn/Seite runter und dann legt man Eingabefenster, Statics usw. auf das Fenster. Ein weiter Klick auf PgDn und man hat wieder ein leeres Fenster (bis auf die Buttons).

Wenns dir hilft, dann mach ich ein Video davon.

Sebastian

Benutzeravatar
klammerauf
Member
Beiträge: 116
Registriert: 28. November 2010, 15:11
Wohnort: bei Karlsruhe
Kontaktdaten:

RE: Anfänger-Fragen

Beitrag von klammerauf »

Sorry, wir sprechen hier von Panes, aber gemeint sind die Planes!

:@

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Anfänger-Fragen

Beitrag von Herbert »

Bin eifrig am Testen, daher werden da Fragen auftauchen
Habe eine Tabelle, fülle diese auf. Klappt gut. Seek in Partnerdatei mit composite key. Geht auch (hbuildkeyvalue gefunden).
Nun will ich ein Datumfeld aus der 2. Datenbank anzeigen.

Code: Alles auswählen

TableAdd(TABLE_T1,...+TAB+ZLDATA.GES_DAT+...
ges_dat ist ein Datumfeld, wird korrekt angezeigt, nachdem der Typ auf Date gesetzt ist und Input Mask auf 'DD.MM.YY' steht.

Das Problem:
Nun fülle ich eine Variable:

Code: Alles auswählen

cBuf = ZLDATA.GES_DAT
TableAdd(TABLE_T1,....+TAB+cBuf+...
bringt in jedem Spaltenelement ein leeres Feld "__.__.__" zurück, obwohl der richtige Datensatz gefunden ist. Di Vaiable enthält z.B. gemäss Debugger "20110312", also ein Datum.
Setze ich die Spalte auf Character, wird eine Zahl angezeigt, deren Sinn ich aber momentan nicht einsehe (1 oder 2)

Warum ich das möchte, ist der, dass bei leerem Datum ein Text (z.B. "Noch offen") erscheinen sollte

Was ist falsch?

Antworten