Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

getopenfilename
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 16.07.2005, 11:41    Titel: getopenfilename Antworten mit Zitat

Bin jetzt schon tagelang am ausprobieren wie der getopenfilename befehl der Api funktioniert. Aber leider krieg ich es einfach nicht auf die reihe.

Welche werte muss ich den dem openfilename typ mitgeben?

Ich steig einfach nicht durch. Kann mir vielleicht mal jemand ein ein programm geben in dem der getopenfilename befehl verwendet wird? Denn meiner Meinung nach lernt man doch am besten aus dem Quellcode.

Und dann noch ne Frage: In der commdlg32.bi ist der openfilename typ wie folgt deklariert:

Code:

Type OPENFILENAME Field = 1
   lStructSize       As Integer
    hwndOwner          As Integer
    hInstance          As Integer
    lpstrFilter       As byte ptr
    lpstrCustomFilter    As byte ptr
    nMaxCustFilter       As Integer
    nFilterIndex       As Integer
    lpstrFile          As byte ptr
    nMaxFile          As Integer
    lpstrFileTitle       As byte ptr
    nMaxFileTitle       As Integer
    lpstrInitialDir    As byte ptr
    lpstrTitle          As byte ptr
    flags             As Integer
    nFileOffset       As short
    nFileExtension       As short
    lpstrDefExt       As byte ptr
    lCustData          As Integer
    lpfnHook          As Integer
    lpTemplateName       As byte ptr
End Type


Was hat das Field = 1 zu bedeuten und müssten das nicht "string ptr" stat "byte ptr" sein?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 16.07.2005, 18:51    Titel: Antworten mit Zitat

Dieses Beispiel, dass vor einiger Zeit mal im englischen Forum gepostet wurde, hatte ich auf der Platte gesichert. Vielleicht hilft es ja weiter.
Code:
Option Explicit
Option Private

'$include once:'kernel32.bi'
'$include once:'win\user32.bi'
'$include once:'win\gdi32.bi'
'$include once:'commdlg32.bi'
'
Declare Function  OpenFileDialog (hWndOwner As Long, default As String, filter As String, initDir As String, title As String) as String
'
Function  OpenFileDialog (hWndOwner As Long, myfileName As String, filter As String, initDir As String, title As String ) as String
   

    Dim ofn As OPENFILENAME
   ' dim SHARED hInst
    Dim buffer2 As String

    ofn.lStructSize = Len(ofn)              'set length of struct
    ofn.hwndOwner   = hWndOwner             'set parent window handle
    ofn.hInstance   = GetModuleHandle(0)    'set the application's instance

'select a filter
'pstrFilter points to a buffer containing pairs of null-terminated
'filter strings. The first string in each pair describes a filter
'(for example, "Text Files"), and the second specifies the
'filter pattern (for example, "*.TXT"). Multiple filters can be
'specified for a single item by separating the filter pattern strings
'with a semicolon (for example, "*.TXT;*.DOC;*.BAK"). The last string
'in the buffer must be terminated by two NULL characters. If this member
'is NULL, the dialog box will not display any filters.
'The filter strings are assumed to be in the proper order - the
'operating system does not change the order.

'   filter = "XB Files (*.x, *.dec)" + CHR$(0) + "*.x;*.dec" + CHR$(0) + "Text Files (*.txt)" + CHR$(0) + "*.txt" + CHR$(0) + "All Files (*.*)" + CHR$(0) + "*.*" + CHR$(0) + CHR$(0)
    ofn.lpstrFilter = SAdd(filter)

    'create a buffer for the returned file
    If myfileName = "" Then
        myfileName = SPACE(254)
    Else
        myfileName = myfileName + SPACE(254 - LEN(myfileName))
    END If

    ofn.lpstrFile = Sadd(myfileName)
    ofn.nMaxFile  = 255                     'set the maximum length of a returned file


    buffer2 = SPACE(254)
    ofn.lpstrFileTitle  = SAdd(buffer2)     'Create a buffer for the file title
    ofn.nMaxFileTitle   = 255               'Set the maximum length of a returned file title

    ofn.lpstrInitialDir = SAdd(initDir)     'Set the initial directory

    ofn.lpstrTitle = SAdd(title)            'Set the title

    ofn.flags = OFN_FILEMUSTEXIST Or OFN_PATHMUSTEXIST Or OFN_EXPLORER  'flags

    If GetOpenFileName ( ofn) = 0 THEN
        myfileName = ""
        OpenFileDialog = ""
    Else
        OpenFileDialog = RTrim(myfilename) 'TRUE
    End If

