Polyline von der GDi32 funktioniert nicht so...

Für allgemeine Fragen zur Programmierung mit PureBasic.
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Polyline von der GDi32 funktioniert nicht so...

Beitrag von funker »

Hallo, guten Tag.
Es wird im CanvasGadget nur eine waagerechte Linie gezeichnet von 0,0 - 200,0.
Es sollen aber 3 Linienzüge werden. Wo liegt bitte der Fehler.

Danke.
Gruss

Code: Alles auswählen

Global hdc.l,poly.l

*poly=AllocateMemory(24)

PokeL(*poly,10)
PokeL(*poly+4,10)
PokeL(*poly+8,100)
PokeL(*poly+12,150)
PokeL(*poly+16,190)
PokeL(*poly+20,100)

Declare asm_polyline()

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)
    
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown 
          hdc = StartDrawing(CanvasOutput(0))
          asm_polyline()  
          StopDrawing()         
        EndIf
      EndIf        
    Until Event = #PB_Event_CloseWindow
  EndIf
  
  Procedure asm_polyline()  
    Polyline_(hdc,@poly,3)
  EndProcedure 
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von STARGÅTE »

Ganz Einfach, Du verwendest oben *poly, aber unten nur poly.
Außerdem ist hdc eine Integer und keine Long !

Ein EnableExplicit hätte geholfen.

Code: Alles auswählen

EnableExplicit

Global hdc.i, *poly

*poly=AllocateMemory(24)

PokeL(*poly,10)
PokeL(*poly+4,10)
PokeL(*poly+8,100)
PokeL(*poly+12,150)
PokeL(*poly+16,190)
PokeL(*poly+20,100)

Declare asm_polyline()

Define Event.i

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)
    
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown 
          hdc = StartDrawing(CanvasOutput(0))
          asm_polyline()  
          StopDrawing()         
        EndIf
      EndIf        
    Until Event = #PB_Event_CloseWindow
  EndIf
  
  Procedure asm_polyline()  
    Polyline_(hdc,*poly,3)
  EndProcedure 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von Danilo »

Oder Du nimmst ein Array dafür und sparst Dir die umständlichen PokeL's.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von funker »

Jup, danke.

Es funktioniert jetzt nachdem ich : Global hdc.l,*poly
gesetzt habe und *poly im Aufruf verwendet habe.

Integer und Long ist bei mir egal weil ich nur mit 32Bit-System spiele.

Danke.
Gruss
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von NicTheQuick »

funker hat geschrieben:Integer und Long ist bei mir egal weil ich nur mit 32Bit-System spiele.
Aber wäre es nicht ein schöner Lerneffekt, wenn du trotzdem Integer nutzt? Dann macht man das irgendwann auch automatisch richtig. Und wenn man schließlich mal ein Programm für ein 64-Bit-System erstellen will, dann muss man auch nichts mehr ändern. :wink:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von STARGÅTE »

funker hat geschrieben:Integer und Long ist bei mir egal weil ich nur mit 32Bit-System spiele.
Das mag bei dir zutreffen, aber du stellt deine Fragen/Codes ja hier im Forum, und sehr viele nutzen 64Bit als standardkompiler. Somit haben "wir" nur mehr Arbeit.

Du kannst in solchen Fällen auch ein Vermerk im Code machen: "32-Bit only" oder so
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von funker »

Jup, da hast du recht mit Long und Integer.

Mit einem Array erscheint keine Polygon.
Und mit diesem Aufruf kommt eine Fehlermeldung: Polyline_(hdc,poly(0),3)


Gruss

Code: Alles auswählen

Global hdc.l,poly.l

Dim poly(5)

Declare asm_polyline()

poly(0)=10
poly(1)=10
poly(2)=100
poly(3)=150
poly(4)=190
poly(5)=150

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu)
    CanvasGadget(0, 10, 10, 200, 200)
    
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown 
          hdc = StartDrawing(CanvasOutput(0))
          asm_polyline()  
          StopDrawing()         
        EndIf
      EndIf        
    Until Event = #PB_Event_CloseWindow
  EndIf
  
  Procedure asm_polyline()  
    Polyline_(hdc,poly,3)
  EndProcedure 
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von edel »

Das Array muss ebenfalls "Global" sein, sonst kannst du innerhalb einer Procedure nicht darauf zugreifen.

Code: Alles auswählen

Global Dim poly(5)
Wenn du ein Array übergeben willst, musst du auch die Klammern angeben. Poly und Poly() sind zwei verschiedene Variablen.

Code: Alles auswählen

Polyline_(hdc,poly(),3)
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von funker »

Jup, ich dachte es geht so in 2 Zeilen :

Global hdc.l,poly.l
Dim poly(5)

Danke.
Gruss
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Polyline von der GDi32 funktioniert nicht so...

Beitrag von Danilo »

Der Zeiger *poly, die long-Variable poly.l und ein long-Array poly() sind 3 verschiedene Objekte,
die nichts miteinander zu tun haben.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten