Hilfe bei Makro: InputBox, Abfrage 'Abbrechen'

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Scandal
*
Beiträge: 10
Registriert: Mi, 30.06.2004 16:15
Wohnort: Niedersachsen, nahe Hannover

Hilfe bei Makro: InputBox, Abfrage 'Abbrechen'

Beitrag von Scandal »

Hi Leute,

kann mir jemand helfen, folgendes Makro zum Laufen zu bringen?
Ich möchte bei einer InputBox die Schaltfläche 'Abbrechen' abfragen, aber ich finde die dazu nötige Methode einfach nicht heraus...

InputVal = InputBox("Bitte geben Sie das Passwort ein:", "Passwortabfrage")
If InputVal = passthrough Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Exit Sub
End If
If InputVal = password Then
Cell.String = "aktiv"
Sheet2.IsVisible = True
Else
Beep
MsgBox ("Falsches Passwort !", 48, "Passwortabfrage")
Exit Sub
End If

Vielen Dank im Voraus :)

Scandal

PS: Was muss ich tun, um einen Makrocode richtig anzeigen zu lassen?
Packen wir's an :)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Code: Alles auswählen

Sub abfrage_passwort

Dim InputVal as String
Dim password as String
Dim fehler
Dim hinweis as String
Dim Cell as object
Dim Sheet2 as object

'========================
hinweis = "Bitte geben Sie das Passwort ein:"
'
'hier Passwort vorgeben
password = "DeinPasswort"
'
'hier Zelle und Tabellenblatt initialisieren
'Beispiel:
Sheet2 = stardesktop.currentcomponent.Sheets().getByName("Tabelle2")
'Zelle A1 auf erstem Tabellenblatt
Cell = stardesktop.currentcomponent.Sheets(0).getCellByPosition(0,0)
'========================

Do
InputVal = InputBox(hinweis, "Passwortabfrage", "<Passwort>") 
If InputVal = password Then 
		Cell.String = "aktiv" 
		Sheet2.IsVisible = True 
		Exit Do
	Else 
		'InputBox abgebrochen
		if InputVal = "" Then Exit Do
End If
hinweis = "Falsches Passwort!" & Chr(13) _
		& "Bitte geben Sie das richtige Passwort ein." 
fehler = 1
Loop While fehler = 1

'hier weiterer Code bei Bedarf

End Sub
Hinweis:
Eine definierte Abfrage der Schaltfläche 'Abbrechen' der InputBox ist bei Starbasic NICHT möglich. Ausgewertet als Ereignis für 'Abbrechen' wird der Leerstring "". Falls das Abbrechen-Ereignis definiert von der Eingabe eines Leerstring unterschieden werden muß mußt Du einen Basic-Dialog verwenden.
Was muss ich tun, um einen Makrocode richtig anzeigen zu lassen?
markiere den Code und drücke Schaltfläche Code


Gruß
Stephan
Scandal
*
Beiträge: 10
Registriert: Mi, 30.06.2004 16:15
Wohnort: Niedersachsen, nahe Hannover

Beitrag von Scandal »

Hi Stephan,

erstmal vielen Dank für deine Mühe :)
Ich habe mich etwas ungenau ausgedrückt, denn ich brauchte keine Hilfe um das Makro lauffähig zu bekommen - ist auch nur ein kleiner Auszug aus einem größeren Makro gewesen.
Das Makro an sich funktioniert problemlos, leider stört mich und die Leute, für die ich es geschrieben habe, die quasi Funktionslosigkeit der 'Abbrechen'-Taste. Das Programm interpretiert diese Taste einzig als 'Ok' und nicht zum Abbruch des Makros, so wie es eigentlich sein müsste...

Und es gibt wirklich keinen Weg? Den einzigen, den ich noch wüsste, wäre eine Maske mit Eingabefeld, 'Ok' und 'Abbrechen' zu erstellen. Das habe ich auch schon getan, ist aber meiner Meinung nach ein ziemlich großer Aufriss für eine einfache Passwortabfrage.

Vielen Dank 8)

Scandal
Packen wir's an :)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ich habe mich etwas ungenau ausgedrückt, denn ich brauchte keine Hilfe um das Makro lauffähig zu bekommen - ist auch nur ein kleiner Auszug aus einem größeren Makro gewesen.
Das Makro an sich funktioniert problemlos, leider stört mich und die Leute, für die ich es geschrieben habe, die quasi Funktionslosigkeit der 'Abbrechen'-Taste. Das Programm interpretiert diese Taste einzig als 'Ok' und nicht zum Abbruch des Makros, so wie es eigentlich sein müsste...
Du hast Dich nicht ungenau ausgedrückt, aber die ABBRECHEN-Schaltfläche funktioniert doch mit meinem Makro genau so wie Du es willst. Der Code:

InputVal = InputBox(hinweis, "Passwortabfrage", "<Passwort>")

ergibt für Drücken auf die Schaltfläche ABBRECHEN:

InputVal = ""

das wird dann hier ausgewertet:

if InputVal = "" Then Exit Do

und falls InputVal tatsächlich "" ist wird abgebrochen. Falls das Exit Do stört (tut es nicht wenn Du mein vorgegebenes Makro verwendest) kannst Du es prinzipiell durch Exit sub ersetzen.

Mein Code ist so geschrieben das der Nutzer in der Do-While-Schleife gehalten wird solange er kein richtiges Passwort eingibt ODER ABBRICHT. Das habe ich nur deshalb so gemacht, weil Deine Lösung mit der MsgBox etwas unelegant ist. Prinzipiell spricht nichts gegen die MsgBox wenn Du das so haben willst.

Nochmals: das prinzipielle Problem ist nur das sowohl Drüchen der Schaltfläche ABBRECHEN als auch Eingabe von "" und Drücken von OK den selben Wert für InputVal nämlich = "" liefern. Für eine Passwortabfrage ist das jedoch meiner Meinung nach völlig ohne Relevanz das es ja nur mit dem Passwort "" Probleme gäbe (jedes beliebige andere Passwort funktioniert). Oder willst Du wirklich den Leerstring als Passwort benutzen? Falls Du das willst ist die einzige Möglichkeit genau das was Du schreibst:
Den einzigen, den ich noch wüsste, wäre eine Maske mit Eingabefeld, 'Ok' und 'Abbrechen' zu erstellen.
Ich weiß das es in VBA möglich ist zwischen Leerstring und ABRECHEN explizit zu unterscheiden, in Starbasic geht das (derzeitig) noch nicht.

Sollte ich immer noch falsch liegen, frage gerne nochmal nach.


Gruß
Stephan
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Mhhh, da fehlt ja noch ein bisschen mehr

Beitrag von Niels »

Die Starbasicentwickler haben da auch scheinbar überhaupt nicht an das Thema Passworteingabe gedacht, denn man kann die Eingabe ja nicht verdeckt vornehmen. Das wäre ja meine erste Stolperfalle gewesen.

Ciao
Niels
Scandal
*
Beiträge: 10
Registriert: Mi, 30.06.2004 16:15
Wohnort: Niedersachsen, nahe Hannover

Beitrag von Scandal »

Hi,

noch einmal vielen Dank für deine Mühe, Stephan.

Ich sehe momentan ebenfalls nur die Möglichkeit einer Do-While-Schleife, und einen Leerstring als Abbruchsignal... Das ist trotzdem etwas unelegant, weil die Schaltfläche 'Abbrechen' immer als 'Ok' gewertet wird - also z.B. Passwort eingeben und 'Abbrechen' drücken ergibt immer eine Bestätigung anstatt einen Abbruch...
Man kann halt nicht alles haben :)

Viele Grüße

Scandal
Packen wir's an :)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

@Niels
Die Starbasicentwickler haben da auch scheinbar überhaupt nicht an das Thema Passworteingabe gedacht, denn man kann die Eingabe ja nicht verdeckt vornehmen. Das wäre ja meine erste Stolperfalle gewesen.


Ich habe mal hier schnell etwas zusammengeschrieben, was im Prinzip funktioniert, aber noch nicht perfekt (und noch nicht komplett) ist. Mache Dir einen Basic-Dialog names "PASSWORT" dort ein Textfeld namens "feld" und ordne das Makro "passwordfeld" dem Ereignis 'taste loslassen' des textfeldes zu:

Code: Alles auswählen

Dim oDialog1 AS Object 
Dim oForm As Object
Dim versteckt
Dim offen

Sub StartDialog1 
oForm = DialogLibraries.Standard.PASSWORT
oDialog1 = CreateUnoDialog( oForm )
oDialog1.execute
end sub 

Sub passwortfeld
inhalt = oDialog1.GetControl("feld")
offen = offen & Right(inhalt.text,1)
versteckt = versteckt & "*"
inhalt.text = versteckt
'msgbox offen
End Sub 
Es bleibt natürlich das Problem das das Vergleichspasswort zunächst offen im Code stünde und Du nur das Modul schützen kannst. Der Passwortschutz bei MS-Office ist allgemein relativ leicht zu brechen, da jedoch der Quellcode von OpenOffice offen liegt sollte es möglich sein herauszubekommen wie stark die implementierten Schutzmaßmahmen sowohl für Dokumente allgemein als auch für Module sind. Sonst müßte man es mal mit externen "PlugIns" versuchen, das ist z.B. das Mittel der Wahl um Access-Datenbanken (zumindest bis Version 2000) zu schützen ohne sich allein auf die in Access implementierten Mechanismen zu verlassen.


@Scandal

Ich habe das Thema InputBox hier im Forum schon in einem anderen Thread diskutiert und ich bin mit Dir einer Meinung das der Leerstring zum Erkennen des Abbruchs möglicherweise ungünstig gewählt ist.

ABER was bedeutet denn das hier:
Das ist trotzdem etwas unelegant, weil die Schaltfläche 'Abbrechen' immer als 'Ok' gewertet wird - also z.B. Passwort eingeben und 'Abbrechen' drücken ergibt immer eine Bestätigung anstatt einen Abbruch...
Was ist denn in diesem Sinne Dein Kriterium um zwischen 'OK' und 'Abbrechen' zu unterscheiden?

InputBox ist eine ("festverdrahtete") Funktion in Starbasic, eine solche Funktion liefert jedoch einen Rückgabewert. Wie müßte denn dieser Rückgabewert beschaffen sein, das er keine Bestätigung darstellt bzw. warum bist Du der Meinung das jede Rückgabe von InputBox eine Bestätigung darstellt?

Um nicht falsch verstanden zuwerden:
Natürlich ist das Ganze als Makro lösbar. Aber ich weiß nicht wie das als Funktion gehen soll, denn diese kann doch höchstens die Information zurückgeben das ein Ereignis stattgefunden hat, jedoch nicht das Ereignis selbst. Oder liege ich da falsch?


Gruß
Stephan
Scandal
*
Beiträge: 10
Registriert: Mi, 30.06.2004 16:15
Wohnort: Niedersachsen, nahe Hannover

Beitrag von Scandal »

Hi Stephan,

ich meine damit, dass User gewöhnt sind, durch die Schaltfläche 'Abbrechen' einen Abbruch des Makros hervorzurufen.

Wenn ein User quasi aus Versehen eine Schaltfläche in der Tabelle anklickt, die den Sinn hat, Referenzbereiche für Berechnungen sichtbar zu machen bzw. frei zu schalten, er dafür aber das nötige Passwort nicht kennt, kann er den Dialog einzig abbrechen, indem er einen Leerstring eingibt.

Natürlich ist klar, dass er, nachdem er zum Xten mal das falsche Passwort eingegeben hat und immer wieder zum Dialog zurückkehren muss, irgendwann einmal einen Leerstring stehen läßt und dadurch zum Abbruch des Dialoges gelangt.

Die Diskussion um die 'Abbrechen'-Schaltfläche klingt für mich auch wie Kleinkram, und ich kann mich damit auch abfinden, mein Chef jedoch nicht...
Laut ihm muss sich ein Programm immer selbst erklären, was grundsätzlich ja auch richtig ist. Wenn es also eine 'Abbrechen'-Schaltfläche gibt, erwartet er, dass diese augenblicklich auch zu einem Abbruch führt.

Wie gesagt kann ich mich mit dem Leerstring problemlos abfinden, mein Geldgeber aber leider nicht :?

Viele Grüße

Scandal
Packen wir's an :)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Scandal,

ich war zunächst über Deine "Sturheit" verärgert, habe jetzt jedoch nachgedacht und mir kam der Einfall das Du mit:
ich meine damit, dass User gewöhnt sind, durch die Schaltfläche 'Abbrechen' einen Abbruch des Makros hervorzurufen.


vielleicht meinst das die InputBox nicht automatisch schließt (ohne das dazu im Code Anweisungen nötig wären) wenn der Nutzer auf ABBRECHEN klickt, in dem Sinne wie das z.B. bei MsgBox mit der OK-Schaltfläche ist.
Trifft meine Vermutung zu?

Falls ja solltest Du aber verstehen, das damit in keinem der Fälle das Makro beendet wird sondern nur der Dialog geschlossen, z.B.:

Code: Alles auswählen

sub test
msgbox "test"
'kommt hier noch irgendwelcher Code wird er
'nach dem Schließen der MsgBox mit OK
'noch ausgeführt
end sub
Außerdem ist es doch für einem reinen Benutzer irrelevant, wie Dein Code aufgebaut ist solange nur die Funktion des Ganzen in Ordnung ist.
Wenn ein User quasi aus Versehen eine Schaltfläche in der Tabelle anklickt, die den Sinn hat, Referenzbereiche für Berechnungen sichtbar zu machen bzw. frei zu schalten, er dafür aber das nötige Passwort nicht kennt, kann er den Dialog einzig abbrechen, indem er einen Leerstring eingibt.

Natürlich ist klar, dass er, nachdem er zum Xten mal das falsche Passwort eingegeben hat und immer wieder zum Dialog zurückkehren muss, irgendwann einmal einen Leerstring stehen läßt und dadurch zum Abbruch des Dialoges gelangt.


Wenn Du das von mir gepostete Makro verwendest wird dieses Problem definitiv nicht auftreten. Ich habe in dem entsprechenden Post darauf hingewiesen das Du auch 'Exit Do' durch 'Exit sub' ersetzen kannst. Aber für das Makro ist das im konkreten Fall nicht einmal notwendig.
Es gibt also keine Gefahr der Fehlbedienung durch den Nutzer wie Du sie vermutest. Du mußt bei Verwendung meines Codes auch keinen Leerstring eingeben, klicke ABBRECHEN und es ist sofort "Schluß"
Die Diskussion um die 'Abbrechen'-Schaltfläche klingt für mich auch wie Kleinkram, und ich kann mich damit auch abfinden, mein Chef jedoch nicht...
mich stört die Diskussion (ich halte interessante Grundsatzdiskussionen auch nicht für kleinlich) nicht, ich war nur an einem Punkt wo ich Dich wirklich nicht mehr verstehen konnte, aber vielleicht habe ich Dich ja jetzt verstanden -->siehe Anfang dieses Post hier
Ich würde meine Ansichten bezüglich dieser Thematik jederzeit auch gegenüber Deinem Chef verteidigen (wenn ich seine Adresse hätte), aber daran wirst Du wohl kein Interesse haben.



Gruß
Stephan
Scandal
*
Beiträge: 10
Registriert: Mi, 30.06.2004 16:15
Wohnort: Niedersachsen, nahe Hannover

Beitrag von Scandal »

Hi Stephan,

nur eine kurze Endbemerkung, dann dürfte das Thema endlich durch sein, denke ich 8) Ich ging zu Anfang davon aus, dass ich die 'Abbrechen'-Schaltfläche in etwa wie folgt abfragen kann: If cancel = true The Exit Sub... oder irgentwie so in der Art.

Ich verändere mein Makro nach deinen Vorgaben. Vielen Dank für deine Hilfe :)

Viele Grüße aus dem kalten Norddeutschland

Scandal
Packen wir's an :)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Scandal,
dann dürfte das Thema endlich durch sein
Ja, ich wollte hier wirklich keinen Streit heraufbeschwören.


Grüße aus dem regnerischen Berlin.

Stephan
Antworten