fraenky
Goto Top

Maximale Ausdehnung von Text mit VBS ermitteln.

Ich brauche für das Layout einer Webseite die maximale Ausdehnung der einzufügenden Texte.

Hallo alle zusammen.

Ich möchte die maximalen Maße von Textblöcken ermitteln.

Das heißt, einmal die maximale Zeilenanzahl pro Textblock mit der Anzeige der ersten Zeile(Titel) und einmal die maximale Zeichenanzahl pro Zeile, ebenfalls mit der Anzeige der ersten Zeile des entsprechenden Textblocks.
Ich kann leider selber nur sehr wenig VBS und möchte hier mal nachfragen, ob mir da jemand weiterhelfen kann.

Dank und Gruß
Fraenky

Content-Key: 69779

Url: https://administrator.de/contentid/69779

Printed on: April 16, 2024 at 09:04 o'clock

Member: bastla
bastla Sep 29, 2007 at 08:54:47 (UTC)
Goto Top
Hallo Fraenky!

Die folgende Version erwartet die Übergabe des Pfades zum Textblock per Parameter (oder per Drag & Drop), wobei eine Überprüfung des übergebenen Dateipfades nicht vorgenommen wird:
sTextBlock = WScript.Arguments(0)
Set fso = CreateObject("Scripting.FileSystemObject")  
Set oTextBlock = fso.OpenTextFile(sTextBlock, 1)
iZeilenNr = 0
iMaxLen = 0
Do While Not oTextBlock.AtEndOfStream
	sZeile = oTextBlock.ReadLine
	iZeilenNr = iZeilenNr + 1
	If iZeilenNr = 1 Then sErg = sZeile 'erste Zeile  
	If Len(sZeile) > iMaxLen Then iMaxLen = Len(sZeile)
Loop
sErg = sErg & vbCrLF & _
	CStr(iZeilenNr) & " Zeile(n), maximale Länge: " & CStr(iMaxLen)  
MsgBox sErg

Grüße
bastla

[Edit] Ausgabetext zur Berücksichtigung einzeiliger Textblöcke auf "Zeile(n)" geändert. [/Edit]
Member: Fraenky
Fraenky Sep 29, 2007 at 10:42:41 (UTC)
Goto Top
Hallo bastla.
Danke für Deine Antwort.
Leider war meine Aufgabenstellung noch nicht 100% beschrieben.
In dem Dokument existieren viele Textblöcke(Lieder).
Um mein Layout möglichst gut zu gestallten, möchte ich die größten Textblocks kennen.
Jeder neue Textblock hat am Anfang eine Zahl, also z.B: "21. Liedtitel" und danach eine Leerzeile. Danach kommen die Strophen, die mit einer Leerzeile getrennt sind.
Am Ende eines jeden Textblocks sind zwei Leerzeilen, eine Ansprungmarke für den nächsten Textblock, z.B: joa21 und noch eine Leerzeile.
Zur Identifizierung eines neuen Textblocks sollte aber die Zahl am Anfang ausreichen.
Zur Ermittlung des Textblocks mit der höchsten Zeilenanzahl reicht mir die Angabe der Zeilen von Zahl zu Zahl, also von Liedanfang zu Liedanfang mit der Ausgabe im Fenster mit Zeilenanzahl und erster Zeile(Liedtitel), also z.B.
124. Liedtitel hat mit 26 Zeilen die meisten Zeilen.
Weiterer Durchlauf zur Ermittlung des Textblocks mit den meisten Zeichen pro Zeile zur Ermittlung der maximalen Breite mit der Ausgabe der Zeichen und der ersten Zeile des entsprechenden Textblocks, also z.B.: 62. Liedtitel hat die Zeile mit den meisten Zeichen(Zeichenanzahl).
Wobei nur ein Fenster auftauchen braucht mit beiden Meldungen zusammengefasst.

Grüße
Fraenky
Member: bastla
bastla Sep 29, 2007 at 12:19:38 (UTC)
Goto Top
Hallo Fraenky!

Leider war meine Aufgabenstellung noch nicht 100% beschrieben.
Nur interessehalber: Wieviel Prozent waren es bereits? face-wink

sTextBlock = WScript.Arguments(0)
Set fso = CreateObject("Scripting.FileSystemObject")  
Set oTextBlock = fso.OpenTextFile(sTextBlock, 1)
iMaxZeilen = 0
sMaxZeilenText = ""  
iMaxLen = 0
sMaxLenText = ""  
iZeilenNr = 0
sAktText = "Vor erstem Block ..."  
Do While Not oTextBlock.AtEndOfStream
	sZeile = oTextBlock.ReadLine
	If sZeile <> "" Then 'keine Leerzeile  
		aZeile = Split(sZeile, " ") 'Zerlegung der Zeile - interessant ist nur der erste Bestandteil.  
		If Right(aZeile(0), 1) = "." Then 'Endet erster Teil der Zeile auf "."?  
			If Len(aZeile(0)) > 1 Then 'Befindet sich vor dem "." noch Text ...  
				If IsNumeric(Left(aZeile(0), Len(aZeile(0) - 1))) Then '... und stellt dieser eine Zahl dar?  
					'Beginn eines neuen Blocks gefunden  
					If iZeilenNr > iMaxZeilen Then 'Für vorigen Block Zeilenanzahl überprüfen ...  
						iMaxZeilen = iZeilenNr
						sMaxZeilenText = sAktText
					End If				
					sAktText = sZeile 'Titel des aktuellen Blocks zwischenspeichern (ev auch nur aZeile(0))  
					iZeilenNr = 0 'Zeilenzähler rücksetzen  
				End If
			End If
		End If
	End If

	iZeilenNr = iZeilenNr + 1 'Zeile auf jeden Fall zählen  

	If Len(sZeile) > iMaxLen Then 'Länge der aktuellen Zeile größer als bisheriges Maximum  
		iMaxLen = Len(sZeile) 'Neues Maximum und ...  
		sMaxLenText = sAktText ' ... Blocktitel speichern.  
	End If
Loop

'Letzten Block überprüfen ...  
If iZeilenNr > iMaxZeilen Then
	iMaxZeilen = iZeilenNr
	sMaxZeilenText = sAktText
End If				

MsgBox "Längster Block mit   " & CStr(iMaxZeilen) & "   Zeilen:" & vbCrLF & _  
	sMaxZeilenText & vbCrLF & vbCrLF & _
	"Block mit längster Zeile (   " & CStr(iMaxLen) & "   Zeichen):" & vbCrLF & _  
	sMaxLenText

Grüße
bastla
Member: Fraenky
Fraenky Sep 29, 2007 at 19:00:31 (UTC)
Goto Top
Hallo bastla.

Hast ja recht. Für mich war die ganze Sache klar.
Eigentlich habe ich nur vergessen zu erwähnen, das die Textblöcke in Absätze unterteilt sind. face-wink

Aber leider habe ich hier noch eine Fehlermeldung:
Zeile 16:
If IsNumeric(Left(aZeile(0), Len(aZeile(0) - 1))) Then
Zeichen 5
Typen unverträglich aZeile(...)
Laufzeitfehler.

Sieht doch aber ganz logisch aus.
Der linke Teil des Splitings wird daraufhin überprüft, ob es eine Zahl ist.
Hier habe ich folgende Änderung vorgenommen:
sTextBlock = "C:\skript2\Max-Textgröße\Hinario.txt"

Grüße
Fraenky
Member: bastla
bastla Sep 29, 2007 at 19:54:19 (UTC)
Goto Top
Hallo Fraenky!

Obwohl das Script nicht gänzlich ungetestet war, enthält die Zeile eine falsche Klammersetzung - so sollte es gehen:
If IsNumeric(Left(aZeile(0), Len(aZeile(0)) - 1)) Then

Würdest Du bei Fehlern möglichst auch die auslösenden Daten, zB durch ein vorgeschaltetes
WScript.Echo sZeile
und Aufruf des Scripts von der Kommandozeile mit
cscript //nologo "C:\Script2\Max-Textgröße\Scriptname.vbs" "C:\skript2\Max-Textgröße\Hinario.txt" 
posten - durch Verwendung von "cscript" ersparst Du Dir, MsgBoxes wegzuklicken ...

Den Parameter "C:\skript2\Max-Textgröße\Hinario.txt" habe ich nur der Ordnung halber angeschrieben - in Deiner Version des Scripts hast Du ja offensichtlich die erste Zeile geändert (wobei der Aufruf dennoch mit Parameterübergabe erfolgen kann - dieser wird im Script dann einfach nicht verwendet).

Grüße
bastla
Member: Fraenky
Fraenky Sep 29, 2007 at 21:32:18 (UTC)
Goto Top
Hallo bastla.

Super, das Script erfüllt mal wieder alle Anforderungen, nur die Anzahl der Zeichen pro Zeile stimmt irgendwie nicht, aber der richtige Block wird auf jeden Fall angezeigt.
Allso alles easy.
Mir ist es eigentlich egal, ob ich ein wscript Fenster schließe oder die Konsole mit cscript. Klick ist Klick.
Und das vorgeschaltete Echo hätte doch in diesem Fall auch nichts gebracht, weil der Fehler mit der Klammer erst in der folgenden Zeile auftauchte, oder?

Danke und Grüße
Fraenky
Member: bastla
bastla Sep 30, 2007 at 03:46:13 (UTC)
Goto Top
Hallo Fraenky!

... ob ich ein wscript Fenster schließe oder die Konsole mit cscript.
Bei einem Klick für das Konsolenfenster und je einem Klick für die MsgBox-Ausgabe der soeben eingelesenen Zeile in der Schleife (wofür das "WScript.Echo" eigentlich gedacht war) gibt es dann vielleicht doch einen gewissen Unterschied ...

... nichts gebracht, weil der Fehler mit der Klammer erst in der folgenden Zeile auftauchte, oder?
Damit hättest Du Recht, wenn der Fehler in jedem Fall (für jede eingelesene Zeile) entstünde, was allerdings nicht der Fall war (zumindest bei den von mir verwendeten Testdaten war kein Fehler gemeldet worden).

Grüße
bastla