GDI+ - Deklaration funktioniert nur innerhalb einer Funktion?

randomize

Erfahrenes Mitglied
Hallo,

ich stehe gerade etwas auf dem Schlauch, warum kann ich z. B. einen Pen wie folgt benutzen
Code:
void Function ()
{ ...
  Pen p (Color (255, 255, 255), 1.0f);
  g.DrawLine (&p, ...);
  ...
}
aber nicht wenn er außerhalb der Funktion deklariert wird, a la
Code:
Pen p (Color (255, 255, 255), 1.0f);
void Function ()
{ ...
  g.DrawLine (&p, ...);
  ...
}
Im zweiten Fall wird einfach garnichts gezeichnet. => ?

Einen int kann ich doch auch außerhalb einer Funktion deklarieren und es funktioniert, warum funktioniert das hier jedoch nicht? Vielleicht missachte ich ja was grundsätzliches.

Danke schon mal...

EDIT
Die Frage geht offenbar doch noch weiter, ich bin grad vollends verwirrt.
Ich hab es gerade mal mit einem int ausprobiert, offenbar ist es möglich zwei ints mit gleichem Namen einmal vor und einmal innerhalb der Funktion zu deklarieren. Ich hätte irgendwie einen Fehler a la multiple declaration etc erwartet. Für die Funktion scheint auch nur der int innerhalb der Funktion zu gelten.
Also:
Code:
int i = 5;
ButtonClick ()
{
  gebe_i_aus => wird als 5 ausgegeben
}
aber
Code:
int i = 5;
ButtonClick ()
{
  int i = 11;
  gebe_i_aus => wird als 11 ausgegeben
}
Für jede Hilfe bin ich dankbar...
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Hallo,

was ist Pen denn für ein Datentyp?

In der VCL gibt es einen TPen, und der sollte wie alle Objekte, dynamisch angelegt werden.
C++:
TPen* p = new TPen();
p->...
...
Dann sollte es auch egal sein, wo der Pen definiert wird. Um auf den grundsätzlichen Fehler hinzuweisen ;-)

wegen dem int:
Der globale int Wert wird "verdeckt" durch den lokalen...
"Verdeckung" oder "Überdeckung" sollten hierfür Schlagworte sein.

MfG Turri
 

randomize

Erfahrenes Mitglied
Hi,
das mit dem int habe ich auch gerade herausgefunden... :) War mir aber neu, dass das so geht.

Ich meinte den Pen von GDI+, nicht den von Canvas. Ok, also der grundsätzliche Fehler ist also, dass ich ein Objekt wollte und es nicht als Zeiger definiert habe, es geht also nicht anders? Übrigens mach ich wohl jetzt schon wieder was falsch, denn direkt mit new initialisieren gibt mir eine Zugriffsverletzung. Den Zeiger kann ich zwar global deklarieren, aber p = new Pen (Color (255, 255, 255), 1.0f); habe ich nun in einer Init-Funktion stehen. Das müsste doch auch ohne extra Funktion funktionieren... Wie, ist ein bisschen over my head, glaube ich im Moment. ;)

Vielen dank aber, immerhin ist meine ursprüngliche Frage schon mal geklärt! :)