AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [non VCL] - Fehler bei WM_GETTEXT
Thema durchsuchen
Ansicht
Themen-Optionen

[non VCL] - Fehler bei WM_GETTEXT

Ein Thema von Rastaman · begonnen am 12. Okt 2005 · letzter Beitrag vom 13. Okt 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#11

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 12. Okt 2005, 22:12
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
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!
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#12

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 12. Okt 2005, 22:48
Zitat von Gerrit89:
//Edit: Aha mir ist ein Licht aufgegangen
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]));
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#13

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 12. Okt 2005, 23:49
es geht sogar einfacher

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 ^^
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#14

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 13. Okt 2005, 00:18
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 13. Okt 2005, 00:25
Zitat von Gerrit89:
es geht sogar einfacher

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

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!
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#16

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 13. Okt 2005, 00:33
Zitat von Olli:
Zitat von Gerrit89:
es geht sogar einfacher

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

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 ...
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: [non VCL] - Fehler bei WM_GETTEXT

  Alt 13. Okt 2005, 01:44
Zitat von Gerrit89:

Ich hab nicht behauptet, dass ich es besser weiß.
Ich zitiere: "es geht sogar einfacher "

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 von Gerrit89:
Habt ihr alle was gegen mich oder so?
Dank Waffengesetz: Nein

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 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 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 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.

Ganz schön spät für eine(n) 5jährige(n)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 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