Säulendiagramm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Weisshaar
Beiträge: 61
Registriert: 23.10.2004 17:38
Wohnort: Wuppertal

Säulendiagramm

Beitrag von Weisshaar »

Moin.
Erstens: Ich bin nach Jahren des nichtstuens in Basic wieder da.
Ich probier es wenigstens...
Zweitens: Purebasic hat mit Basic, so wie ich es mir angelernt habe wenig zu tun.
Drittens: Wer einmal Basic auf dem ZX81 und AmigaBasic geübt hat ist anscheinend versaut ;-)
Viertens: Ich bin 60; hat aber damit eigentlich nichts zu tun?-)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
; Säulendiagramm
;
; ------------------------------------------------------------
;



;variablen Farben
weiss = $ffffff
schwarz = $000000
rot = $0000FF
gelb = $00FFFF
gruen = $00CC00
braun = $6699CC


If OpenWindow(100, 1000, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
;       Nummer |ortx,| orty, |Breite,| Höhe,| "Name",    |   Flags

If CreateImage(100, 400, 300)

    If StartDrawing(ImageOutput(100))
     For k=0 To 300
      FrontColor(RGB(206, 230, 133))   ; füllt den Hintergrund
      Line(0, k, 400, 0)
    Next







For z = 100 To 10 Step -1                  ;von unten nach oben zeichnen schleife 1
  If z = 30
  Break
  EndIf
  Plot(50, z, (schwarz))
    Plot(51, z, (schwarz))
  Plot(52, z, (schwarz))
  
Next

For y = 100 To 10 Step -1 
If y = 80
  Break
  EndIf                 ;schleife 2
  Plot(70, y, (rot))
    Plot(71, y, (rot))
  Plot(72, y, (rot))
Next

For x = 100 To 10 Step -1
If x = 30
  Break
  EndIf                 ;schleife 3
  Plot(90, x, (gruen))
    Plot(91, x, (gruen))
  Plot(92, x, (gruen))
Next

For w = 100 To 10 Step -1
If w = 90
  Break
  EndIf                   ;schleife 4
  Plot(110, w, (gelb))
    Plot(111, w, (gelb))
  Plot(112, w, (gelb))
  Next
  
For u = 100 To 10 Step -1
If u = 15
  Break
  EndIf             ;schleife 5
  Plot(130, u, (braun))
    Plot(131, u, (braun))
  Plot(132, u, (braun))                                                       ;:For pause = 1 To 1000000 : Next
;  --------------------------------------------------------------------------------
Next
;For u = 10 To 50            ;schleife 6
 ; Plot(130, u, (schwarz))
  ;  Plot(131, u, (schwarz))
  ;Plot(132, u, (schwarz))                                                      ;:For pause = 1 To 1000000 : Next
;Next

; ----------------------------------------------------------------------------------------------------------------------------------

For a = 10 To 380
  Plot( a, 100,(weiss))           ;waagerechte Nullinie
   Plot( a, 101, (weiss))
  Plot( a, 102, (weiss))
Next

For b = 10 To 200
  Plot( 5, b, (weiss))                       ;senkrechte nullinie 
   Plot( 6, b, (weiss))
  Plot( 7, b, (weiss))
Next

          Circle(5, 101, 3, schwarz)                            ;nullpunkt
          
; ------------------------------------------------------------------------------------------------------------------------------------- 

     
StopDrawing() ;aufhören mit Zeichnen

ImageGadget(0, 0, 0, 0, 0, ImageID(100))

  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
      Quit = 1
    EndIf ;fur repeat

  Until Quit = 1   ; führt den Befehl vom schließen-Gadget des Fensters aus. Quit ist WAHR
  
EndIf ;für OpenWindow
EndIf ;für StartDrawing
EndIf

End   ; Alle Fenster zu!
Das kleine Programm funktioniert.
soll also darstellen wieviel die einzelnen Parteien an Stimmen bekommen, wie im TV.
Die Eingabe soll in Stimmen erfolgen. Säulen sollen aufgebaut werden.
Ich habe Plot benutzt um auf jeden Pixel zugreifen zu können.

Sehr hilfreich währe auch wenn ihr meine Kommentare im Programm lesen würdet.
Sind die richtig? Oder sehe ich das total falsch?

Ich suche aber eine vernünftige Eingabe der ausrechenbaren Daten.
Eingaberequester sind sehr unbequem oder ich habe den "Richtigen" noch nicht gefunden.

BTW können openconsole und openwindow/openscreen variablen austauschen?

Liebe Grüße, Weisshaar. (4.30)[/code]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Moin

also, für das Zeichnen solltest du dir mal Box() ansehen, das ist effektiver als in einer Schleife so viel zu plotten.

was die eingabe betrifft, du könntest auch SpinGadgets nehmen um die Werte einzustellen,
aber grundsätzlich würde man die wohl eher in eine Textdatei schreiben,
diese vom Programm aus mit ReadFile() öffnen,
mit ReadString() die Zahlenstrings einlesen,
und mit Val() in Zahlen umwandeln die man benutzen kann.
die Textdatei kann man einfach mit NotePad erstellen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Ich hab da mal kurz was gebastelt, weil ich auch grad für ein Remake eines 64'er Spiels sowas brauche ;)
Ist allerding nur grad für positive Bilanzen geeignet...

Ich hab die Werte in Datazeilen gepackt. Sollte aber kein Problem sein sich diese anders zu beschaffen... (so wie Kaeru das schon beschrieb... )

Es laeuft hier mit einem 2Dimensionalen Array, da ich es für einfacher hielt,
die Stimmen und die Farben zu den "Parteien" zuzuordnen.

Code: Alles auswählen

Parteien = 6
Global Gesamtstimmen = 0
Global Dim Stimmen(Parteien, 2) ; Stimmen(1,1) = Stimmen... Stimmen(1,2) = Farbe des Balkens

Procedure Saeule(Partei)
  x = 50 + (Partei * 10) ; X - Position
  h.f = (100/Gesamtstimmen)*Stimmen(Partei,1) ; hier in Prozent umrechnen damit der balken nie höher als 100 Bildpunkte wird
  Box(x,100-h,3,h,Stimmen(Partei,2))
EndProcedure

;##### eventuell hier einlesen, per ReadFile()
;##### Ich mach es eben mal schnell mit Read und Data

For i = 1 To Parteien
  Read.i Stimmen(i,1)
  Gesamtstimmen + Stimmen(i,1)
Next i
For i = 1 To Parteien
  Read.i r
  Read.i g
  Read.i b 
  Stimmen(i,2)=RGB(r,g,b)
Next i
DataSection
  Data.i 22,50,96,6,71,18
  Data.i 255,0,0,0,255,0,0,0,0,255,255,0,164,114,0,0,0,255
EndDataSection

Win = OpenWindow(#PB_Any, 500, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
If Win
  Image = CreateImage(#PB_Any,400,300)
  StartDrawing(ImageOutput(Image))
    Box(0,0,400,300,RGB(206, 230, 133)) ; Hintergrund einfärben
    Box(10,100,370,2,#White) ;waagerechte Nullinie
    Box(20,10,2,190,#White) ;senkrechte nullinie 
    Circle(21, 101, 3, schwarz) ; Nullpunkt  
    ;##### Hier werden alle Parteien gezeichnet  
    For i = 1 To Parteien
      Saeule(i)
    Next i
  StopDrawing()
  ImageGadget(0, 0, 0, 0, 0, ImageID(Image))
EndIf

Repeat
  
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
    Quit = 1
  EndIf ;fur repeat
Until Quit = 1
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Weisshaar
Beiträge: 61
Registriert: 23.10.2004 17:38
Wohnort: Wuppertal

Beitrag von Weisshaar »

Bisonte hat geschrieben:Ich hab da mal kurz was gebastelt, weil ich auch grad für ein Remake eines 64'er Spiels sowas brauche ;)
Ist allerding nur grad für positive Bilanzen geeignet...

Ich hab die Werte in Datazeilen gepackt. Sollte aber kein Problem sein sich diese anders zu beschaffen... (so wie Kaeru das schon beschrieb... )

Es laeuft hier mit einem 2Dimensionalen Array, da ich es für einfacher hielt,
die Stimmen und die Farben zu den "Parteien" zuzuordnen.

Code: Alles auswählen

Parteien = 6
Global Gesamtstimmen = 0
Global Dim Stimmen(Parteien, 2) ; Stimmen(1,1) = Stimmen... Stimmen(1,2) = Farbe des Balkens

Procedure Saeule(Partei)
  x = 50 + (Partei * 10) ; X - Position
  h.f = (100/Gesamtstimmen)*Stimmen(Partei,1) ; hier in Prozent umrechnen damit der balken nie höher als 100 Bildpunkte wird
  Box(x,100-h,3,h,Stimmen(Partei,2))
EndProcedure

;##### eventuell hier einlesen, per ReadFile()
;##### Ich mach es eben mal schnell mit Read und Data

For i = 1 To Parteien
  Read.i Stimmen(i,1)
  Gesamtstimmen + Stimmen(i,1)
Next i
For i = 1 To Parteien
  Read.i r
  Read.i g
  Read.i b 
  Stimmen(i,2)=RGB(r,g,b)
Next i
DataSection
  Data.i 22,50,96,6,71,18
  Data.i 255,0,0,0,255,0,0,0,0,255,255,0,164,114,0,0,0,255
EndDataSection

Win = OpenWindow(#PB_Any, 500, 300, 400, 300, "Säulendiagramm", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
If Win
  Image = CreateImage(#PB_Any,400,300)
  StartDrawing(ImageOutput(Image))
    Box(0,0,400,300,RGB(206, 230, 133)) ; Hintergrund einfärben
    Box(10,100,370,2,#White) ;waagerechte Nullinie
    Box(20,10,2,190,#White) ;senkrechte nullinie 
    Circle(21, 101, 3, schwarz) ; Nullpunkt  
    ;##### Hier werden alle Parteien gezeichnet  
    For i = 1 To Parteien
      Saeule(i)
    Next i
  StopDrawing()
  ImageGadget(0, 0, 0, 0, 0, ImageID(Image))
EndIf

Repeat
  
  Event = WaitWindowEvent()
  If Event = #PB_Event_CloseWindow  ; wartet auf den Befehl vom schließen-Gadget des Fensters
    Quit = 1
  EndIf ;fur repeat
Until Quit = 1
Mach mich nicht das Hemd am flattern :) Ich bin noch sehr wackelig.

Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.

@Kaeru Gaman
Querlesen gilt nicht. Der Tip mit Notepad ist gut. Ich Plotte, weil ich jeden Pixel in den Griff bekommen wollte. Mit Box() hatte ich angefangen...
Mein Programmierstil(ups:-)) ist folgender: Ich hacke den Code zusammen und schaue dann in die Anleitung warum das nicht geht.:allright:

Liebe Grüße, Weisshaar.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
Bei mir nicht. PureBasic 4.3
Win11 x64 | PB 6.20
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Auch bei mir kein Fehler.

PB 4.3 x86
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
schreib bitte deine PB-Version in die Signatur.
wenn i nicht erkannt wird, hast du höchstens 4.1
wenn Read nicht getypet werden muss, hast du höchstens 4.2

im ersten Posting hattest du etwas von 4.3 geschrieben, deshalb dachte ich, du hättest die auch....

>> Querlesen gilt nicht.
¿quid?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Weisshaar

willkommen in Board
Wer einmal Basic auf dem ZX81 und AmigaBasic geübt hat ist anscheinend versaut
:allright:

Wer mit ZX81 angefangen hat lernte bestimmt auch ASM :allright:
Mein ZX81 funktioniert immer noch :mrgreen:

Mit Purebasic habe ich eine Sprache gefunden mit der ich am Besten mit klar kommte. Ab und zu arbeitet ich auch wenn es sein muss mit VB oder C#.
Tue mich aber schwer mit der OOP Struktur. PB ist schon die richtige Wahl da man immer weiss wo das Programm abläuft und die Fehlersuche ist sehr einfach.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Weisshaar
Beiträge: 61
Registriert: 23.10.2004 17:38
Wohnort: Wuppertal

Beitrag von Weisshaar »

Andesdaf hat geschrieben:
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
Bei mir nicht. PureBasic 4.3
Was soll ich sagen... :oops:
Läuft bei mir jetzt auch. Aber ich schwör das war gestern anders. :roll:
Mit freundlichen Grüßen,
Weisshaar.
Purebasic 4.30

... aber das werde ich Übermorgen ganz spontan entscheiden"
Benutzeravatar
Weisshaar
Beiträge: 61
Registriert: 23.10.2004 17:38
Wohnort: Wuppertal

Beitrag von Weisshaar »

Kaeru Gaman hat geschrieben:
Weisshaar hat geschrieben:Read.i Stimmen(i,1)

gibt bei mir Syntax-Error.
schreib bitte deine PB-Version in die Signatur.
wenn i nicht erkannt wird, hast du höchstens 4.1
wenn Read nicht getypet werden muss, hast du höchstens 4.2

im ersten Posting hattest du etwas von 4.3 geschrieben, deshalb dachte ich, du hättest die auch...

>> Querlesen gilt nicht.
¿quid?
:oops:
Ich hatte um folgendes gebeten:

Sehr hilfreich währe auch wenn ihr meine Kommentare im Programm lesen würdet.
Sind die richtig? Oder sehe ich das total falsch?
BTW können openconsole und openwindow/openscreen variablen austauschen?
Mit freundlichen Grüßen,
Weisshaar.
Purebasic 4.30

... aber das werde ich Übermorgen ganz spontan entscheiden"
Antworten