VB6 speichern

ja, guten tag, schon habe ich eine zweite frage^^

und wieder geht es um VB6; ich habe schon woanders gesuht, aber nicht weitergekommen, deswegen fange ich nochmal von vorne an…
ich möchte in meinem programm einen speicher-button haben, also ein CmdButton(oder label^^), der die während der laufzeit eingegeben Angaben beim nächsten Laden wieder übernimmt
„Erwartungen“:

  1. bitte sagt auch grenau was ich im code anpassen soll^^
  2. möglichst nur einen code geben, nicht einen link zu einem 5-Meter-tutorial^^
  3. möglichst wenig Unannehmlichkeiten für den User(z.B. eine andere .exe zum Laden)(wenn nicht anders möglich, mach ichs halt so…), ich kann die komplizierteren Codes ja erstmal kopieren und später verstehen

mfg, CheNetzer

Hallo Chenetzer,

ja, guten tag, schon habe ich eine zweite frage^^

tsts, du bist ja richtig maßlos :smile:

und wieder geht es um VB6; ich habe schon woanders gesuht,

Bäh, Fremdgänger *schelt*

ich möchte in meinem programm einen speicher-button haben,
also ein CmdButton(oder label^^), der die während der laufzeit
eingegeben Angaben beim nächsten Laden wieder übernimmt

Zunächst mal in was für ein Objekt werden diese Eingaben gemacht?
Sorry, ich kenne in VB kaum was und muß so fragen.

Zum Problem fällt mir ein, diese Eingaben in einem txt-File abzuspeichern und dieses beim nächsten Start wieder einzulesen.

Wäre das was für dich?

Obs da bessere Möglichkeiten in VB gibt weiß ich leider nicht.

Gruß
Reinhard

das mit den txtfiles hab ich mir schon mal kurz angesehen, hatte danach aber genauso viele ideen :frowning:
muss man dazu als user noch irgendwas machen?

habe auch noch was mit einem ini-code gelesen, ist das vllt. besser?

PS: hat jemand einen code?^^

mfg, CheNetzer

Hallo,

ich hab’ Dir mal etwas gebaut.
Lege eine Textbox auf die Form und füge den Code unten ein.

Starte das Programm und schreibe in die Textbox, was Du möchtest.

Dann schließt Du die Form.

Wenn Du das Programm dann neu startest, steht im Textfeld wieder, was zuletzt darin gestanden hat.

War es das, was Du wolltest?

Gruß Rainer

Option Explicit

Private Declare Function PathFileExists \_
 Lib "shlwapi.dll" Alias "PathFileExistsA" \_
 (ByVal pszPath As String) As Long

Dim Datei As String

Private Sub Form\_Load()
 Dim Pfad As String, ff As Integer, txt As String
 Pfad = App.Path
 If Right(Pfad, 1) "\" Then
 Pfad = Pfad & "\"
 End If
 Datei = Pfad & "Textspeicher.txt"
 If PathFileExists(Datei) Then
 ff = FreeFile
 Open Datei For Input As #ff
 Input #ff, txt
 Close #ff
 Text1.Text = txt
 End If
End Sub

Private Sub Form\_QueryUnload(Cancel As Integer, UnloadMode As Integer)
 Dim ff As Integer
 ff = FreeFile
 Open Datei For Output As #ff
 Print #ff, Text1.Text
 Close #ff
End Sub

ja, das wars^^
aber kannst du noch sagen, wo ich Individuelles einfügen muss und was?

mfg, CheNetzer

Hallo,

aber kannst du noch sagen, wo ich Individuelles einfügen muss
und was?

gar nicht. :smile: Das Textfeld muss ‚Text1‘ heißen, dann klappt das so.
Wählst Du für das Textfeld einen anderen Namen, musst Du den Namen im Code eben anpassen.
Wenn Dir der Name der Textdatei nicht gefällt, schreib einen anderen hin … Ich habe keine Vorstellung, was Du daran ‚Individuelles‘ ändern willst, wenn einfach nur der Text vom letzten mal übernommen werden soll.

Gruß Rainer

hm…
und wenn ich mehrere textboxen habe, kommt einfach ein text2.text darunter, richtig?
funktioniert das auch mit form1.caption (das einzige, was ich speichern muss^^)?
und das wird gespeichert, wenn die form geladen wird, oder?
(wäre eigentlich nicht gut, da ich kein sofort-speichern haben will, aber die formen, deren caption ich brauche sind eh nicht zugänglich)

wenn das dann beim Laden speichert, füge ich den code bei den speicher-formen ein und lasse den „Speichern“-Button alle kurz laden…

weitere Fragen:

  1. wie lädt er das dann?
  2. entsteht eine neue datei im ordner mit der exe?
  3. kommt das alles in den codetext der form, die ich speichern will?
    *4. wieviel speicherplatz braucht das dann?

mfg, CheNetzer

Hallo,

und wenn ich mehrere textboxen habe, kommt einfach ein
text2.text darunter, richtig?

richtig.

funktioniert das auch mit form1.caption (das einzige, was ich
speichern muss^^)?

Ja. Aber wozu? Wenn Du die zur Laufzeit nicht selbst veränderst, ist die ohnehin immer gleich.

und das wird gespeichert, wenn die form geladen wird, oder?

Nein, wenn die Form geschlossen (entladen) wird.

(wäre eigentlich nicht gut, da ich kein sofort-speichern haben
will, aber die formen, deren caption ich brauche sind eh nicht
zugänglich)

wenn das dann beim Laden speichert,

Nein, beim Entladen …

füge ich den code bei den
speicher-formen ein und lasse den „Speichern“-Button alle kurz
laden…

Die Prozedurnamen sind schon im Code enthalten. Einen Button brauchst Du dazu nicht, die Daten werden beim Entladen der Form gespeichert, beim Start des Programms gelesen, wenn die Datei vorhanden ist.

weitere Fragen:

  1. wie lädt er das dann?

Die Frage verstehe ich nicht. Hättest Du jetzt gern den Code noch einmal?

  1. entsteht eine neue datei im ordner mit der exe?

Ja.

  1. kommt das alles in den codetext der form, die ich speichern
    will?

Ja.

*4. wieviel speicherplatz braucht das dann?

Was? Der Code? Das liegt im Wesentlichen daran, was Du auf der Form sonst noch machst. Zusätzlich nur ein paar Byte. Wie viele genau weiß ich nicht, das kannst Du ja selbst mal messen.
Die Textdatei mit den Daten? So viele Bytes, wie Du hinein schreibst. Im Verhältnus zu anderen Dateien in Windows seeeeehr wenig. Aber Du schreibst den Namen der Datei doch selbst und kannst nach dem Testen einfach nachsehen.

Gruß Rainer

ich speicher das dann alles in den aptions, also die wichtigen angaben, weiß auch nicht wieso^^

einen button brauch ich trotzdem, die formen werden normalerweise nicht geöffnet…

noch eine wichtige frage:
gibt es für jede .caption eine eigene datei und kann man sie manipulieren, also vor dem laden die werte ändern?

mfg, CheNetzer

Hallo,

ich speicher das dann alles in den aptions, also die wichtigen
angaben, weiß auch nicht wieso^^

hmmm, ja wenn Du nicht weißt wozu …

einen button brauch ich trotzdem, die formen werden
normalerweise nicht geöffnet…

Dann schreib’s in die Form, die geöffnet wird.

Txt1 = Form1.Caption
Txt2 = Form2.Caption
Txt3 = Form3.Caption

Die Form muss dazu nicht sichtbar sein.

noch eine wichtige frage:
gibt es für jede .caption eine eigene datei und kann man sie
manipulieren, also vor dem laden die werte ändern?

Nein, das steht mit in der .exe

Beim Programmstart kannst Du das ändern, vorher nicht.

Erzählst Du gelegentlich mal, wozu das Ganze gut sein soll? Eine Möglichkeit wie man das sinnvoll einsetzen kann fällt mir nämlich nicht ein. Ich habe das Gefühl Du versuchst ein Problem mit den falschen Mitteln zu lösen, weil Du die richtigen nicht kennst.

Erkläre ich Dir hier, wie man mit einem Mikroskop einen Nagel in die Wand bekommt?

Gruß Rainer

naja, ich habe da ein Programm bei dem ich etliche werte in unterschiedlichen Formen brauche…
um nicht durcheinander zu kommen speichere ich sie (also bisher nur bis zum Schließen…) unter wert1.caption etc.
könnte auch wert1.tag nehmen oder es gleich bei den vorhandenen formen unter tag speichern, aber egal :stuck_out_tongue:

also öffne ich dann mit dem speicher-button die speicher-form und setze da statt text1.text
form1.caption
form2.caption

formn.caption?
(Speicher-Button:
load speichern
speichern.show)
(speichern:
der code mit unload me am ende)
dann werden die formen gespeichert und werden beim nächsten start so rekonstruiert.
Muss ich dazu alle kurz laden oder irgendeinen code eingeben und wie genau können die werte dann durch den user verändert werden(abgesehen von dem, was ich sonst eingebaut habe^^)?
tja, und dann noch eine frage…^^
wenn ich eine neue exe(selber name) erstelle, in der ich nur eine form hinzugefügt habe, kann dieses programm dann auch die alten daten verwenden?^^’

mfg, CheNetzer

Hallo,

naja, ich habe da ein Programm bei dem ich etliche werte in
unterschiedlichen Formen brauche…

Warum definierst Du dann nicht einfach Konstanten?

um nicht durcheinander zu kommen speichere ich sie (also
bisher nur bis zum Schließen…) unter wert1.caption etc.
könnte auch wert1.tag nehmen oder es gleich bei den
vorhandenen formen unter tag speichern, aber egal :stuck_out_tongue:

Nein, egal ist das nicht. Wenn das ein fester Wert ist, der ohnehin nicht verändert wird, gehört der in eine Konstante. Wird er verändert, gehört er in eine Variable.
Das spart Platz und ist schneller.

Aber wenn Du die Werte unbedingt aus der Caption der Form lesen willst und die immer gleich bleiben, warum trägst Du die nicht schon in der Entwicklungsumgebung ein? Dann sind die auch immer gleich. Wozu soll das Sichern gut sein?

Hast Du das Eigenschaften-Fenster in der Entwicklungsumgebung noch nicht entdeckt?

Gruß Rainer

die werte verändern sich ja während der laufzeit^^
zu den konstanten:
ich nehme ja auch manchmal werte, die nur während einer laufzeit gelten und nicht gespeichert werden sollen. bsp: wie oft ist — insgesamt passiert und wie oft seit dem letzten Laden?
außerdem habe ich mich schon daran gewöhnt und müsste auch etliche codes ändern…

mfg, CheNetzer

Hallo,

außerdem habe ich mich schon daran gewöhnt und müsste auch
etliche codes ändern…

na gut, schön ist anders, aber was soll’s. :smile:

Also. Wenn die Daten bei Start gelesen werden sollen, schreibst Du den Code zum laden in der Startform in das Ereignis Form_Load sonstz eben in einen Button in das Klick_Ereignis.

Dann schreibst Du eine Prozedur zum sichern der Daten, entweder in Query_Unload der Startform oder auch in einen Button.

Du kannst auch eigene Prozeduren schreiben, z.B.:
Private Sub Laden()
Private Sub Sichern()
Dort den Code rein und die Prozeduren aufrufen von wo Du magst.

Vergiss beimLaden nicht erst zu prüfen, ob es die Datei gibt, das spart den Errorhandler.

Zul Laden öffnest die Datei …

Open Datei For Input As #ff
Zum Schreiben
Open Datei For Input As #ff

Am Ende jeweils Close #ff

Dazwischen so oft wie Du magst zum Lesen:

Input #ff, Zeile
Form1.Caption = Zeile
Input #ff, Zeile
Form2.Caption = Zeile

Zum Schreiben einfach

Print #ff, Form1.Caption
Print #ff, Form2.Caption

Was Du sonst noch brauchst steht ja oben schon im fertigen, lauffähigen und getesteten Code.

Nun versuch’s erst mal, probiere es aus und melde Dich mit der genauen Fehlermeldung, falls Du eine produzierst. :smile:

Gruß Rainer

also der laden-cmd-button mit (dann noch ein _Click dahinter…)

Private Sub Laden()
Open Datei For Input As #ff (da hast du das selbe geschrieben wie fürs schreiben, ist das richtig?)
Input #ff, Zeile
Form1.Caption = Zeile
Input #ff, Zeile
Form2.Caption = Zeile

Close#ff
End Sub

wie prüfe ich eigentlich, ob es existiert? ^^’
zeile dann auch nummeriert?

und schreiben ist das verändern?
das brauch ich nicht nur nicht, das wollte ich verhindern, deswegen hab ich gefragt^^

mfg, CheNetzer

Hallo,

Open Datei For Input As #ff (da hast du das selbe geschrieben
wie fürs schreiben, ist das richtig?)

Nein, sorry. :smile: Schreiben … ‚For Output‘.

wie prüfe ich eigentlich, ob es existiert? ^^’

Ob die Datei existiert? Mit dem API-Aufruf ‚PathFileExists‘
Siehst Du oben im Code wie genau und wie die Deklaration aussehen muss.

zeile dann auch nummeriert?

Nein, wozu auch? Wenn Du fünf Formen hast, schreibst Du fünf werte rein und liest auch wieder fünf Werte. Wozu sollte Numerieren gut sein? Wenn Das Programm fertig und Compiliert ist, kann keine Form mehr dazu kommen und die Befehle werden immer wieder in der selben Reihenfolge abgearbeitet.

und schreiben ist das verändern?

Die Datei mit den daten wird bei jedem Schreiben ohne Nachfrage einfach überschrieben.

das brauch ich nicht nur nicht, das wollte ich verhindern,
deswegen hab ich gefragt^^

Was brauchst Du nicht?

Gruß Rainer

Hallo,

Open Datei For Input As #ff (da hast du das selbe geschrieben
wie fürs schreiben, ist das richtig?)

Nein, sorry. :smile: Schreiben … ‚For Output‘.

na dann hab ich wenigstens einmal was richtig gemacht/gesagt :smile:

wie prüfe ich eigentlich, ob es existiert? ^^’

Ob die Datei existiert? Mit dem API-Aufruf ‚PathFileExists‘
Siehst Du oben im Code wie genau und wie die Deklaration
aussehen muss.

gut

zeile dann auch nummeriert?

Nein, wozu auch? Wenn Du fünf Formen hast, schreibst Du fünf
werte rein und liest auch wieder fünf Werte. Wozu sollte
Numerieren gut sein? Wenn Das Programm fertig und Compiliert
ist, kann keine Form mehr dazu kommen und die Befehle werden
immer wieder in der selben Reihenfolge abgearbeitet.

also ist alles in einer zeile?
noch besser^^

und schreiben ist das verändern?

Die Datei mit den daten wird bei jedem Schreiben ohne
Nachfrage einfach überschrieben.

ist doch verändern, oder?^^

das brauch ich nicht nur nicht, das wollte ich verhindern,
deswegen hab ich gefragt^^

Was brauchst Du nicht?

die verändern-funktion

Hallo,

Nein, sorry. :smile: Schreiben … ‚For Output‘.

na dann hab ich wenigstens einmal was richtig gemacht/gesagt :smile:

*gg* gut aufgepasst! :smile:

zeile dann auch nummeriert?

Nein, wozu auch? Wenn Du fünf Formen hast, schreibst Du fünf
werte rein und liest auch wieder fünf Werte. Wozu sollte
Numerieren gut sein? Wenn Das Programm fertig und Compiliert
ist, kann keine Form mehr dazu kommen und die Befehle werden
immer wieder in der selben Reihenfolge abgearbeitet.

also ist alles in einer zeile?
noch besser^^

Nein, nicht in einer Zeile. Sonst könntest Du die ja nicht wieder einlesen.

das ist wie hier. Wenn ich das Alphabet schreibe …

A
B
C
D

Und Du liest dann von Oben, hast Du automatisch die richtige Reihenfolge.

und schreiben ist das verändern?

Die Datei mit den daten wird bei jedem Schreiben ohne
Nachfrage einfach überschrieben.

ist doch verändern, oder?^^

Ja. Muss ja auch.

das brauch ich nicht nur nicht, das wollte ich verhindern,
deswegen hab ich gefragt^^

Was brauchst Du nicht?

die verändern-funktion

Und was brauchst Du dann?

Lass mich raten, Du willst mehrere verschiedenen Zustaände sichern?

Gruß Rainer

zeile dann auch nummeriert?

Nein, wozu auch? Wenn Du fünf Formen hast, schreibst Du fünf
werte rein und liest auch wieder fünf Werte. Wozu sollte
Numerieren gut sein? Wenn Das Programm fertig und Compiliert
ist, kann keine Form mehr dazu kommen und die Befehle werden
immer wieder in der selben Reihenfolge abgearbeitet.

also ist alles in einer zeile?
noch besser^^

Nein, nicht in einer Zeile. Sonst könntest Du die ja nicht
wieder einlesen.

das ist wie hier. Wenn ich das Alphabet schreibe …

A
B
C
D

Und Du liest dann von Oben, hast Du automatisch die richtige
Reihenfolge.

das heißt, die erste zeile wird dann jeweils „neutralisiert“?

das brauch ich nicht nur nicht, das wollte ich verhindern,
deswegen hab ich gefragt^^

Was brauchst Du nicht?

die verändern-funktion

Und was brauchst Du dann?

nur das laden

Lass mich raten, Du willst mehrere verschiedene Zustände
sichern?

zustände??
hab ich wieder was übersehen?:frowning:

also nochmal kurz zusammengefasst:
dein erster code (re^3 oder 4…) kommt mit leichten änderungen bei text1.text und einem unload me in die speicher-form

in den laden-button kommt dann der code, den ich in meiner antwort vorhin zusammengemixt habe

mfg, CheNetzer

Hallo,

Wenn ich das Alphabet schreibe …

A
B
C
D

Und Du liest dann von Oben, hast Du automatisch die richtige
Reihenfolge.

das heißt, die erste zeile wird dann jeweils „neutralisiert“?

nein, wieso? Die wird als Erste gelesen.

nur das laden

Dann lass das Schreiben weg. Wenn Du die Daten nicht sichern willst, brauchst Du dafür auch keinen Code. Aber das Laden ergibt dann auch keinen Sinn, ist komplett überflüssig.

Wenn nach dem Start des Programms in For,N.Caption immer das Selbe steht, muss man das nicht laden, das kann dann auch so schon da stehen.

also nochmal kurz zusammengefasst:
dein erster code (re^3 oder 4…) kommt mit leichten
änderungen bei text1.text und einem unload me in die
speicher-form

??? Wieso jetzt wieder Text1.Text, ich denke es geht um FormN.Caption? Das hattest du nur noch nicht erzählt als ich den Code geschrieben habe.

in den laden-button kommt dann der code, den ich in meiner
antwort vorhin zusammengemixt habe

Ich habe keinen Code von Dir gesehen.
Wenn Du Code schreibst,dann bitte immer eine Prozedur vollständig und mit Pre-Tag, damit ich Fehler sehen kann.

Gruß Rainer