|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OmaUte
Anmeldungsdatum: 07.07.2012 Beiträge: 3
|
Verfasst am: 07.07.2012, 17:34 Titel: Auf Textbox zugreifen. |
|
|
Hallo,
wer von euch lieben Knaben kann mir kurz behilflich sein? Ich versuche seit Stunden, einen Text in eine Textbox zu schreiben und/oder auszulesen.
Die Funktion "gen" soll dies bewerkstelligen. Der Code davor ist nur zur Übersicht der Deklarationen und Includes. Die Buttons arbeiten ja schon wie sie sollen. Meine Vermutung ist, dass ich irgendwas mit dem Handle nicht verstehe und dem entsprechend das Falsche angebe.
Vielen Dank.
Hier mein Code:
Code: | #Include once "windows.bi"
Const WND_CLASS_NAME0 = "my_wnd_class_name_0"
Const IDC_EDIT1 = 2000
const IDC_EDIT0 = 2001
const IDC_BUTTON1 = 2002
const IDC_BUTTON0 = 2003
Declare sub register_classes
declare function message_loop as integer
declare function wnd_proc0(byval thiswnd as hwnd, byval message as uinteger, byval w_param as wparam, byval l_param as lparam) as lresult
declare function create_wnd0 as hwnd
declare sub create_wnd_content0(byval parent as hwnd)
Declare Function Gen As Integer
dim shared instance as hmodule
dim shared h_font as HFONT
instance = GetModuleHandle(null)
register_classes
h_font = CreateFont(-13, 0, 0, 0, FW_NORMAL, 0, _
0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, _
DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, "Arial")
create_wnd0
end message_loop
function wnd_proc0(byval thiswnd as hwnd, byval message as uinteger, byval w_param as wparam, byval l_param as lparam) as lresult
select case message
case WM_COMMAND
select case loword(w_param)
case IDC_BUTTON0 '' button "Generate"
gen
case IDC_BUTTON1 '' button "Exit"
DestroyWindow thiswnd
End
end select
case WM_CREATE
create_wnd_content0 thiswnd
case WM_CLOSE
DestroyWindow thiswnd
case WM_DESTROY:
PostQuitMessage 0
case else
return DefWindowProc(thiswnd, message, w_param, l_param)
end select
return 0
end function
function create_wnd0 as hwnd
dim wnd as hwnd
wnd = CreateWindowEx(&h00020101, WND_CLASS_NAME0, "KeyGen", &h14CF0000, CW_USEDEFAULT, CW_USEDEFAULT, 228, 141, null, null, instance, null)
ShowWindow wnd, SW_SHOWNORMAL
UpdateWindow wnd
return wnd
end function
Sub create_wnd_content0(byval parent as hwnd)
dim wnd as hwnd
wnd = CreateWindowEx(&h00000000, "Button", "Generate", &h50012F00, 8, 72, 96, 24, parent, cast(hmenu, IDC_BUTTON0), instance, null)
SendMessage wnd, WM_SETFONT, cast(wparam, h_font), TRUE
wnd = CreateWindowEx(&h00000000, "Button", "Exit", &h50012F00, 112, 72, 96, 24, parent, cast(hmenu, IDC_BUTTON1), instance, null)
SendMessage wnd, WM_SETFONT, cast(wparam, h_font), TRUE
wnd = CreateWindowEx(&h00000200, "Edit", "", &h50010080, 8, 8, 200, 24, parent, cast(hmenu, IDC_EDIT0), instance, null)
SendMessage wnd, WM_SETFONT, cast(wparam, h_font), TRUE
wnd = CreateWindowEx(&h00000200, "Edit", "", &h50010080, 8, 40, 200, 24, parent, cast(hmenu, IDC_EDIT1), instance, null)
SendMessage wnd, WM_SETFONT, cast(wparam, h_font), TRUE
end sub
sub register_classes
dim wc as WNDCLASS
with wc
.cbClsExtra = 0
.cbWndExtra = 0
.hbrBackground = cast(hbrush, COLOR_3DFACE + 1)
.hCursor = LoadCursor(null, byval IDC_ARROW)
.hIcon = LoadIcon(null, byval IDI_APPLICATION)
.hInstance = instance
.lpszMenuName = null
.style = CS_PARENTDC or CS_DBLCLKS
end with
wc.lpfnWndProc = @wnd_proc0
wc.lpszClassName = strptr(WND_CLASS_NAME0)
RegisterClass @wc
end sub
'' message loop.
function message_loop as integer
dim message as MSG
While (GetMessage(@message, null, 0, 0) <> false)
TranslateMessage @message
DispatchMessage @message
wend
DeleteObject h_font
return message.wParam
end function
'' End of file.
Function gen As Integer
Dim lnge As Integer
Dim As lptstr txt1
SendMessage (IDC_EDIT0, WM_GETTEXT, 5, txt1)
Print txt1
Return 0
End Function |
|
|
Nach oben |
|
|
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 07.07.2012, 21:01 Titel: |
|
|
Ja. Du übergibts nicht das Window Handle, sondern die ID des Buttons im Dialog.
Außerdem stellst du keinen Speicher bereit, in den Windows den Text schreiben könnte.
Code: | Function gen(hWnd AS HWND) As Integer
Var textlen = SendDlgItemMessage(hWnd, IDC_EDIT0, WM_GETTEXTLENGTH, 0, 0) ' Textlänge abfragen
Dim text As ZString Ptr = Allocate(textlen + 1) ' Speicher reservieren, ein Byte mehr wegen NUL-Byte am Ende
SendDlgItemMessage (hWnd, IDC_EDIT0, WM_GETTEXT, textlen + 1, text) ' Text in reservierten Speicher schreiben lassen
Print *text ' Ausgeben
DeAllocate(text) ' Speicher freigeben
Return 0
End Function |
Code: | case IDC_BUTTON0 '' button "Generate"
gen(thiswnd) |
So sollte es gehen. |
|
Nach oben |
|
|
OmaUte
Anmeldungsdatum: 07.07.2012 Beiträge: 3
|
Verfasst am: 07.07.2012, 22:28 Titel: |
|
|
Vielen Dank! Es geht
Was ich noch nicht verstehe , wie assioziiert er 'thiswnd' mit der Textbox? |
|
Nach oben |
|
|
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 08.07.2012, 00:02 Titel: |
|
|
In Dialogfeldern haben die Steuerelemente IDs.
Jedes Steuerelement ist ein Window, wie auch das Fenster selbst. Jedes hat also ein Window Handle.
Ursprünglich hast du SendMessage verwendet. Das wäre auch gegangen, hättest du der Funktion das Window Handle der Textbox übergeben. Stattdessen hast du die ID übergeben.
Die Funktion GetDlgItem liefert das Window Handle eines Steuerelements eines Dialogfelds wenn du Window Handle des Dialogfelds und ID des Steuerelements übergibst. Die Funktion SendDlgItemMessage, die ich jetzt hier verwende, kombiniert im Prinzip SendMessage und GetDlgItem. Der Funktion übergebe ich das Window Handle des Dialogfelds (thiswnd, als Parameter "hWnd" der gen-Funktion übergeben) und die ID der Textbox (IDC_EDIT0):
SendDlgItemMessage(hWnd, IDC_EDIT0, WM_GETTEXT, textlen + 1, text) |
|
Nach oben |
|
|
OmaUte
Anmeldungsdatum: 07.07.2012 Beiträge: 3
|
Verfasst am: 08.07.2012, 02:36 Titel: |
|
|
Stimmt, ich konnte es jetzt nachvollziehen und habe gleich etwas rumgespielt und konnte von jeden Element den Text auslesen und ändern.
Dankeschön |
|
Nach oben |
|
|
|
|
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.
|
|