Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Kein Betreff angegeben

MRPSV1 / 4 Antworten / Baumansicht Nickles

hi
ich habe einen texteditor programmiert und jetzt ein problem. Ich möchte überprüfen ob etwas in dem textfenster verändert wurde und habe das so gemacht:

...
char *edittext = "text";
HWND edit;
edit = CreateWindowEx(
WS_EX_CLIENTEDGE,
"edit",
edittext,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
CW_USEDEFAULTCW_USEDEFAULT,
544,
375,
frame,
NULL,
hThisInstance,
NULL
);
...
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
...
case WM_CLOSE:{
char *buffer;
int buffer_laenge;
buffer_laenge = GetWindowTextLength(edit);
buffer = new char[buffer_laenge];
GetWindowText(edit,buffer,buffer_laenge+1);
if(edittext != buffer){
int antwort = MessageBox(NULL,"Es wurde etwas verändert.Wollen Sie die Veränderung speichern?", "Speichern",MB_YESNOCANCEL|MB_DEFBUTTON1);
}
DestroyWindow(hwnd);
return 0;
break;
}
...
}
}

So und das problem ist das der dialog immer kommt weil edittext und buffer nicht gleich obwohl nichts im textfenster verändert wurde.Ich habe auch mal buffer und editfenter mal ausgeben lassen und die länge auch und sie sind von der länge und vom text beide gleich ich habe auch einfach mal das dann so ausprobiert:
...
char *edittext = "text";
HWND edit;
edit = CreateWindowEx(
WS_EX_CLIENTEDGE,
"edit",
edittext,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
CW_USEDEFAULTCW_USEDEFAULT,
544,
375,
frame,
NULL,
hThisInstance,
NULL
);
...
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
...
case WM_CLOSE:{
char *buffer;
buffer = "text";
if(edittext != buffer){
int antwort = MessageBox(NULL,"Es wurde etwas verändert.Wollen Sie die Veränderung speichern?", "Speichern",MB_YESNOCANCEL|MB_DEFBUTTON1);
}
DestroyWindow(hwnd);
return 0;
break;
}
...
}
}

und der obenstehende code funktioniert richtig...irgentwas ist glaub ich mit der GetWindowText funktion.weis jemand was los ist??

bei Antwort benachrichtigen
mr.escape MRPSV1 „Kein Betreff angegeben“
Optionen

Mit
if(edittext != buffer)
vergleichst du nicht die inhalte in den zugewiesenen speicherbereichen, sondern lediglich die startadressen. Was du brauchst, ist eine funktion wie
int strcmp ( const char * string1, const char * string2 );
oder mit längenangabe
int strncmp(const char *s1, const char *s2, size_t n);
wobei n der kleine wert aus strlen(edittext) und strlen(buffer) sein sollte.
Damit werden die daten verglichen.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
MRPSV1 mr.escape „Mit if edittext ! buffer vergleichst du nicht die inhalte in den zugewiesenen...“
Optionen

ok ich probiers. aber noch ne frage warum hat das denn im unteren code funktioniert weil da hab ich doch auch zeiger verwendet??

bei Antwort benachrichtigen
mr.escape MRPSV1 „ok ich probiers. aber noch ne frage warum hat das denn im unteren code...“
Optionen

Weil der compiler so clever ist und die zeichenkettenkonstante "text" nur einmal anlegt und somit bei beiden zuweisungen
char *edittext = "text";
buffer = "text";

die zeiger eben auf die selbe adresse zeigen. Würdest du versuchen, den inhalt zu ändern (buffer[0]='l';), dann käme ein compiler- oder laufzeitfehler.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
MRPSV1 mr.escape „Weil der compiler so clever ist und die zeichenkettenkonstante text nur einmal...“
Optionen

achso und danke mr.escape das mit strcmp hat funktioniert.
ciao

bei Antwort benachrichtigen