Problem bei Schreiben in eine Text Datei

Trancefreak

Mitglied
Hallo ich versuche seit einigen Tagen mit Visual Basic 6 ein Programm zu erstellen womit man in einem Spiel bequem die Auflösung ändern kann. Und zwar liegt das Problem dabei dass ich möchte das ein Bestimmter Text in die Datei geschrieben wird dies habe ich bislang mit Private Sub Option1_Click() Open "Sun.ini" For Output As #1 Print #1, "[Video ]" Print #1, "ScreenWidth=640" Print #1, "ScreenHeight=400" Print #1, "StretchMovies=no" Close #1 End Sub versucht, funktioniert hat es jedoch sollte es nich die ganze datei neu erstellen und die anderen inhalte löschen!Könnt ihr mir sagen wie der code dafür lautet dass man den inhalt [Video ] ScreenWidth=640 ScreenHeight=400 in die Text Datei Hinzufügt jedoch nicht den anderen inhalt löscht oder man den alten inhalt von Video überschreibt? Were Dankbar Gruss Patrick
 
Zuletzt bearbeitet:
Sieht mir wie eine *.ini Datei aus.
Die kannst du leicht lesen und schreiben mit den API-Funktionen WritePrivateProfileString und GetPrivateProfileString.
Hier im Forum gabs mal ein Beispiel dazu, such einfach mal nach den Funktionen.
 
Moin
Ich hatte bis ebend im Forum gesucht und leidernicht fündig geworden kennst du den direkt befehl noch dafür were echt dankbar gruss Patrick
 
Moin Hab jetz doch etwas gefunden "Deklaration als Modul" Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long "Und die Funktion" Private Sub Option1_Click() WritePrivateProfileString "Video", "ScreenWidth", Str$(MeLeft), App.Path & "\Sun.ini" WritePrivateProfileString "Video", "ScreenHeight", Str$(Me.Top), App.Path & "\Sun.ini" End Sub Er schreibt es wie ich es möchte nur halt wo kann ich da meine Zahlen eingeben ? in der ini Datei tauchen jedoch zahlen auf die ich nirgends eingegeben habe!Kann mir vielleicht einer sagen wie ich in meiner funktion an der stelle meine zahlen eingeben kann? Also bis lang sieht die fertig ini so aus Video ScreenWidth= 0 ScreenHeight= 2640 Is alles halt ok nur die zahlen da bräuchte ich nochmals hilfe danke im vorraus Gruss Patrick
 
Für die Auflösung kann das ja nicht gehen, du schreibst ja nicht die Breite und Höhe in die Datei, sondern die Position der linken oberen Ecke des Fensters.
(Me.Left, Me.Top)
Die Breite und Höhe bekommt man mit .Height und .Width, aber nicht über Me, sonst bekommst die Werte vom Fenster.

Die Auflösung bekommst du so:
Code:
Breite = Screen.Width / Screen.TwipsPerPixelX
Höhe = Screen.Height / Screen.TwipsPerPixelY
Screen betrifft den ganzen Bildschirm und gibt die Höhe/Breite in Twips zurück.
Screen stellt aber auch die Methoden TwipsPerPixelX/Y bereit, mit denen in Pixel umgerechnet werden kann.
 
hallo Patrick,

mein Vorschlag wäre, die gesamte Textdatei in ein Array einlesen zu lassen und dann die betreffenden Einträge austauschen.

z.B.
dim arText() as String,Buffer$
dim i as Integer

Redim arText(0)
Open "Sun.ini" For Input As #1

Do While EOF(1)
line input #1,Buffer
arText(i)=Buffer
i = i+1
ReDim Preserve arText(i)
loop
Close #1

Nun den Text austauschen
entweder direkt....

arText(1) = "ScreenWidth=" & 640
arText(2) = "ScreenHeight=" & 400
arText(3) = "StretchMovies=no"

oder durch eine Schleife das Array abfragen
for i= 0 to UBound(arText)-1
if instr(1,arText(i),"ScreenWidth") >0 then
arText(i) = "ScreenWidth=" & 640
elseif instr(1,arText(i),"ScreenHeight") >0 then
arText(i) = "ScreenHeight=" & 400
elseif instr(1,arText(i),"StretchMovies") >0 then
arText(i) = "StretchMovies=no"
endif
next i

Nun wieder in Datei schreiben

Open "Sun.ini" For Output As #1

for i= 0 to UBound(arText)-1
Print arText(i)
next i
Close #1

Redim arText(0)

So würde ich dieses Problem lösen.
Du kannst aber auch das Prinzip mit dem Schreiben einer INI-Datei per API-Befehle verwenden.
Da ist aber die Anzahl der Zeilen begrenzt, die Du schreiben könntest.

Probier es mal aus.

ANI

:)
 
@ANI ja, wiso einfach wenns auch kompliziert geht :)
Sein Problem war ja nicht mehr das Schreiben in die Datei, sondern der richtige Wert.

Code:
Original geschrieben von Patrick
"Deklaration als Modul"
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

"Und die Funktion"
Private Sub Option1_Click()
WritePrivateProfileString "Video", "ScreenWidth", Str$(MeLeft), App.Path & "\Sun.ini"
WritePrivateProfileString "Video", "ScreenHeight", Str$(Me.Top), App.Path & "\Sun.ini"
End Sub
Die Fett-Markierten Stellen kennzeichnen die Position an der die Werte für die Auflösung stehen sollen.

Also Me.Left/Top ersetzen durch eigene Werte als Zahl oder über das Screen-Objekt für die aktuelle Auflösung aus meinem letzten Beitrag oben.
 
Hallo Retlaw,

ich weis, daß es nicht mehr um das Schreiben einer Text-Datei ging, sondern um die Auflösung ermitteln.

Dieses Problem hast Du bestens gelöst.

Ich wollte nur mit meinem Beitrag auf das Problem hinweisen, wenn es eine große INI-Datei werden sollte, reagiert der API-Befehl nicht mehr und verweigert die Ausführung.

Aber dennoch Danke für den Hinweis.

ANI
 
@ANI achso. :)
Weißt du wo da die Grenze für die API-Funktion ist und wie sich das im Programm bemerkbar macht ? (Laufzeitfehler, ...)
 
Hallo Retlaw,

die genaue Grenze kenne ich noch nicht.

Mir ist es nur aufgefallen, weil ich eine Art Datenbank mit einer INI-Datei machen wolte und nach ca. 200 Zeilen (genau weis ich es nicht mehr) hat der Write-Befehl keine Zeilen mehr geschrieben. (ohne Laufzeitfehler) Er schreibt einfach nicht mehr!

Bin dann sofort auf ein binäres System umgestiegen und dies ging dann bis unbegrenzt. Ich habe mich dann nicht weiter mit dem INI-Problem herumgeschlagen.

Wenn Du es aber genauer wissen möchtest, werde ich ein kleines Testprogramm schreiben, um die genaue Zeilenanzahl bestimmen zu können.

ANI
 
Zurück