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:

Auf Textbox zugreifen.

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OmaUte



Anmeldungsdatum: 07.07.2012
Beiträge: 3

BeitragVerfasst am: 07.07.2012, 16:34    Titel: Auf Textbox zugreifen. Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 07.07.2012, 20:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OmaUte



Anmeldungsdatum: 07.07.2012
Beiträge: 3

BeitragVerfasst am: 07.07.2012, 21:28    Titel: Antworten mit Zitat

Vielen Dank! Es geht lächeln
Was ich noch nicht verstehe , wie assioziiert er 'thiswnd' mit der Textbox? geschockt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 07.07.2012, 23:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OmaUte



Anmeldungsdatum: 07.07.2012
Beiträge: 3

BeitragVerfasst am: 08.07.2012, 01:36    Titel: Antworten mit Zitat

Stimmt, ich konnte es jetzt nachvollziehen und habe gleich etwas rumgespielt und konnte von jeden Element den Text auslesen und ändern.
Dankeschön lächeln
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 -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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