End Function

_________________
Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 10:00    Titel: Antworten mit Zitat

Danke das bringt mich schon um einiges weiter grinsen . Das Fenster wird erstellt und funktoiniert auch. Allerdings bin ich auf ein weiteres Problem gestoßen:

Wie funktoiniert eigentlich ein NULL-Terminated string?
Wenn ich folgendes schreibe:

Code:

Dim filter as string
filter = "XB Files (*.x, *.dec)" + CHR$(0) + "*.x;*.dec" + CHR$(0) _
+ "Text Files (*.txt)" + CHR$(0) + "*.txt" + CHR$(0) _
+ "All Files (*.*)" + CHR$(0) + "*.*" + CHR$(0) + CHR$(0)
ofn.lpstrFilter = SAdd(filter)


Dann bekomme ich zwar "XB Files (*.x, *.dec)" in der Filterliste angezeigt, trotzdem wird nicht gefiltert und die anderen Filter stehen auch nicht zur auswahl. Er bricht also nach dem ersten chr$(0) ab. bricht er an dieser stelle ab wenn er den string schreibt oder bricht er erst ab wenn ich den Wert übergebe? Und wie gehe ich denn mit Null-Terminated strings um? Ich hab jetzt zwar im Tutorial mal was von zstring gelesen aber genauere informationen hab ich auch nicht gefunden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.07.2005, 10:33    Titel: Antworten mit Zitat

NULL Terminiert heißt - wie die Wortgruppe schon vermuten lässt - das der String mit CHR$(0) abgeschlossen ist, also der CHR$(0) nur EINMAL am Ende steht. Dadurch kann das System das Ende des Strings erkennen um die Länge zu ermitteln.

Versuch bei der Trennung der Einträge mal das PIPE (|) Zeichen, also z.B:

filter = "XB Files (*.x, *.dec)|*.x;*.dec|Text Files (*.txt)|*.txt|All Files (*.*)|*.*" + CHR$(0)
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 10:41    Titel: Antworten mit Zitat

Das Funktioniert leider nicht.

In der win32.hlp steht drin, dass der Filter aus Paaren von null terminated strings besteht. Der erste teil gibt die beschriftung der zweite den Filter an. Beendet wird das ganze mit zwei chr$(0).

Kann es ein das die Stringvariable von Freebasic nicht dafür ausgelegt ist und nach dem ersten chr$(0) nicht mehr weiter schreibt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.07.2005, 10:50    Titel: Antworten mit Zitat

hmm....stimmt, vergiss was ich gesagt habe...ich hab grad mal in der MSDN nachgesehen:

"Pointer to a buffer containing pairs of null-terminated filter strings. The last string in the buffer must be terminated by two NULL characters."

Das heißt dein String ist richtig, aber du mußt an die Funktion nicht den String übergeben, sondern nur einen Pointer zu dem String.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 10:51    Titel: Antworten mit Zitat

Ich hab das Gefühl, dass das chr$(0) garnicht registriert wird.

Code:

dim test as string
test = "test" + chr$(0)
test = test + "test"
print test
sleep 5000



Bringt die Ausgabe:

testtest Das chr$(0) zeichen wurde also einfach überschrieben und nicht berücksichtigt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.07.2005, 10:53    Titel: Antworten mit Zitat

neenee, der CHR$(0) kann nur nicht ausgegeben werden - als Zeichen bzw. Symbol. Probier mal das hier:

Test$ = "ABCD" + CHR$(0) + "ABCD"
PRINT LEN(Test$)

habs jetzt "blind" getippt, sollte aber gehen...
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 11:03    Titel: Antworten mit Zitat

Habs genauso abgeschrieben das Programm gibt eine "4" aus.

Das bestätigt doch meine Theorie das das Chr$(0) nicht von Freebasic strings angenommen wird.

Wenn man ein

Code:
Print test$

Noch dranhängt dibt dieser auch nur ABCD aus das Zweite ABCD wird einfach weggelassen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.07.2005, 11:05    Titel: Antworten mit Zitat

Tja, wie wär's dann damit, dass du die Zeichenkette (Filter usw.) in ein Bytearray stopfst Zeichen(123) As Byte und dann irgendwie einen Pointer da drauf übergibst? Mit Pointern hab ichs nicht so, aber in einem Bytearray könntest du jeden ASCII Wert der Reihe nach ablegen.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.07.2005, 11:07    Titel: Antworten mit Zitat

Fuck....hmmm....dann ist deine Annahme richtig...ich muß jetzt mal erwähnen das ich selbst nicht in FB progge, ich entwickle mit anderen Programmiersprachen in denen sowas aber funktioniert.

Ok, mein Verdacht ist das FB selbst das NULL Zeichen verwendet um seine Strings im Speicher zu terminieren. Ergo würdest du beim anlegen eines solchen Strings zwangsläufig auch nur den Teil bis zum ersten CHR$(0) zurück bekommen.

Eine Idee wäre den String zu dimensionieren wie in QB, möglicherweise geht das, wenn das in FB überhaupt geht, also z.B:

DIM Filter As String * 255

und dann diesen String verwenden. Da dieser in seiner Länge schon festgelegt ist, könnte es funktionieren.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 11:11    Titel: Antworten mit Zitat

Das wird dann aber bei 5 Filtern ein sehr großes Feld und ziemlich viel schreibarbeit. Das kann man ja auch net mit ner schleife lösen.

Auserdem müsste ich ja dann alle asci zeichen einzeln raussuchen und das würde für jeden null string den ich benutze gemacht werden. Wenn man mit der WinApi arbeitet die nur null strings vordert is das glaub ich keine möglichkeit Und auch un den Toturials steht, dass man in Freebasic null strings verwenden kann. Also irgendeine einfachere möglichkeit muss es da doch geben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.07.2005, 11:12    Titel: Antworten mit Zitat

Habs gerade ausprobiert, der String bleibt zwar in seiner Länge (255) erhalten, aber alles nach CHR$(0) verschwindet dennoch.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.07.2005, 11:15    Titel: Antworten mit Zitat

Tja, dann bleibt wohl nur Sebastians erste Idee zu verwenden - was anderes fällt mir nicht ein.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.07.2005, 11:17    Titel: Antworten mit Zitat

Du musst das doch nicht manuell machen, licer!

Code:
SUB StringToByteArray(MyString As String, ByteArray() As Byte)
Redim BArray(LEN(MyString)) As Byte
For i& = 1 TO LEN(MyString)
 BArray(i&-1) = ASC(MID$(MyString, i&,1))
NEXT i&
Redim ByteArray(LEN(MyString)) As Byte
ByteArray() = BArray()
Erase BArray()
End Sub


So in etwa vielleicht??
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!


Zuletzt bearbeitet von Sebastian am 19.07.2005, 11:18, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 11:17    Titel: Antworten mit Zitat

hm naja ich probier noch ein bisschen rum wenn ich eine Lösung gefunden hab wird sie dann gepostet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.07.2005, 11:18    Titel: Antworten mit Zitat

Was hältst du von einer Umwandelsub wie oben?
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 11:21    Titel: Antworten mit Zitat

Die sub wird grad ausprobiert. Aber der Gedanke is nicht schlecht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 19.07.2005, 11:22    Titel: Antworten mit Zitat

Die Sub oben hat kleine Bugs. Folgendes funktioniert aber:

Code:
SUB StringToByteArray(MyString As String, ByteArray() As Byte)
Redim BArray(LEN(MyString)) As Byte
For i& = 1 TO LEN(MyString)
 BArray(i&-1) = ASC(MID$(MyString, i&,1))
NEXT i&
Redim ByteArray(LEN(MyString)) As Byte
FOR i& = 0 TO UBOUND(BArray)
    ByteArray(i&) = BArray(i&)
Next i&
Erase BArray
End Sub

Dim B() AS BYTE
M$ = "BLABLA"
StringToByteArray M$, B()
FOR i% = 0 TO UBOUND(B)
    PRINT B(i%)
Next i&
SLEEP


Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
licer



Anmeldungsdatum: 17.05.2005
Beiträge: 51

BeitragVerfasst am: 19.07.2005, 11:31    Titel: Antworten mit Zitat

Die Idee is toll aber leider wird auch hier chr$(0) einfach verschluckt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz