Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 16.07.2005, 11:41 Titel: getopenfilename |
|
|
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 |
|
|
PeterHarder
Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
|
Verfasst am: 16.07.2005, 18:51 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 10:00 Titel: |
|
|
Danke das bringt mich schon um einiges weiter . 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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.07.2005, 10:33 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 10:41 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.07.2005, 10:50 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 10:51 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.07.2005, 10:53 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 11:03 Titel: |
|
|
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
Noch dranhängt dibt dieser auch nur ABCD aus das Zweite ABCD wird einfach weggelassen. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.07.2005, 11:07 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 11:11 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.07.2005, 11:15 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 19.07.2005, 11:17 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 11:17 Titel: |
|
|
hm naja ich probier noch ein bisschen rum wenn ich eine Lösung gefunden hab wird sie dann gepostet. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 11:21 Titel: |
|
|
Die sub wird grad ausprobiert. Aber der Gedanke is nicht schlecht. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 19.07.2005, 11:22 Titel: |
|
|
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 |
|
|
licer
Anmeldungsdatum: 17.05.2005 Beiträge: 51
|
Verfasst am: 19.07.2005, 11:31 Titel: |
|
|
Die Idee is toll aber leider wird auch hier chr$(0) einfach verschluckt. |
|
Nach oben |
|
|
|