🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst ✔] Fragen zur IDE und Ergänzungen zur Behandlung von Doppelklick … [5 Fragen + 1 "Nachschlag"]

Alles zur Programmierung im LibreOffice.
nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

[gelöst ✔] Fragen zur IDE und Ergänzungen zur Behandlung von Doppelklick … [5 Fragen + 1 "Nachschlag"]

Beitrag von nitja » Fr 29. Mär 2024, 11:52

… Letzteres jetzt doch mit Beispiel-.ods-datei. ¹⁾

Frage 1: (Wie) Kann ich die IDE dazu bringen, statt der als Standard für die "Dokumente" verwendeten Proportionalschrift eine dicktengleiche zu nutzen?
Frage 2: (Wie) Kann ich die in der IDE verwendete Tabulator-Größe ändern?

Beides führt dazu, dass der Code in meinem UI ganz anders formatiert wird als hier innerhalb eines <code-tags> und es heftige Überarbeitung des "White-Space" braucht, um ihn hier einigermaßen lesbar einzustellen.
Wie die LO-Fenster auf meinem Bildschirm aussehen, zeigen die angefügten Bilder einer kleinen Tabelle und der Ansicht des enthaltenen Codes in der IDE.

Die Beispiel-Datei ist nun doch der (stark reduzierte/verkleinerte) Nachbau des eigentlichen Projekts. Hatte ich auf mich genommen, nachdem ich (wieder einmal) einige Tage stecken geblieben war, hier nach einer Lösung fragen wollte und dann doch in dem sehr verkleinerten (vereinfachten) Umfeld selbst darauf gekommen bin.

Das Layout der Tabelle(n) und einiger spezieller Zeichen in strings (auch im Code) hängt wahrscheinlich stark von der Verfügbarkeit der in den Tabellen verwendeten Schrift ab. Vermutlich zeigt sich das Layout heftig zerschossen, wenn …
Noto Sans Condensed und Noto Sans Symbols 2 fehlen.

Und hier der Code:

Code: Alles auswählen

REM  *****  BASIC  *****

option explicit

const sMonthTmplt="99·99"
dim isInitd as boolean,oDoc as object,oCtrlr as object,oDataSht as object,oCrsr as object
dim lRow as integer,oRecs as object,nRecs as integer,hasNewRec as boolean,hasGaps as boolean,bNewRec as boolean
dim iCol as integer,iRow as integer
dim vTest'																																						⚒🌩💢

sub test
'	dim <local variables>
'	processing:
	stop
end sub 'test

sub onActivate
	if not isInitd then doInit
	vTest=oDoc.getCurrentSelection
   	oDataSht.getCellByPosition(1,lRow).setValue(day(now)+timevalue(now))
	doSlct(array(2,lRow)) : stop'																													stop for maual input
end sub 'onActivate

sub doInit
	if isInitd then exit sub
	oDoc=thisComponent
	oCtrlr=oDoc.getCurrentController
	oDataSht=oDoc.Sheets.getByIndex(1)
	oCrsr=oDataSht.createCursorByRange(oDataSht.getCellRangeByPosition(0,0,0,0))
	oCrsr.collapseToCurrentRegion
	lRow=oCrsr.RangeAddress.EndRow
	hasNewRec=(oDataSht.getCellByPosition(0,lRow).string=" 🖎")'												hasNewRec: .string=" 🖎""  - otherwise "✔"
	nRecs=oDataSht.getCellByPosition(0,1).value'																				# of complete records (data rows)
	hasGaps=lRow-nRecs-1+hasNewRec
	isInitd=True
	if hasGaps then doFillGaps'																													incl. stop for maual input
	if not(hasNewRec)  then doMakeNewRec
end sub 'doInit

sub doSlct(aRng,optional vActiv)
	dim oRng as object
	if not isInitd then doInit
	if ubound(aRng)=1 then oCtrlr.select(oDataSht.getCellByPosition(aRng(0),aRng(1)))
	oRng = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	if isMissing(vActiv) then oCtrlr.Select(oRng)
end sub 'doSlct

sub doFillGaps
	if not isInitd then doInit
	with oDataSht
		for iRow=2 to lRow
			if .getCellByPosition(0,iRow).string=" 🖎" then exit for
		next 'iRow
		for iCol=2 to 5
			if 0=.getCellByPosition(iCol,iRow).type then exit for
		next 'iCol
		doSlct(array(iCol,iRow)) : stop'																												stop for maual input
	end with 'oDataSht
end sub 'doFillGaps

sub doMakeNewRec
    if not isInitd then doInit
    if Format(Date,"yy·mm")<>oDataSht.Name then NewMonth
    with oDataSht
    	iRow=lRow+1
    	.getCellByPosition(0,iRow).setFormula("=COUNTBLANK(C" & iRow+1 & ":F" & iRow+1 & ")=0")
    	.getCellByPosition(5,iRow).setFormula("=IF(ISBLANK(E" & iRow+1 & ");CHAR(24);" & 1-.value & ")")
		.getCellByPosition(7,iRow).setFormula("=IF(E"& iRow+1 &";IF(F"& iRow+1 &";-99;E"& iRow+1 &");-99)")
		.getCellByPosition(8,iRow).setFormula("=IF(E"& iRow+1 &";IF(F"& iRow+1 &";E"& iRow+1 &";-99);-99)")
	end with
	hasNewRec=true
end sub 'doMakeNewRec

function onDblClk(oCell as object) as boolean
	dim oRng as object
	if not isInitd then doInit
	onDblClk=true'																																		intercept system event
	if Format(Date,"yy·mm")<>oDataSht.Name then NewMonth
	oRng=oCell.RangeAddress
	iCol=oRng.EndColumn : iRow=oRng.EndRow
	select case iCol
	case 0 : oDataSht.getCellByPosition(1,iRow).setValue(day(now)+timevalue(now)) : iCol=2
	case 5
    	with oDataSht.getCellByPosition(5,iRow)
    		.setFormula("=IF(ISBLANK(E" & iRow+1 & ");CHAR(24);" & 1-.value & ")") ' 						=IF(ISBLANK(E3);CHAR(24);1) or =IF(ISBLANK(E3);CHAR(24);0)
    	end with 'oDataSht.getCellByPosition(5,iRow)
	end select' case iCol
	doSlct(array(iCol,iRow)) : stop'																												stop for maual input
end function 'onDblClk

sub NewMonth
	if not isInitd then doInit
	oDoc.Sheets.copyByName(sMonthTmplt, Format(Date,"yy·mm"), 1)
	oDataSht=oDoc.Sheets.getByIndex(1)
	'oCtrlr.setActiveSheet(oDataSht)
	with oDataSht
		.getCellByPosition(0,0).setString(Format(Date,"yyyy"))
		.getCellByPosition(1,0).setString(Format(Date,"mmm"))
	end with
end sub 'NewMonth

¹) D…! .ods-Datei ist zu groß! (33MB - erscheinen mir nun wirklich nicht "groß")
ok, dann eben hier: https://www.dropbox.com/scl/fi/wi7wtx1e ... 173en&dl=0
Dateianhänge
Bildschirmfoto vom 2024-03-29 11-02-43.png
Bildschirmfoto vom 2024-03-29 11-02-43.png (137.87 KiB) 2318 mal betrachtet
Bildschirmfoto vom 2024-03-29 11-00-39.png
Bildschirmfoto vom 2024-03-29 11-00-39.png (31.07 KiB) 2318 mal betrachtet
Zuletzt geändert von nitja am Sa 6. Apr 2024, 11:46, insgesamt 5-mal geändert.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick …

Beitrag von nitja » Fr 29. Mär 2024, 16:19

Inzwischen bin ich noch über 2 Details gestolpert:

Frage 3: (Wie) Kann ich in der IDE den "whitespace" (tabs & spaces) sichtbar/unterscheidbar machen?

Einiges von dem Chaos, das beim Kopieren des Code in das <code>-tag hier drinnen entstand aus der (versehentlichen) "Verwechselung" von 4 spaces mit 1 tab.
Habe ich erst gesehen, nachdem ich den Code in eine .bas exportiert und diese dann in Geany geöffnet hatte.
(Ich kenne keinen halbwegs ernst zu nehmenden (Text-)Editor, der keine Option dafür hat und kann mir nicht vorstellen, dass die IDE sie verloren hat. Ich finde sie aber nicht mehr.)

Im Code muss die Zeile 67 ersetzt werden mit:

Code: Alles auswählen

		with .getCellByPosition(5,iRow)
			.setFormula("=IF(ISBLANK(E" & iRow+1 & ");CHAR(24);" & 1-.value & ")") ' 														=IF(ISBLANK(E3);CHAR(24);1) or =IF(ISBLANK(E3);CHAR(24);0)
		end with '.getCellByPosition(5,iRow)
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick …

Beitrag von mikele » So 31. Mär 2024, 11:30

Hallo,
zu Frage 1: siehe ->Extras->Optionen->LibreOfiice->Schriftarten
zu Frage 2: meines Wissens geht das nicht
zu Frage 3: das geht (auch) nicht. Für eine halbwegs saubere Einrückung kannst du allerdings den Bereich markieren und dann mit Tab einrücken bzw. mit Shift+Tab Einrückungen beseitigen (egal ob per Leerzeichen oder Tabulator).
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick …

Beitrag von mikele » So 31. Mär 2024, 12:17

Hallo,
noch eine Anmerkung: die datei ist deshalb so groß, weil in u. a. die Schriftarten
Font_Noto_Sans_CJK_SC_1.ttf
Font_Noto_Sans_CJK_SC_2.ttf
eingebettet sind.
Wenn du in den Datei-Eigenschaften die Einbettung asiatischer und komplexer Schrftarten deaktivierst (es sei denn du benötigst sie zwingend), wird die Datei erheblich kleiner.
Gruß,
mikele

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick …

Beitrag von nitja » So 31. Mär 2024, 13:55

Dann bin ich mir wenigstens halbwegs sicher, dass Ihr die Dateien genauso seht wie ich hier.
mikele hat geschrieben:
So 31. Mär 2024, 12:17
Wenn du in den Datei-Eigenschaften die Einbettung asiatischer und komplexer Schrftarten deaktivierst (es sei denn du benötigst sie zwingend), wird die Datei erheblich kleiner.
Guter Tipp, Dank Dir!
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick …

Beitrag von nitja » So 31. Mär 2024, 14:03

In Bezug auf die Einstellungen für die Optik der IDE bin ich freilich nicht weiter gekommen, schwindet die Zuversicht dafür eine Lösung zu finden.
… dabei aber auf eine neue Frage dazu (der IDE) gestolpert:
Frage 4: (Wie) Kann ich den Text im Fenster des aktuellen Moduls per Makro (aus dem selben Modul) ändern, etwa um Kommentare (Beispiel "Stand vom <aktuelle Zeit>) automatisch zu aktualisieren?
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick … [Frage 1 gelöst]

Beitrag von nitja » Mo 1. Apr 2024, 12:46

Frage 1 (dicktengleiche Schrift in der IDE) hat sich gerade gelöst!
Erscheint als bug in LOs UI
(Extras»Optionen»LibreOffice»Schriftarten»Schrift-Einstellungen für HTML-, Basic- und SQL-Quelltexte):
Der Haken in check box "Nur nicht proportionale Schriftarten" darf nicht gesetzt sein.
(Das "nicht" im label ist wohl ein bug.)
Dann (und nur dann) kann ich in der drop-down-box "Schriftarten" Mono-Fonts wählen. →
→ und das Chaos bei der Formatierung (z.B. für das Forum oder Geany) ist (zu) vergessen.

Code: Alles auswählen

REM  *****  BASIC  *****

option explicit

'	by: nitja	last update: 24·04·01	status: in progress, 1 identified 💢bug⚒, 1 complement pending
'	called by:			system events in the current data sheet
'	calls (outside of this module):	nothing, so far - adjust graph for new month pending

const sMonthTmplt="99·99"
dim isInitd as boolean,oDoc as object,oCtrlr as object,oDataSht as object,oCrsr as object
dim lRow as integer,nRecs as integer,hasNewRec as boolean,hasGaps as boolean
dim iCol as integer,iRow as integer
dim vTest '														⚒🌩💢

sub test
'	dim <local variables>
'	processing:
	stop
end sub 'test

sub onActivate
'	called by:	system event	triggered:	mannually or by doInit»NewMonth
	if not isInitd then doInit
	oDataSht.getCellByPosition(1,lRow).setValue(day(now)+timevalue(now))
	doSlct(array(2,lRow)) : stop '											stop for maual input
end sub 'onActivate

sub doInit
	if isInitd then exit sub
	oDoc=thisComponent
	oCtrlr=oDoc.getCurrentController
	oDataSht=oDoc.Sheets.getByIndex(1)
	oCrsr=oDataSht.createCursorByRange(oDataSht.getCellRangeByPosition(0,0,0,0))
	oCrsr.collapseToCurrentRegion
	lRow=oCrsr.RangeAddress.EndRow
	hasNewRec=(oDataSht.getCellByPosition(0,lRow).string=" 🖎") '							hasNewRec: .string=" 🖎""  - otherwise "✔""
	nRecs=oDataSht.getCellByPosition(0,1).value '									# of complete records (data rows)
	hasGaps=lRow-nRecs-1+hasNewRec
	isInitd=True
	if hasGaps then doFillGaps '											incl. stop for maual input
	if Format(Date,"yy·mm")<>oDataSht.Name then NewMonth ' 💢 must not be called, if the sheet already exists! ⚒ would deny access to older data sheets
	if not(hasNewRec) then doMakeNewRec
end sub 'doInit

sub doSlct(aRng,optional vActiv)
	dim oRng as object
	if not isInitd then doInit
	if ubound(aRng)=1 then oCtrlr.select(oDataSht.getCellByPosition(aRng(0),aRng(1)))
	oRng=oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	if isMissing(vActiv) then oCtrlr.Select(oRng)
end sub 'doSlct

sub doFillGaps
	with oDataSht
		for iRow=2 to lRow
			if .getCellByPosition(0,iRow).string=" 🖎" then exit for
		next 'iRow
		for iCol=2 to 5
			if 0=.getCellByPosition(iCol,iRow).type then exit for
		next 'iCol
		doSlct(array(iCol,iRow)) : stop '									stop for maual input
	end with 'oDataSht
end sub 'doFillGaps

sub doMakeNewRec
	with oDataSht
		lRow=lRow+1 : iRow=lRow
		.getCellByPosition(0,iRow).setFormula("=COUNTBLANK(C" & iRow+1 & ":F" & iRow+1 & ")=0") '		=COUNTBLANK(C25:F25)=0
		with .getCellByPosition(5,iRow)
			.setFormula("=IF(ISBLANK(E" & iRow+1 & ");CHAR(24);" & 1-.value & ")") '			=IF(ISBLANK(E3);CHAR(24);…1⇌0…) 
		end with '.getCellByPosition(5,iRow)
		.getCellByPosition(7,iRow).setFormula("=IF(E"& iRow+1 &";IF(F"& iRow+1 &";-99;E"& iRow+1 &");-99)") '	=IF(E25;IF(F25;-99;E25);-99)
		.getCellByPosition(8,iRow).setFormula("=IF(E"& iRow+1 &";IF(F"& iRow+1 &";E"& iRow+1 &";-99);-99)") '	=IF(E25;IF(F25;E25;-99);-99)
	end with
	hasNewRec=true : doSlct(array(2,lRow)) 
end sub 'doMakeNewRec

function onDblClk(oCell as object) as boolean
	dim oRng as object
	if not isInitd then doInit
	onDblClk=true '													intercept system event
	oRng=oCell.RangeAddress
	iCol=oRng.EndColumn : iRow=oRng.EndRow
	select case iCol
	case 0 : oDataSht.getCellByPosition(1,iRow).setValue(day(now)+timevalue(now)) : iCol=2
	case 5
		with oDataSht.getCellByPosition(5,iRow)
			.setFormula("=IF(ISBLANK(E" & iRow+1 & ");CHAR(24);" & 1-.value & ")") ' 			=IF(ISBLANK(E3);CHAR(24);…1⇌0…) 
		end with 'oDataSht.getCellByPosition(5,iRow)
	end select 'case iCol
	doSlct(array(iCol,iRow)) : stop '										stop for maual input
end function 'onDblClk

sub NewMonth
	oDoc.Sheets.copyByName(sMonthTmplt, Format(Date,"yy·mm"),1)
	oDataSht=oDoc.Sheets.getByIndex(1)
	with oDataSht
		.getCellByPosition(0,0).setString(Format(Date,"yyyy"))
		.getCellByPosition(1,0).setString(Format(Date,"mmm"))
	end with 'oDataSht
	lRow=2
	oCtrlr.setActiveSheet(oDataSht)
end sub 'NewMonth
Na ja, in Bezug auf das Forum bisschen zu früh, bzw. zu sehr gefreut:
Dafür wäre dann doch auch die Lösung der Frage 2 (die in der IDE verwendete Tabulator-Größe ändern) relevant.
Musste den Inhalt des <code>-tags doch wieder manuell anpassen (tabs löschen).
Da mir die hier verwendeten Riesen-Tabs (8! spaces Länge) für die Arbeit in der IDE unerträglich wären, erübrigt sich die Frage 2.
Für einen möglichen Export in Reintext (à la [Basic exportieren]) und die Ersetzung der tabs durch je 4 spaces fehlt mir die Lösung der Frage 4 von gestern Mittag re. Zugriff auf den Inhalt der IDE per Makro, die mir mittlerweile zum dringendsten Anliegen avanciert ist.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick … [Frage 1 gelöst]

Beitrag von mikele » Mo 1. Apr 2024, 14:42

Hallo,
man kann den Basicquelltext per Makro verändern (sprich Module schreiben/ändern).

Code: Alles auswählen

Sub makro_zeitstempel
	Dim oLib as object
	Dim sMod as String, sNeu as String
	Dim aMod()
	
	'Zugriff auf die Bibliothek "Beispiel" im aktuellen Dokument
	oLib=BasicLibraries.getByName("Beispiel")
	'Auslesen des Basic-Code im Modul "Data" als String
	sMod=oLib.getByName("Data")
	'Zerlegen in einzelne Absätze/Codezeilen
	aMod=split(sMod,chr(10))
	'Ändern der Codezeile 1
	aMod(0)="REM Stand vom " & now()
	'Zusammenfügen der Codezeilen zu einem String
	sNeu=join(aMod,chr(10))
	'Ersetzen des Moduls
	oLib.replaceByName("Data", sNeu)
	'Speichern der Bibliotheken
	BasicLibraries.storeLibraries
	
	'
	'Beachte: der geänderte Code wird erst bei Neustart der IDE sichtbar
	'
End Sub
Dieses Makro muss sich in einem anderen Modul befinden.
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick … [Frage 1 gelöst]

Beitrag von mikele » Mo 1. Apr 2024, 14:51

Hallo,
Da mir die hier verwendeten Riesen-Tabs (8! spaces Länge) für die Arbeit in der IDE
Das Problem kann ich nicht wirklich nachvollziehen. In der Anzeige hier im Forum erscheint ein Tab zwar wie 8 Leerzeichen, beim Kopieren eines solchen Quelltextes in die IDE ist es aber wieder nur ein Tab, da kommt bei mir keine optische Verwirrung auf. Am wichtigsten erscheint mir (egal welche Schriftart), dass konsequent mit Tabulatoren (und nicht mit Leerzeichen) eingerückt wird.
Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2536
Registriert: Fr 10. Dez 2010, 10:01

Re: Fragen zur IDE (Schrift, Tab-Größe) und Ergänzungen zur Behandlung von Doppelklick … [Frage 1 gelöst]

Beitrag von karolus » Mo 1. Apr 2024, 16:06

mikele hat geschrieben:
Mo 1. Apr 2024, 14:51
Am wichtigsten erscheint mir (egal welche Schriftart), dass konsequent mit Tabulatoren (und nicht mit Leerzeichen) eingerückt wird.
Nein, das gerade nicht…
Ein <tab> hat keine definierte Breite.
Es obliegt daher komplett der jeweiligen Software wie breit ein <tab> dargestellt wird.

Die gängige Praxis bei vernünftig eingestellten Texteditoren ( inklusive IDEs )ist es, die <tab>-eingabe direkt durch <4Leerzeichen> zu ersetzen, die dumme Basic-IDE kann das leider nicht.

@nitja: Du kannst in der Basic-IDE durchaus mit der <tab>taste einrücken, du solltest die aber jeweils bei Gelegenheit umwandeln in Leerzeichen
⇒bearbeiten⇒Suchen und ersetzen:
suche: ersetzen durch

Code: Alles auswählen

»    «
⇑ohne die »«
[x]reguläre Ausdrücke
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten