Pfad bei Dialogsteuerfeld

Hallo
wenn das Dialogfeld Öffnen/Speichern Datei aufgeht, ist immer der momentane Installationspfad zum Öffnen angegeben.

Frage, wie geht es das ich den letzten Pfad beim neuen Zugriff wieder automatisch öffne. Ist das nur ne Einstellung beim Steuerelement oder muß man das Programmtechnisch lösen.

Könnte mir vorstellen, den Pfad auszuspielen und immer einzulesen beim Programmstart, wenn jmd möchte, kann er den Pfad neu belegen.
Wäre das eine Idee???

Mfg Werner

Hallo, Werner!

wenn das Dialogfeld Öffnen/Speichern Datei aufgeht, ist immer
der momentane Installationspfad zum Öffnen angegeben.

Mit was für einem Steuerelement machst Du das? CommonDialog? Ich hab eine eigene Klasse dafür, die den Windows-Standarddialog per API aufruft. Dort kann ich das InitDir vorbelegen wie ich will. Vielleicht gibt’s so was ähnliches…

Gruß, Manfred

Hi
klar kann ich den Pfad im CommonDialog (um dieses ST-Element geht es!)
auch belegen, aber wenn jmd einen anderen Pfad dauernd braucht, hat er ja immer den gleichen Pfad, den ich vorbelegt habe.
So ist es ja im Moment.

Mfg werner

Hallo, Werner!

klar kann ich den Pfad im CommonDialog (um dieses ST-Element
geht es!)
auch belegen, aber wenn jmd einen anderen Pfad dauernd
braucht, hat er ja immer den gleichen Pfad, den ich vorbelegt
habe.
So ist es ja im Moment.

Dann speicher das in der Registry (SaveSetting), in eine INI-Datei oder sonst wie. Ich würde die Regsitry nehmen…

Gruß, Manfred

Wenn du mir sagst wie das geht???
Hi,
wenn du mir sagst wie das geht kann ich das machen.
Ich habe schon eine Datei, wo ein paar Zahlen gespeichert werden, auf die das Programm zugreift beim Start.

Da ich aber die Exe einfach so starte, weiss ich nicht, ob das überhaupt geht.

Ich wäre aber froh mal zu erfahren, wie ich Parameter da speichern kann und dann aber auch ändern oder ersetzen kann.

Mfg Werner

Hallo Werner,

so nun fix zu deinem „Problemen“ *zwinker

Das der Commondialog aufgeht mit einem definierten Pfad kannst du über dir eigenschaft Commondialog1.InitDir festlegen.

Sagen wir mal so du hast eine Datei schon einmal geöffnet, dann ermittle den Pfad zum File. Wie? Poste ich dir weiter unten :wink: Den speicherst du einfach in der Registry ab. Der Aufruf erfolgt wiefolgt

savesetting appname, section, Key, setting

Nun musst du dir nur überlegen wie du die daten übergibst ( Also was für appname section und key, die kannst dir frei auswaehlen.

Bsp Savesetting app.productname,„Setting“,„LastDir“,pfad

hierbei musst du in pfad den aktuellen pfad haben :wink:

Auslesen kannst du den Wert folgendermassen

GetSetting appname, Section, Key, Default

Bsp:

x$=gettsetting(app.productname,„Setting“,„LastDir“,app.path

Somit hast du dann in x den gespeicherten wert, sollte dieser nicht vorhanden sein so bekommst du app.path wieder :wink:

Nun ein kleines Demo

Private Sub Öffne()
on error resume next
dim Filename$
 With commondialog1
 .CancelError = True
 .DefaultExt = "Gif"
 .DialogTitle = "Bilddatei öffnen ..."
 .Filter = "Compuserve Graphics Interchange (\*.gif)|\*.gif"
 .Flags = &H2000 + &H800
 .InitDir = getsetting(app.productname,"Setting","LastDir",app.path
 .ShowOpen
 If Err Then Exit Sub 'es wurde abbrechen gewaehlt
 Filename = .Filename
 savesetting app.productname,"Setting","LastDir",GetDirectory(Filename) 
 End With
'hier kannst du nun die Daten weiterverarbeiten
end sub

Private Function GetDirectory(Filename as string) as string
on error resume next
dim x as string
dim i as integer
 For i = Len(Filename) To 1 Step -1
 If Mid(Filename, i, 1) = "\" Then Exit For
 Next i
 GetDirectory = Left(Filename, i - 1)
end function

ungetestet aber sollte funktionieren :wink:
Funktionsbeschreiben:

Beim ersten Aufruf findet er keinen Wert und setzt somit Initdir auf App.Path. Danach wird der aktuelle Pfad ermittelt und dieser in der Registry unter dem Projectnamen in der Sektion Setting unter dem Kex Lastdir abgelegt. Beim zweiten Aufruf liesst du von dort den Wert aus und weisst ihm zu und setzt somit das Verzeichnis :wink:

MFG Alex

Und das geht immer?
Hallo
und das geht immer und auch für mehrere Parameter???
Und die sind dann auch immer auf dem Rechner verfügbar, auch wenn er mal aus war???
Und man muss die Software nicht mal installiert haben und eine einfache exe-Datei reicht aus???
Und die Parameter können dann auch wieder ersetzt werden???

Ich frage nur nochmal nach.
Wow, das is aber schon gut, das man das mal weiss.
Da kann ich ja einiges in meinem Programm verändern und optimieren und ein paar Parameter können nun direkt gespeichert werden.

Mfg Werner

Hallo

Hallo Werner,

du kannst in die Registry schreiben was du willst und soviel du willst, aber halt nur als Zeichenfolge. Willst du andere Werte schreiben, so musst du dich API Aufrufen bemuehen.
Funktionieren tut es immer solange die Rechte dazu da sind das in die Registry geschrieben werden kann :smile:

und das geht immer und auch für mehrere Parameter???

Was meinst du denn mit mehreren Parametern?
Du kannst dir verschiedene Sektionen anlegen und dort verschiedene Schluessel. Zum bsp.

 Appname = xyz
 Sektion =Setting
 Schluessel ... TOP, LEFT, WIDTH, HEIGHT,MAXIMIERT

 Appname = xyz
 Sektion =Recent Files
 Schluessel = File 0, File 1, File 2 etc.

 Appname = xyz
 Sektion =ABC
 Schluessel = Key1, Key2, Key3

Und die sind dann auch immer auf dem Rechner verfügbar, auch
wenn er mal aus war???

Die Werte sind dort gespeichert. Wenn du einmal dort was gespeichert hast, sind sie immer verfügerbar. Es seidenn du löscht sie mit deletesetting, dann würdest du aber den Default Wert bekommen.

 DeleteSetting appname, [Section], [Key]

Sektion und Key sind optionale Parameter. Gibst du sie an, so wird der schluessel gelöscht. Wenn nicht dann wird der gesammte Inhalt gelöscht.

Wenn du nun nicht weisst wieviel Daten vorhanden sind so kannst du mit getallsetting alles auslesen.

dim x
x= getallsettings(appname,section)

Wenn in der Sektion daten vorhanden sind, so kannst du sie dann unter x abfragen. Das ist dann ein Zwei dimensionales Array, was den Schluesselnamen und den Wert beinhaltet.
Achte aber darauf das wenn keine daten vorhanden sind dann x glaub nothing ist. in diesem Falle arbeite mit on error resume next und fange die fehler ab :wink:

Und man muss die Software nicht mal installiert haben und eine
einfache exe-Datei reicht aus???

Für die Aufrufe benötigst du soweit ich weiss keine weiteren Daten. Wenn die VB Runtimes installiert sind, sollte es klappen. Diese VB Runtimes brauchst du ja um überhaupt das EXE File zu starten :smile:

Und die Parameter können dann auch wieder ersetzt werden???

Ja einfach dann den Wert neu speichern unter der gleichen Sektion mit dem gleichen Schluessel. Dann werden die Daten einfach überschrieben.

Bsp:
Es ist nocj kein schluessel vorhanden

dim x$
 x=getsetting("XYZ","Setting","Data1","NoEntry")
 'x = NoEntry, kein schluessel vorhanden deswegen wird der default 
 'werd zurueckgegeben
 x="Test" 'x wird Test zugewiesen
 SaveSetting "XYZ", "Setting", "Data1", x 'Variable wird gespeichert
 x="" 'X wird auf "" festegelgt
 x=getsetting("XYZ","Setting","Data1","NoEntry") 'Daten auslesen
 'x=Test da der Wert vorhanden ist und ausgelesen wird
 x="NeuerEintrag"' X wird eine neue Zeichenfolge zugewiesen
 SaveSetting "XYZ", "Setting", "Data1", x 'x wird gespeichert und
 'es wird der alte wert ueberschrieben 
 x="" 'X wird auf "" festgelegt
 x=getsetting("XYZ","Setting","Data1","NoEntry") Daten auslesen
 'x=NeuerEintrag 

Ich frage nur nochmal nach.
Wow, das is aber schon gut, das man das mal weiss.

Für solche Faelle gibt es ja das Forum :wink:

Da kann ich ja einiges in meinem Programm verändern und
optimieren und ein paar Parameter können nun direkt
gespeichert werden.

genau, so macht es der groesste anteil der Programmierer da es der einfachste / schnellste und sicherste weg ist. Somal wenn du die Daten in einem INI File speichern würdest, dieses auf 64 KB begrenzt waere und du gefahr kläufst das das File schnell geaendert werden kann ( In der Registry rummuddeln traut sich nicht jeder) und bei das das File zerstört / gelöscht werden koennte.

Du musst halt nur aufpassen das du die Rechte hast zum schreiben in die Registry. wie man das am einfachsten rausbekommt?

–> Programmstart
schreiben eines Dummy Eintrages in die Registry
lesen des wertes
löschen des dummy eintrages

tritt ein fehler auf so weisst du das du diese variante nicht nehmen kannst :smile: Dann greife zur not auf ein Ini File

Mfg Werner

MFG Alex

mal noch ne Frage zwecks Sicherheit
Hallo
theoretisch müsste es doch so auch möglich sein, das Programm mit einem Schutz zu versehen???

Mal angenommen, ich schreibe eine Eintrag in die Registry, ums kompliziert zu machen eine Zeichenkette zb. aspFJWGH2t9237uän oder so.

So wenn jetzt der Eintrag so da drin steht, könnte man das Programm zB mit einem Timer starten lassen und sagen, wenn das da drin steht, dann beende Programm nach 4min.

Ist das jetzt richtig???
Dann wäre doch hier aber auch eine Möglichkeit, die Funktionen einzuschränken und letztendlich alles zu steuern.

Wer will diesen Eintrag denn finden???

Und ums noch weiter zu spannen, kann man doch beliebige Einträge von anderen Daten damit auch ansteuern und löschen edieren oder sonst was.

Ich glaub, jetzt warte ich erst mal auf Antwort

Mfg Werner

Hallo

Hallo Werner,

theoretisch müsste es doch so auch möglich sein, das Programm
mit einem Schutz zu versehen???

Ja aber es ist ein sehr unsicherer Schutz! Man kann in die registry per Hand eingriffe vornehmen und die daten dann aendern! Schreibst du die daten in ein File kannst du das mit einer Überprüfung der CRC Summe checken ob das File geaendert wurde.

Mal angenommen, ich schreibe eine Eintrag in die Registry, ums
kompliziert zu machen eine Zeichenkette zb. aspFJWGH2t9237uän
oder so.

Das sollte nicht das problem sein :smile:

So wenn jetzt der Eintrag so da drin steht, könnte man das
Programm zB mit einem Timer starten lassen und sagen, wenn das
da drin steht, dann beende Programm nach 4min.

Korrekt würde klappen, aber was willst du damit erreichen ?

Ist das jetzt richtig???

Ja ist soweit richtig!

Dann wäre doch hier aber auch eine Möglichkeit, die Funktionen
einzuschränken und letztendlich alles zu steuern.

Ja aber, wie gesagt da ich die Daten per Hand editieren kann, kann ich somit die Funktionen dann beeinflussen.

Wer will diesen Eintrag denn finden???

Zum Bsp. Spybot kann dir anzeigen wenn ein Eintrag in die Registry geschrieben wird. So würde ich das erfahren und würde nun die Adresse wo es steht kennen.

Und ums noch weiter zu spannen, kann man doch beliebige
Einträge von anderen Daten damit auch ansteuern und löschen
edieren oder sonst was.

Ja das Waere möglich. Bedenke aber bitte das du mit dieser Variante nur einen Hauptschluessel , dann eine Sektion und dann einen Schluessel bearbeiten kannst. Was ist aber wenn Bsp Ein Wert unter VB / Daten/ Allgemein -> Sektion „Setting“ Schluessel = Top steht?
Dann ist es mit der variante nicht mehr möglich. Genauso kannst du auch kein DWORD erstellen / aendern.
Dazu musst du dich dann API Aufrufen bemuehen um das zu bewerkstelligen. Das ist aber auch rel. Simple. Wenn du magst kann ich dir die andere version auch mal posten.

Ich glaub, jetzt warte ich erst mal auf Antwort

Mfg Werner

Also Zusatz noch. Willst du ein programm schuetzen so wuerde ich das wiefolgt machen. Ist ein rel. Grosser Aufwand, dafür aber auch rel. Sicher.

Du erstellst eine Datei. Dort schreibst du saemtliche Werte rein. Natürlich verschluesselt. Nennen wir die Datei mal F1.
Sowie du dort eine Aenderung gemacht hast und das File geschlossen ist, so ermittelst du dir die Checksumme der Datei F1. Dann erstellst du eine zweite Datei F2. In diese schreibst du nur die Checksumme der Datei F1.

Beim programmstart überprüfst du nun ob alle beide Dateien vorhanden sind.
Sie sind es nicht oder es fehlt mind. eine -> meldung ausgeben, und ggfls. Funktionen beschraenken oder programm beenden.
Sie sind vorhanden ? --> weiter mit
auslesen des Wertes in Datei F2. ermitteln der Checksumme von F1.
Vergleich starten -> Daten sind unterschiedlich -> Daten wurden Manuell geaendert -> Meldung ausgeben -> Funktionen beschraenken oder ggfls. Programm beenden.
Die Daten stimmen, so weisst du das die Daten nicht geaendert wurden :wink:

Ist eigentlich ein rel. simples aber rel. sicheres Verfahren, da du so keine Daten ohne weiteres aendern kannst. Jemand der auf die Lösung kommt und einen Weg findet ( den es gibt) der kann dein Progg cracken und sich die gewünschten Funktionen dann einschalten!

Achso eh ich es vergesse, die Dateien F1 und F2 legst du am besten im Windows Ordner an. Diesen kannst du ja leicht ermitteln! Dann nenne sie zum bsp. Win.dat und system32.dat zum bsp. es kommt keiner daauf das es sich um dateien aus deinem programm handelt :smile:

Willst du aber zum Bsp. so eine Datei schuetzen ( Passwortschutz) bevor sie gestartet wird, da gibt e noch ne bessere Variante die ich mal praktiziert habe und die bombensicher ist :wink:

MFG Alex
MFG Alex

Das Thema Schutz hatten wir ja schon mal
Hi also danke erstmal,
das Thema Schutz hatten wir ja schon mal, jetzt kommen sicher wieder einige Kommentare dazu. Du kannst mir ja mal das mit dem Passwortschutz mitteilen, wenn du magst.

Ich habe ja noch die Variante von Rainer Fischer offen, die ich evtl. einabauen möchte. Nur im Moment weiss ich überhaupt nicht, wo mir der Kopf steht bzw. wann ich das machen soll.

Das dauerd sicher noch etwas bis ich soweit bin.

Mfg Wermer

Hallo Werner,

naja das ist so eine sache. Jeder hat eine andere Idee. Da kann man stunden drueber wie man was macht und was nun sichererer ist.
Es kommt auch sicherlich darauf an, wieviel arbeit du investieren willst.
Den Fall, also wie du es realisieren kannst das du erst nen Passwort eingeben musst, bevor das Exe File startet kann ich dir gerne sagen, oder auch die variante posten wie du einen sicheren Passwortschutz machst. Also das Passwort speichern und abfragen.

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]