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

21

11.01.2008, 15:10

? Was? Nein ^^ Es wird nur das verändert auf das der Zeiger zeigt ...
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

22

11.01.2008, 20:19

also..

ich hab das jetzt mit GetWindowText() versucht:

mach ich es mit meiner member variable m_lpText:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// -------------------------------------------------------------------

// Name:    AppendText()

// Desc:    Appends text to the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::AppendText(LPCWSTR lpText)
{
    const unsigned int size(wcslen(lpText) + wcslen(m_lpText) + 1);

    LPWSTR buffer = new wchar_t[size];

    int strsize = swprintf(buffer, size, L"%s%s", m_lpText, lpText);
    SetWindowText(m_hwndTextBox, buffer);

              // return value ist 0 (bei dieser funktion ein fehler)

    int ret = GetWindowText(m_hwndTextBox, m_lpText, 2048);
    
    delete buffer;
} // AppendText()




definiere ich einfach eine neue:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// -------------------------------------------------------------------

// Name:    AppendText()

// Desc:    Appends text to the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::AppendText(LPCWSTR lpText)
{
    const unsigned int size(wcslen(lpText) + wcslen(m_lpText) + 1);

    LPWSTR buffer = new wchar_t[size];

    int strsize = swprintf(buffer, size, L"%s%s", m_lpText, lpText);
    SetWindowText(m_hwndTextBox, buffer);

               // alles ok.. funktion kopiert die chars in die var

    LPWSTR test= new wchar_t[size];
    int ret = GetWindowText(m_hwndTextBox, test, 2048);
    
    delete buffer;
} // AppendText()



ich flehe euch an, bitte sagt mir was ich falsch mache ;_;


es funktioniert nichtmal das:

C-/C++-Quelltext

1
m_lpText[0] = 'x';


sofort gibts ne zugriffsverletzung! das gibts ja nicht!!


edit:
da fällt mir ein..

ich rufe VOR AppendText() noch Text() auf...


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// irgendwo ..

txtbox->Text(L"hallooo");
txtbox->AppendText(L"1");

// -------------------------------------------------------------------

// Name:    Text()

// Desc:    Sets the text inside of the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::Text(LPCWSTR lpText)
{
    SetWindowText(m_hwndTextBox, lpText);
    m_lpText = const_cast<LPWSTR>(lpText);
} // Text()



// -------------------------------------------------------------------

// Name:    AppendText()

// Desc:    Appends text to the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::AppendText(LPCWSTR lpText)
{
    const unsigned int size(wcslen(lpText) + wcslen(m_lpText) + 1);

    LPWSTR buffer = new wchar_t[size];

    int strsize = swprintf(buffer, size, L"%s%s", m_lpText, lpText);
    SetWindowText(m_hwndTextBox, buffer);

    int ret = GetWindowText(m_hwndTextBox, m_lpText, 2048);

    delete buffer;
} // AppendText()


die Text() wird noch ganz normal ausgeführt...
erst in AppendText() is ZV
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

23

12.01.2008, 01:22

Zitat von »"$nooc"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// irgendwo ..

txtbox->Text(L"hallooo");
txtbox->AppendText(L"1");

// -------------------------------------------------------------------

// Name:    Text()

// Desc:    Sets the text inside of the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::Text(LPCWSTR lpText)
{
    SetWindowText(m_hwndTextBox, lpText);
    m_lpText = const_cast<LPWSTR>(lpText);
} // Text()


die Text() wird noch ganz normal ausgeführt...
erst in AppendText() is ZV

Du wunderst dich ernsthaft, wieso es Probleme gibt, wenn du derart bedenkenlos nen const_cast anwendest :shock:
Mehr sag ich ma nich dazu, es springt einem geradezu ins Auge was da schief läuft

24

12.01.2008, 11:16

ohoh ^^ Das wäre vllt gut gegangen, wenn du L"hallo" als Variable angelegt hättest, aber selbst dann wäre es gefährlich gewesen :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// -------------------------------------------------------------------

// Name:    SetText()

// Desc:    Sets the text inside of the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::SetText(std::wstring const& text)
{
    ::SetWindowTextW(m_hWndTextBox, text.c_str());
}

// -------------------------------------------------------------------

// Name:    GetText()

// Desc:    Gets the text inside of the textbox.

// -------------------------------------------------------------------

void Forms::TextBox::GetText(std::wstring& text)
{
    const std::size_t size(::GetWindowTextLength(m_hWndTextBox) + 1);
    wchar_t* ptr_text(new wchar_t[size]());
    ::GetWindowTextW(m_hWndTextBox, ptr_text, size);
    text = ptr_text;
    delete [] ptr_text;
}

// -------------------------------------------------------------------

// Name:    AppendText()

// Desc:    Appends text to textbox content.

// -------------------------------------------------------------------

void Forms::TextBox::AppendText(std::wstring const& text)
{
    std::wstring text_current;
    GetText(text_current);

    const std::size_t size(text.length() + text_current.length() + 1);
    SetWindowText(m_hWndTextBox, (text + text_current).c_str());
}
... so wäre es doch etwas logischer, meinst du nicht? Und m_lpText kannst du dir dann auch direkt sparen!
Deine Funktion ist prompt wesentlich strukturierter usw!

PS: new[] kann ausschließlich durch delete [] freigegeben werden! new[] und delete zu mischen führ zu undefiniertem Verhalten! new kann nur durch delete freigegeben werden.(auch hier führ new und delete[] zu undefiniertem Verhalten). Auch wenn es jetzt hier nicht vorkommt. EInen Zeiger auf NULL zu prüfen ist unsinnig, da delete 0 definiert ist. Es tut einfach garnix. Von d.h. sind so Konstrukte im Destruktor Schwachsinn.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
foo::~foo()
{ 
    if (m_pointer != NULL)
    {
        delete m_pointer;
        m_pointer = NULL;
    }
}
. Ein einfaches

C-/C++-Quelltext

1
2
3
4
foo::~foo()
{
    delete m_pointer;
}
führt zum gleichen Ergebnis (okay die überflüssige NULL-Zuweisung findet nicht statt ...) und ist kürzer. Das aber nur nebenbei ;)
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

25

12.01.2008, 12:25

ok, ich werd mir das mir das anschauen, sobald ich zeit hab.. :D

@ grek:
wieso willst du mir nicht verraten was ich mit dem const_cast falsch mache, damit ich das zum beispiel NICHT nochmal mache?
das is so ne komische angewohnheit hier im forum.
ich verstehs nämlich nicht.

mein gedankenganz lautet so..

ich übergeb der funktion einen const string, und will diesen in einer variable speichern, die allerdings nicht const ist.. und darum mach ich nen const cast, damit die variable den wert annehmen kann.

WAS daran falsch ist weiss ich nicht, würde mich aber brennend interessieren um aus solchen fehlern zu lernen..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

26

12.01.2008, 13:10

Hmm const_cast ... das ist wirklich nur einzusetzen, wenn es garnicht anderes geht (2-3 Fälle au total) ...
In dem Fall den du da demonstrierst ist es aber sehr einfach, was du falsch machst.
Dein konstanter Zeiger zeigt auf die Zeichenkette "hallooo", doch wo befindet die sich denn, wenn dann die Funktion abgearbeitet ist? Der Zeiger zeigt irgendwo hin, nur ist da nix mehr. Deswegen musst du die Zeichenkette kopieren! Dann kannst du dich darauf verlassen, dass dein Zeiger auf eine gültige Zeichenkette zeigt.
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

27

12.01.2008, 13:36

ach du heilige.. an das hab ich gar nicht gedacht ^^


wie würde es aussehen, wenn ich den LPWSTR string den ich als parameter übergebe in meine m_lpText variable KOPIEREN will :?:


*edit:

wie kann ich std::wstring in LPWSTR casten? const_cast is ja ne schlechte variante...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

28

12.01.2008, 16:13

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

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

29

12.01.2008, 17:11

vom Prinzip her so (wobei ich wcscpy, falls es überhaupt so heisst, ewig nicht verwendet hab und auch nicht in der Doku geschaut hab - also reiner Pseudocode und nix für C&P):

C-/C++-Quelltext

1
2
3
std::wstring text = L"text";
LPWSTR str = new WCHAR[text.size()];
wcscpy(str, text.c_str(),...);


Warum nimmst du eigentlich nicht gleich std::wstring in deiner Klasse?

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

30

12.01.2008, 17:22

die funktion GetWindowText() übernimmt leider LPWSTR .. und die funktion ist WinApi
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige