Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

10.01.2008, 11:28

text wird nicht ausgegeben..

also. ich hab mir ne textbox klasse geschrieben. im moment versuche ich mir eine funktion zu schreiben die text anhängt..

mit GetWindowText() hol ich mir das was schon drinnen ist, und will es dann einfach " hallo123" hinzufügen, und das dann in die textbox schreiben.. aber irgendwie funktioniert das nicht so ganz..

compiler meckert nicht... es passiert nur ganz einfach nix.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case BN_CLICKED:
                {
                    LPCWSTR txtText = new wchar_t;
                    LPWSTR buffer   = new wchar_t;

                    if(lParam == (LPARAM)btn->GetHandle())
                    {
                        GetWindowText(txt->GetHandle(), const_cast<LPWSTR>(txtText), 128);
                        swprintf(buffer, 128, L"%s hallo123", txtText);
                        SetWindowText(txt->GetHandle(), txtText);
                    }
                                        // ...

                }
            }
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

10.01.2008, 11:33

hallo

C-/C++-Quelltext

1
2
LPCWSTR txtText = new wchar_t;
LPWSTR buffer    = new wchar_t;


was willst du damit erreichen?
lösung: grundlagenbuch rausholen und bei arrays aufschlagen!
www.virtual-maxim.de <-- C++ Einführung, Spieleprogrammierung-Artikel u.v.m.

Purga Scriptengine <-- eigene Scriptspache.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

10.01.2008, 11:37

Dass dein Programm nicht abstürzt, grenzt an ein Wunder.
wchar_t ist ein Zeichen (gleiches gilt für char). Du reservierst also Speicher für 1 Zeichen und behauptest beim Aufruf swprintf, es wäre genug Speicher für 128 Zeichen da.
Den Speicher gibst du auch nirgendwo wieder frei.
Dabei würde es ein normales Array tun oder new wchar_t[128].

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

10.01.2008, 11:44

... mit strings komme ich einfach nicht klar..

dass ich den speicher mit new reserviere is ja nicht falsch oder? habs auf new wchar_t[128]; geändert..

den speicher geb ich nicht frei, weil da ja nix passiert.. also .. ich mach das programm nach 2 sekunden wieder zu .. delete mach ich dann noch hin ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

5

10.01.2008, 12:34

Wenn du dein Ergebnis-String in buffer (der auch 128 Bytes groß sein muss) schreibst, musst du ihn auch von dort wieder ausgeben.

Und wenn du tatsächlich 128 Bytes in buffer schreibst, wird dir die 0 am Ende fehlen, so dass SetWindowText wieder nicht funktioniert.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

6

10.01.2008, 14:24

Also, wie hier ja schon angemerkt wurde, reservierst du mit new Platz für ein Element des angegebenen Types. Mit new [] Platz für die angegebene Anzahl von Elementen des angegebenen Types.

Passend zu new gibt es delete zum löschen und zu new [] gibt es delete [].

Dann muss du auch SetWindowText buffer übergeben (in den du mit sprintf geschrieben hast), um nicht den alten Text wieder zu sehen.

Dann gibt es die Möglichkeit die Länge des Textes, den du mit GetWindowText bekommst heraus zu bekommen. Genau genommen mehrere, die eine empfehlenswerter als die andere ;)
GetWindowTextLength ist eine davon. Wenn nicht -1 zurück gegeben wird, kannst du einen Array von Zeichen mit der Größe der zurückgegebenen Zahl + 1 anlegen (Terminierungszeichen).

Dein Buffer muss dann nur 9 Zeichen Länger sein, um " hallo123" ebenfalls beinhalten zu können. So verschwendest du relativ wenig Speicher und hast auf jedenfall genug Platz für den kompletten Fenstertext.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

7

11.01.2008, 10:21

so.. ich glaub ich hab das jetz einigermaßen verstanden.. (sry.. strings sind ein graus für mich, und ich werds mir noch genau anschaun!)

aber im moment versteh ich nicht wieso das nicht geht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Forms::TextBox::AppendText(LPCWSTR lpText)
{
    LPWSTR buffer = new wchar_t[2048];

    swprintf(buffer, 2048, L"%s%s", m_lpText, lpText);

    SetWindowText(m_hwndTextBox, buffer);

    swprintf(m_lpText, 2048, L"%s", buffer); // zugriffsverletzung


    delete buffer;
    buffer = NULL;
} // AppendText();


dort wo ich m_lpText den wert von buffer übergeben will, schmeisst mir der compiler eine zugriffsverletzung..

m_lpText:

C-/C++-Quelltext

1
2
3
// ...

m_lpText = new wchar_t[2048];
// ...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

8

11.01.2008, 10:27

Bereits beim 1. Aufruf oder erst beim 2.?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

9

11.01.2008, 10:29

beim 2ten
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

10

11.01.2008, 10:40

Na dann mach mal folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Forms::TextBox::AppendText(const wchar_t* const ptr_text)
{
    const std::size_t size(wcslen(ptr_text) + wcslen(m_lpText) + 1);
    wchar_t* ptr_buffer(new wchar_t[size]);

    swprintf(ptr_buffer, size, L"%s%s", m_lpText, ptr_text);

    SetWindowText(m_hwndTextBox, ptr_buffer);

    wcsncpy(m_lpText, ptr_buffer, 2048);
    
    delete ptr_buffer;
} // AppendText(); 
jetzt dürfte keine AV mehr kommen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige