StringGadget von ReadOnly zu nicht ReadOnly ändern

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

StringGadget von ReadOnly zu nicht ReadOnly ändern

Beitrag von Kurzer »

Moin Peter, :)

da es im Gegensatz zum EditorGadget für das StringGadget offenbar kein SetGadgetAttribute(..., #PB_String_ReadOnly, #False) gibt, habe ich mich an einer JavaScript Inline Lösung versucht.

So weit so unvollständig.

Das Beschreiben des StringGadgets ist nach dem Aufruf der Prozedur SetReadOnly() möglich. Das Problem ist der Mauszeiger. Er wandelt sich nicht zum Caret-Symbol, wenn ich über das Feld hoovere. Hierzu müsste ich offenbar das class attribute des übergeordneten DIV Elements neu setzen, aber wie ich das mache, dazu habe ich leider nichts passenden gefunden.

Hier der entsprechende Screenshot zu der Problematik. In gelb das ReadOnly StringGadget nach Aufruf meiner Prozedure und in orange ein normales StringGadget ohne ReadOnly Flag.

Die Unterschiede zwischen den übergeordneten DIV Elementen beider Gadgets ist, dass die Klasse des ReadOnly Gadgets noch folgende Werte zusätzlich enthält (in rot markiert): dijitTextBoxReadOnly dijitReadOnly

Wie kommt man an die ID dieses Containers heran, um die class zu ändern?

Bild

Code: Alles auswählen

;		! $("<style>.dijitTextBoxReadOnly { color: #000000; }</style>").appendTo("head");
		
Procedure SetReadOnly(iGadgetNr, iReadOnly)
	Protected.i gadid = GadgetID(iGadgetNr)
	If iReadOnly = #False
		!v_gadid.gadget.textbox.readOnly=false;
	Else
		!v_gadid.gadget.textbox.readOnly=true;
	EndIf
EndProcedure

If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	StringGadget(0, 8,  10, 306, 20, "Normal StringGadget...")
	StringGadget(1, 8,  35, 306, 20, "1234567", #PB_String_Numeric)
	StringGadget(2, 8,  60, 306, 20, "Read-only StringGadget", #PB_String_ReadOnly)
	StringGadget(3, 8,  85, 306, 20, "lowercase...", #PB_String_LowerCase)
	StringGadget(4, 8, 110, 306, 20, "uppercase...", #PB_String_UpperCase)
	StringGadget(5, 8, 140, 306, 20, "Borderless StringGadget", #PB_String_BorderLess)
	StringGadget(6, 8, 170, 306, 20, "Password", #PB_String_Password)
	
	SetReadOnly(2, #False)
	; SetGadgetAttribute(2, #PB_String_ReadOnly, #False)
	
EndIf
Gruß Markus

PS: Wenn ich alle offenen Punkte gelöst habe, die ich für das Projekt klären muss, wird es hier auch wieder ruhiger.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadget von ReadOnly zu nicht ReadOnly ändern

Beitrag von Kiffi »

Moin Markus,

ich habe es mal als SetGadgetAttributeEx() realisiert. Könnte man bei Bedarf für SetGadgetAttributes erweitern, die SB nativ nicht anbietet.

Code: Alles auswählen

Procedure SetGadgetAttributeEx(Gadget, Attribute, Value)
  
  Protected GID = GadgetID(Gadget)
  
  Select Attribute
    Case #PB_String_ReadOnly
        ! dijit.byId(v_gid.gadget.id).set("readOnly", (v_value == true));
  EndSelect
  
EndProcedure

; Aufruf:
SetGadgetAttributeEx(2, #PB_String_ReadOnly, #False)
Grüße ... Peter
Hygge
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: StringGadget von ReadOnly zu nicht ReadOnly ändern

Beitrag von Kurzer »

Vielen Dank Peter! :praise:

Ich hatte mittlerweile mit folgenden Konstrukten erfolglos mein Glück versucht.

Code: Alles auswählen

		!v_gadid.gadget.textbox.readOnly=false;
		!v_gadid.gadget.textbox.classList.add('Banane');
		!v_gadid.gadget.textbox.parentElement.classList.add('Banane2');
		;!v_gadid.gadget.textbox.parentElement.parentElement.role="ignored";
		!v_gadid.gadget.textbox.parentElement.parentElement.classList.add('Banane3'); // Nur zum checken, ob ich am richtigen Element gelandet bin.
 		!v_gadid.gadget.textbox.parentElement.parentElement.classList.remove('dijitTextBoxReadOnly');
 		!v_gadid.gadget.textbox.parentElement.parentElement.classList.remove('dijitReadOnly');
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Antworten