DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Also ich weiß nicht, ob es die Jahresdunkelheit ist....

ich finde nichts, woran ich erkennen kann, wie man Pushbutton enablen/disablen kann.
Zuletzt geändert von Manfred am Fr, 19. Dez 2008 11:32, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DCPUSHBUTTON Disablen/enablen

Beitrag von Markus Walter »

Hi Manfred,

über den WHEN-Codeblock:

Code: Alles auswählen

@ 5, 5 DCPUSHBUTTON ... WHEN {|o| .t./.f.}
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen

Beitrag von Manfred »

Hi Markus,

ich habe immer noch ein Brett vor dem Kopf. Was mache ich damit?
Wie kann ich aus einer anderen Aktion einen bestimmten Button enablen/Disablen

Bei den Normalen XbParts ist es einfach nur oPb:enable() oder oPb:disable()

Ich kann beim besten Willen nicht sehen, wie ich das mit express++ machen kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DCPUSHBUTTON Disablen/enablen

Beitrag von Markus Walter »

Hi,

du kannst in dem Codeblock z. B. eine Variable abfragen...

Code: Alles auswählen

local lButtonEnabled := .t.

@5, 5 DCPUSHBUTTON ... WHEN {|o| lButtonEnabled}

zum "disablen" irgendwo:
lButtonEnabled := .f.

Diese Variable kannst Du dann an anderer Stelle (anderer Button, Checkbox, Programmlogik, wo auch immer) setzen. Ggf. musst Du den Button dann refreshen, damit der WHEN-Codeblock evaluiert wird (siehe dc_getrefresh(), damit kann man ein, mehrere oder alle Controls eines Fensters refreshen).

Den WHEN-Codeblock gibt es bei praktisch jedem DC..., ebenso HIDE und andere. Es ist immer der gleiche Mechanismus.


Es gibt aber auch noch einen anderen Weg. Da alle DC... von den entsprechenden Xbase-Controls abgeleitet sind, wäre auch folgendes denkbar:

Code: Alles auswählen

@ 5, 5 DCPUSHBUTTON ... OBJEKT oPB

und dann irgendwo
oPB:disable()

Ich persönlich arbeite aber immer nach dem ersten Schema. Ich finde das übersichtlicher, da ich sofort an einer Stelle sehen kann, dass das Control ggf. disabled sein kann (bzw. versteckt - HIDE, oder ähnliches). Bei der zweiten (Xbase-ähnlicheren) Methode, stehen diese Aktionen (z. B. das "disable") an irgendwelchen Stellen in der Business-Logik...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen

Beitrag von Manfred »

Aha,

also einen Umweg nehmen.

Jetzt steige ich langsam durch. Da habe ich jetzt nicht mit gerechnet. Wobei es jetzt so ist, wenn ich einen Button drücke und dem in der ACTION sage, er soll einen anderen disablen, dann macht der das, aber erst nach dem 2. Klick. Aber das nur am Rande. Scheint dann wohl intern ein REFRESH zu geben. Aber jetzt klappt es so, wie ich es meine...
Auf geht es.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9384
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 103 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Tom »

Hallo, Manfred.

Neben WHEN gibt es übrigens (allerdings m.E. nicht bei Buttons) auch noch EDITPROTECT. All diese Klauseln erwarten Codeblöcke, die dann wahr oder falsch zurückgeben. Da das WHEN ja einen Grund haben muss (z.B. darf ein SPEICHERN-Button nicht geklickt werden, wenn man nicht im BEARBEITEN-Modus ist), ist das kein Umweg, sondern sehr viel kompakter:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'SPEICHERN' SIZE 10,1 WHEN {||!lBearbeiten}
Statt also eine Variable getoggelt wird, die Speichern/Bearbeiten umschaltet, wird die einfach im When-Codeblock gesetzt. Codeblöcke geben Werte zurück, da könnte also auch eine Funktion oder der Abruf eine iVar stehen:

Code: Alles auswählen

WHEN {||InBearbeitung()}
oder

Code: Alles auswählen

WHEN {||oMeinDatenObjekt:WirdBearbeitet}
EDITPROTECT macht das gleiche (nur umgekehrt - WAHR lässt die Bearbeitung zu, FALSCH nicht), setzt aber z.B. SLEs nicht auf grau.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Hi Tom,

ich denke mal, dass Roger sich etwas dabei gedacht hat. Es war nur für mich überhaupt nicht zu erkennen, wie das laufen sollte. Ich werde jetzt weiter testen und sehen, was so alles möglich ist.

Ansonsten...... ab und an würde ich dann nochmals hier fragen. :badgrin:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9384
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 103 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Tom »

Hallo, Manfred.

Rogers Pushbuttonklasse kann etwas mehr als die normalen XbpPushbuttons, beruht aber, wie alle Elemente, auf den Xbase-Klassen (also Parts). Die Klauseln der kommandoorientierten Schreibung (be-)setzen iVars oder Slots der jeweiligen Objekte. WHEN regelt den Wert von :enable und :disable. Wenn WHEN (wenn) ja/wahr/.T. zurückliefert, ist der Button enabled, umgekehrt disabled. Es kommt also dem manuellen Aufruf von oButton:Enable() oder oButton:Disable() gleich, was Du übrigens ganz unabhängig von der WHEN-Klausel auch selbst machen kannst:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'Mein Button' SIZE 12,1 OBJECT oButton ACTION {||MsgBox('Hallo')}
Irgendwo anders könntest Du dann "oButton" nutzen, also z.B. oButton:Disable() aufrufen oder die Caption ändern. Das wäre aber unnötige Arbeit. Wenn CAPTION ein Codeblock ist (CAPTION {||ButtonCaption(1)}) würde jede Veränderung des Rückgabewerts von "ButtonCaption" die Anzeige der Caption verändern. Dafür muss allerdings ein DC_GetRefresh(GetList) aufgerufen werden. WHEN und ähnliche Klauseln erwarten allerdings ausschließlich Codeblöcke, in denen Du aber machen kannst, was Du willst. Hauptsache, sie geben schließlich entweder wahr oder falsch zurück. Wenn sie wahr liefern, ist der Button enabled, umgekehrt disabled. Ist eigentlich ganz einfach - und sehr viel kompakter als das Herumeiern mit Methoden und iVars.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Hi Tom,

das mit dem Objekt, in das der PushButton gelegt wird und dann damit :enable() :disable(), das hatte ich auch probiert, aber an der falschen Stelle. Ich muß wohl zuerst wirklich .T./.F. setzen in dem When Codeblock. Innerhalb der Deklarierung und des DCREAD geht es dann nicht. (Ist jetzt aber auch wieder klar warum nicht. Über DCREAD wird ja erst alles initialisiert und das Objekt ist ja noch nicht bekannt davor.)

Es ist also dann möglich, die fertigen XbParts über die herkömmliche Art zu steuern. Das wollte ich auch nur nochmals bestätigt haben. Aber da ja Roger alles mit Hausmitteln von Xbase++ gemacht hat, sollte es ja auch so möglich sein.

Prima, dann wird der Jahreswechsel ja doch nicht so langweilig, wie vermutet. :D Viel Zeit zum Testen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9384
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 103 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Tom »

Hallo, Manfred.

Vom Prinzip her hast Du recht - die Objekte "stehen" erst, wenn der DCREADer läuft. Aber auch bereits bei dessen Aufruf - die EVAL-Klausel von DCREAD kann schon auf die Objekte zugreifen:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'Mein Button' SIZE 12,1 OBJECT oButton ACTION {||MsgBox('Hallo')}
DCREAD GUI EVAL {||oButton:Disable()}
Einfacher wäre aber sowas:

Code: Alles auswählen

lButtonNutzen := .F.
@ 1,1 DCPUSHBUTTON CAPTION 'Mein Button' SIZE 12,1 OBJECT oButton ACTION {||MsgBox('Hallo')} WHEN {||lButtonNutzen}
DCREAD GUI
Außerdem hat jedes Objekt eine eigene EVAL-Klausel, die auch erst evaluiert wird, wenn die Eventschleife läuft und alle Objekte initialisiert sind. Also geht auch das hier:

Code: Alles auswählen

@ 1,1 DCPUSHBUTTON CAPTION 'Mein Button' SIZE 12,1 OBJECT oButton ACTION {||MsgBox('Hallo')} EVAL {||oButton:Disable()}
Herzlich,
Tom
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Markus Walter »

Hi Manfred,
Manfred hat geschrieben: das mit dem Objekt, in das der PushButton gelegt wird und dann damit :enable() :disable(), das hatte ich auch probiert, aber an der falschen Stelle. Ich muß wohl zuerst wirklich .T./.F. setzen in dem When Codeblock. Innerhalb der Deklarierung und des DCREAD geht es dann nicht. (Ist jetzt aber auch wieder klar warum nicht. Über DCREAD wird ja erst alles initialisiert und das Objekt ist ja noch nicht bekannt davor.)
Beides zusammen macht keinen Sinn. Entweder Du arbeitest mit dem WHEN-Codeblock ODER mit "herkömmlichem" oButton:disable()

Wenn Du folgendes machen würdest:

Code: Alles auswählen

local lButtonAktiv := .t.

@ 5, 5 DCPUSHBUTTON ... WHEN {|| lButtonAktiv } OBJEKT oButton

und irgendwo
oButton:disable()
dann wäre der Button zwar disabled, aber nur bis zum nächsten Refresh (passiert ja auch ggf. "von selbst" durch Rogers System). Denn dann würde die Variable lButtonAktiv ausgewertet, die ja immer noch .t. ist und der Button würde wieder enabled.

Also entweder mit WHEN oder kein WHEN und mit Deiner "herkömmlichen" Methode.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Hi Markus,

ist mir gerade auch in den Sinn gekommen, aber ich muß ja irgendwie direkt zu Anfang einen Button disablen können. Für Parts, die erst später anders selektiert werden sollen, ist es ja egal. Da kann man dann die Variante :disable() usw. nutzen. Die Parts sind von Hause aus :enabled().
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Markus Walter »

Manfred hat geschrieben:Hi Markus,

ist mir gerade auch in den Sinn gekommen, aber ich muß ja irgendwie direkt zu Anfang einen Button disablen können. Für Parts, die erst später anders selektiert werden sollen, ist es ja egal. Da kann man dann die Variante :disable() usw. nutzen. Die Parts sind von Hause aus :enabled().
Du brauchst doch nur die Variable am Anfang auf .f. zu setzen?!?!?!

Code: Alles auswählen

local lButtonAktiv := .f.
@ 5, 5 DCPUSHBUTTON ... WHEN {|| lButtonAktiv } OBJEKT oButton
dann ist zunächst disabled und durch setzen der Variable auf .t. wird der Button enabled (ggf. durch ein Refresh).
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Hi Markus,

genau das meine ich ja. Alles klar. Ich muß die eben so ablaufen lassen. :enable() usw. kann/könnte ich ja erst später über einen anderen Weg setzen. Meine Frage war ja nur, ob es anders geht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9384
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 103 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Tom »

Hallo, Manfred.

Wenn Du viele Buttons hast, deren Nutzbarkeit von einer Sache/einem Programmzustand/einer Variablen abhängen, bist Du mit WHEN einfacher bei, weil Du immer nur die gleiche WHEN-Klausel bei allen Buttons wiederholen musst, statt manuell die Objektliste abzuwandern und disable()/enable() zu wählen. Zudem könntest Du dieserart einfach weitere Buttons hinzufügen, ohne Dich um derlei kümmern zu müssen. Die Veränderung der Variablen führt dann einfach dazu, dass alle Buttons an- oder ausgehen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21210
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCPUSHBUTTON Disablen/enablen [ERLEDIGT]

Beitrag von Manfred »

Hi Tom,

wie schon oben erwähnt, ich muß erstmal schauen, was das alles für Auswirkungen hat. Ich habe ja schon einen Komplex zu GUI umgebaut, der mir aber so noch nicht richtig gefällt. Vielleicht läßt sich ja mit express++ etliches vereinfachen. (wovon ich ausgehe. Es ist halt nur viel Probieren und Lesen dabei.)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten