Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [non VCL] - Fehler bei WM_GETTEXT (https://www.delphipraxis.net/54816-%5Bnon-vcl%5D-fehler-bei-wm_gettext.html)

Rastaman 11. Okt 2005 23:33


[non VCL] - Fehler bei WM_GETTEXT
 
Nabend.
Also ich habe einen Dialog in einer Resource, den ich dann lade.
Inhalt: Edit, Button, Listbox.
Jetzt war mein eigentliches Ziel mit der Listbox experimentieren, allerdings wurde daraus nix, da ich den Text aus dem Edit irgendwie nicht bekomme. Die ID vom Edit ist 102, und obwohl der Code keinen Sinn macht, funktioniert er nicht. Das Edit ist danach leer :(

Delphi-Quellcode:
function DlgFunc(hwnd: HWND; uMsg: UINT; wParam: WPARAM;
                 lParam: LPARAM): Bool; stdcall;
var
  s: PAnsiChar;
begin
  Result := True;
  if uMsg = WM_COMMAND then
  begin
    if HiWord(wParam) = BN_CLICKED then
      if LoWord(wParam) = 3 then
      begin
        edit := GetDlgItem(hwnd, 102);
        SendMessage(edit, WM_GETTEXT, 0, Integer(@s));
        SendMessage(edit, WM_SETTEXT, 0, Integer(@s));
      end;
  end
  else
    Result := False;
end;
Nix is ok - non VCL oh weh :mrgreen:

muRR 11. Okt 2005 23:44

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Da du offensichtlich mit Dialogen arbeitest, solltest du auch MSDN-Library durchsuchenSendDlgItemMessage verwenden. Probier's mal aus.

Rastaman 11. Okt 2005 23:51

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Delphi-Quellcode:
        SendDlgItemMessage(hwnd, 102, WM_GETTEXT, 0, Integer(@s));
        SendDlgItemMessage(hwnd, 101, LB_ADDSTRING, 0, Integer(@s));
Es wird ein Eintrag hinzugefügt in der Listbox(ID = 101), aber der ist immer leer :wall:

//Edit: Grad gesehen:

Zitat:

Using SendDlgItemMessage is identical to retrieving a handle to the specified control and calling the SendMessage function.
Heisst: Die Funktionen entscheiden sich bis auf die Parameter nicht...

muRR 12. Okt 2005 00:15

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Das oben war auch nur ein Formalhinweis. Dein Fehler liegt hier:

MSDN-Library durchsuchenWM_GETTEXT

Zitat:

wParam
Specifies the maximum number of TCHARs to be copied, including the terminating null character.

Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.
Du hast 0 angegeben.

Luckie 12. Okt 2005 00:45

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Auch Edits und Listboxen werden in meinen Tutorials behandelt, warum liest du sie nicht einfach mal?

Rastaman 12. Okt 2005 01:00

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Ja das hat ich auch schon ausprobiert aber da kommt ab 8 Zeichen immer der Error Code 216.
In der Hilfe steht dann

Zitat:

The image file %1 is valid, but is for a machine type other than the current machine.
Image file :wiejetzt:

Luckie 12. Okt 2005 01:43

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Wenn du einen PChar nimmst, dann solltest du vorher mal Speicher reservieren. ;)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: PChar;
begin
  GetMem(s, length(Edit1.Text)+1);
  try
    SendMessage(Edit1.Handle, WM_GETTEXT, length(Edit1.Text)+1, Integer(@s[0]));
    ShowMessage(s);
  finally
    FreeMem(s, length(Edit1.Text)+1);
  end;
end;
Und damit du genau weißt, wie viel Speicher du brauchst, guckst du vorher mit MSDN-Library durchsuchenWM_GETTEXTLENGTH wie lang der Text im Edit ist.

Und noch ein heißer Tipp: Lad dir das PSDK runter: http://www.microsoft.com/downloads/d...displaylang=en Da kannst du imme rmal schenll die Parameter nachschlagen. Selbst ich weiß nie, wie rum die Parameter bei WM_GETTEXT gehören.

Noch was: Für Dialoge gibt es auch spezielle Dialog-Funktionen, die einem das Leben einfacher machen. Hier wäre das zum Beispiel: MSDN-Library durchsuchenGetDlgItemText.

Olli 12. Okt 2005 09:57

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Zitat:

Zitat von Gerrit89
Ja das hat ich auch schon ausprobiert aber da kommt ab 8 Zeichen immer der Error Code 216.

... und wollen wir wetten, daß dies ein Laufzeitfehler von Delphi und nicht ein Windows-Fehlercode ist?! :zwinker:

Luckie 12. Okt 2005 11:29

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Stimmt. 216 ist nämlich die Access Violation und die kommt, weil du für deinen PChar keinen Speicher alloziierst. ;)

Rastaman 12. Okt 2005 18:19

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Probier ich gleich ma aus. Hab vergessen Prog und Dialog zu speichern :roll:

Rastaman 12. Okt 2005 21:12

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Funzt wieder nicht :(
Jetzt habe ich es ohne Dialoge versucht.

Delphi-Quellcode:
Len := SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0);
SendMessage(hWndEdit, WM_GETTEXT, Len, Integer(@s));
SendMessage(hWnd, WM_SETTEXT, Len, Integer(@s));
Funktioniert...bis 8 Zeichen -.-

//Edit: Aha mir ist ein Licht aufgegangen :mrgreen:
Scheint daran zu liegen, dass ein PAnsiChar nur 8 Bytes (Bits?) oder so hat (grobe Vermutung :))
Wenn s: Array [0..255] of Char; dann klappt alles!

Olli 12. Okt 2005 21:48

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Zitat:

Zitat von Gerrit89
//Edit: Aha mir ist ein Licht aufgegangen :mrgreen:
Scheint daran zu liegen, dass ein PAnsiChar nur 8 Bytes (Bits?) oder so hat (grobe Vermutung :))
Wenn s: Array [0..255] of Char; dann klappt alles!

Ein Pointer auf 32bit-Systemen hat 4 Bytes ;) ... aber ist auch egal, mach ein SetLength() für den String zwischen das erste SendMessage() und das 2te.

So:
Delphi-Quellcode:
Len := SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0);
SetLength(s, Len+1);
SendMessage(hWndEdit, WM_GETTEXT, Len, Integer(@s[1]));
// ...
SendMessage(hWnd, WM_SETTEXT, Len, Integer(@s[1]));

Rastaman 12. Okt 2005 22:49

Re: [non VCL] - Fehler bei WM_GETTEXT
 
es geht sogar einfacher :mrgreen:

Delphi-Quellcode:
var
  s: PChar;
//...
  edit1 := GetDlgItem(hwnd, 1);
  edit2 := GetDlgItem(hwnd, 2);
  Length := SendMessage(edit1, WM_GETTEXTLENGTH, 0, 0) + 1;
  SendMessage(edit1, WM_GETTEXT, Length, Integer(@s));
  SendMessage(edit2, WM_SETTEXT, Length, Integer(@s));
Es funktioniert auch wenn s: Array [0..1] of Char; is, was ich irgendwie nich verstehe ^^

scp 12. Okt 2005 23:18

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Ich würde es aber niemals so irgendwo verwenden, nimm einfach nen String und SetLength().
Meine Vermutung: Windows schreibt einfach in irgendeinem Speicher hinter dem Array [0..1] of Char weiter. Und wenn da zufällig was liegt, was wichtig ist, na dann gute Nacht.

Olli 12. Okt 2005 23:25

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Zitat:

Zitat von Gerrit89
es geht sogar einfacher :mrgreen:

Delphi-Quellcode:
var
  s: PChar;
//...
  edit1 := GetDlgItem(hwnd, 1);
  edit2 := GetDlgItem(hwnd, 2);
  Length := SendMessage(edit1, WM_GETTEXTLENGTH, 0, 0) + 1;
  SendMessage(edit1, WM_GETTEXT, Length, Integer(@s));
  SendMessage(edit2, WM_SETTEXT, Length, Integer(@s));
Es funktioniert auch wenn s: Array [0..1] of Char; is, was ich irgendwie nich verstehe ^^

Ja, wenn du meinst du wüßtest es besser, dann mache es am besten beim nächsten Manl komplett ohne im Forum zu fragen. Sorry, aber was du da hingeschrieben hast ist einfach nur Bockmist. Allein die Übergabe als Pointer auf ein PChar ... aua aua aua :wall:

Also wie gesagt, wenn du meinst, daß du es besser weißt, mach es selber, aber eröffne bitte ein Thema in K&T wo du dein Programm vorstellst, damit alle gewarnt sind.

@scp: So ist es!

Rastaman 12. Okt 2005 23:33

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Gerrit89
es geht sogar einfacher :mrgreen:

Delphi-Quellcode:
var
  s: PChar;
//...
  edit1 := GetDlgItem(hwnd, 1);
  edit2 := GetDlgItem(hwnd, 2);
  Length := SendMessage(edit1, WM_GETTEXTLENGTH, 0, 0) + 1;
  SendMessage(edit1, WM_GETTEXT, Length, Integer(@s));
  SendMessage(edit2, WM_SETTEXT, Length, Integer(@s));
Es funktioniert auch wenn s: Array [0..1] of Char; is, was ich irgendwie nich verstehe ^^

Ja, wenn du meinst du wüßtest es besser, dann mache es am besten beim nächsten Manl komplett ohne im Forum zu fragen. Sorry, aber was du da hingeschrieben hast ist einfach nur Bockmist. Allein die Übergabe als Pointer auf ein PChar ... aua aua aua :wall:

Also wie gesagt, wenn du meinst, daß du es besser weißt, mach es selber, aber eröffne bitte ein Thema in K&T wo du dein Programm vorstellst, damit alle gewarnt sind.

@scp: So ist es!

:|
Ich hab nicht behauptet, dass ich es besser weiß. Ohne eure Hilfe wär ich nie so weit gekommen.
Es sind alles ganz normale Aussagen und bei mir tickt jeder völlig durch.
Habt ihr alle was gegen mich oder so?
Ich versteh das mit dem Pointer auch nicht. Du hast es in deinen Quelltexten oben genau so gemacht
Zitat:

Delphi-Quellcode:
...
SendMessage(hWndEdit, WM_GETTEXT, Len, Integer(@s[1]));
...

Ich versteh die Welt nich mehr was das jetz sollte :(

//Edit:

Delphi-Quellcode:
var
  Text: String;
...
  edit1 := GetDlgItem(hwnd, 1);
  edit2 := GetDlgItem(hwnd, 2);
  Length := SendMessage(edit1, WM_GETTEXTLENGTH, 0, 0) + 1;
  SetLength(Text, Length);
  SendMessage(edit1, WM_GETTEXT, Length, Integer(PChar(Text)));
  SendMessage(edit2, WM_SETTEXT, Length, Integer(PChar(Text)));
So gehts es jetzt.
Und nochmal: Ich freue mich über eure Hilfsbereitschaft und finde es schade, dass sich manche durch irgendwelche Sachen sofort aufn Schlips getreten fühlen. Ich hab mich einfach nach dem Codeschnippsel gerichtet, wo Pointer verwendet wurden, es hat funktioniert und war etwas kürzer als das Beispiel. Also wollt ich der Allgemeinheit mitteilen, dass es einfacher geht, weil ich es für korrekt gehalten habe. Wenn du das jetzt innen falschen Hals bekommen hast, dann werd ich mich wohl nächstes Mal deutlicher ausdrücken...

//Edit2: Tippfehler ...

Olli 13. Okt 2005 00:44

Re: [non VCL] - Fehler bei WM_GETTEXT
 
Zitat:

Zitat von Gerrit89
:|
Ich hab nicht behauptet, dass ich es besser weiß.

Ich zitiere: "es geht sogar einfacher :mrgreen:"

Zitat:

Zitat von Gerrit89
Es sind alles ganz normale Aussagen und bei mir tickt jeder völlig durch.

Keine Angst, so ist es nicht. Ich bezog mich einzig auf deine (von mir vermutete) Lernresistenz.

Zitat:

Zitat von Gerrit89
Habt ihr alle was gegen mich oder so?

Dank Waffengesetz: Nein :mrgreen:

Zitat:

Zitat von Gerrit89
Ich versteh das mit dem Pointer auch nicht. Du hast es in deinen Quelltexten oben genau so gemacht

... und gesagt, daß es ein String sein soll. Bei einem String in Delphi (üblicherweise LongString/AnsiString) ist das erste Zeichen s[1] und damit der Pointer auf das erste Zeichen @s[1] vom Typ PChar.

Zitat:

Zitat von Gerrit89
Ich versteh die Welt nich mehr was das jetz sollte :(

Verstehst du's jetzt? Der Parameter muß auf einen Puffer zeigen der die Zeichenkette dann bekommt. Deshalb ist es korrekt entweder einen Puffer zu allozieren (GetMem/GetMemory usw) und einer PChar-Variablen zuzuweisen, oder - einfacher - die Länge eines Strings entsprechend zu erweitern (entspricht dem Allozieren) und dann einen Pointer auf das erste Zeichen, eben @s[1] zu übergeben.

Was du gemacht hast, ist, einen Pointer auf einen (nicht-zugewiesenen) Pointer auf ein Zeichen zu übergeben. Das kann zwar gutgehen, wie man bei dir gesehen hat, dies ist aber eher eine Ausnahme bzw. Zufall. Auf alle Fälle ist es Mist!

Zitat:

Zitat von Gerrit89
Delphi-Quellcode:
var
  Text: String;
...
  edit1 := GetDlgItem(hwnd, 1);
  edit2 := GetDlgItem(hwnd, 2);
  Length := SendMessage(edit1, WM_GETTEXTLENGTH, 0, 0) + 1;
  SetLength(Text, Length);
  SendMessage(edit1, WM_GETTEXT, Length, Integer(PChar(Text)));
  SendMessage(edit2, WM_SETTEXT, Length, Integer(PChar(Text)));

Das entspricht exakt meinem Vorschlag, wobei PChar(s) eine Variante ist, die ich aus verschiedenen Gründen nicht mag, die aber auch ihre Berechtigung hat. Für Details suchst du nach Motzis (Manuel Pöter) String-Tutorial. Ich bevorzuge @s[1], es ist aber an dieser Stelle äquivalent!

Zitat:

Zitat von Gerrit89
Und nochmal: Ich freue mich über eure Hilfsbereitschaft und finde es schade, dass sich manche durch irgendwelche Sachen sofort aufn Schlips getreten fühlen. Ich hab mich einfach nach dem Codeschnippsel gerichtet, wo Pointer verwendet wurden, es hat funktioniert und war etwas kürzer als das Beispiel. Also wollt ich der Allgemeinheit mitteilen, dass es einfacher geht, weil ich es für korrekt gehalten habe. Wenn du das jetzt innen falschen Hals bekommen hast, dann werd ich mich wohl nächstes Mal deutlicher ausdrücken...

Kein Problem. Ich ging von Lernresistenz aus. Hast ja nachgewiesen, daß dem nicht so ist. :cheers:

Ganz schön spät für eine(n) 5jährige(n) ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz