Fenster maximiert zeigen, LinkedList speichern

Anfängerfragen zum Programmieren mit PureBasic.
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Fenster maximiert zeigen, LinkedList speichern

Beitrag von Crawler »

Dank der vielen Tutorials und Hilfestellungen hier im Forum bin ich mit meinem ersten "richtigen" PB-Programm auch ganz gut vorangekommen, aber ein paar Fragen haben sich mir noch nicht endgültig erschlossen:

Zum einen soll mein Programm beim Start automatisch im Vollbildmodus laufen, dazu habe ich OpenWindow mit den Flags #PB_Window_SystemMenu und PB_Window_Maximize aufgerufen. Nun gefällt mir aber nicht, dass die Win-Startleiste nicht mehr sichtbar ist. Kann man dagegen etwas tun?

Desweiteren speichere ich (bzw. möchte ich speichern) GPS-Koordinaten in einer LinkedList, die dann auch gespeichert werden soll. Ist es möglich, diese "in einem Rutsch" zu speichern oder muss ich mir dazu eine separate Prozedur basteln? Diese bekäme dann die Liste als Parameter übergeben und rattert dann alle Elemente der Liste ab und speichert die Einträge in einer Datei. Oder wäre es für diese Aufgabe sinnvoller, eine Datenbank aufzusetzen?

Vielen Dank fürs Lesen, noch mehr Dank fürs Antworten
Crawler
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Crawler hat geschrieben:Zum einen soll mein Programm beim Start automatisch im Vollbildmodus laufen, dazu habe ich OpenWindow mit den Flags #PB_Window_SystemMenu und PB_Window_Maximize aufgerufen. Nun gefällt mir aber nicht, dass die Win-Startleiste nicht mehr sichtbar ist. Kann man dagegen etwas tun?
Bei mir ist die Taskleiste noch zu sehen. Oder ist Startleiste bei dir was
anderes. Kann natürlich auch daran liegen, dass deine Taskleiste nicht
standardmäßig im Vordergrund ist.

Wenn das der Fall ist solltest du dein Fenster manuell mit ResizeWindow() und DesktopWidth() und DesktopHeight() anpassen und
einfach die Höhe der Taskbar abziehen. hier der Code zum Ermitteln der
Taskbarhöhe:

Code: Alles auswählen

Procedure.l GetTaskbarHeight()
  SystemParametersInfo_(#SPI_GETWORKAREA,0,@DesktopWorkArea.RECT,0) 
  TbH = GetSystemMetrics_(#SM_CYSCREEN)-DesktopWorkArea\Bottom 
  ProcedureReturn TbH
EndProcedure
Win11 x64 | PB 6.20
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Beitrag von Crawler »

Code: Alles auswählen

OpenWindow (1,0,0,100,100,"Test", #PB_Window_SystemMenu|#PB_Window_Maximize)

Repeat
  event=WaitWindowEvent (20)
Until event=#PB_Event_CloseWindow  
Ja, ich meinte natürlich die Taskleiste. Das ist quasi mein verwendeter Code. Egal auf welchem Rechner ich den ausführe, die Taskleiste wird immer überdeckt, obwohl sie in den Eigenschaften mit "Taskleiste immer im Vordergrund halten" gekennzeichnet ist.

[edit] Jetzt habe ich noch das Minimize- und das Maximize-Smbol eingefügt. Und siehe da, die Taskleiste ist auch zu sehen. Gibts noch Meinungen zum zweiten Problem?
Zuletzt geändert von Crawler am 08.02.2009 21:04, insgesamt 1-mal geändert.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

bei mir bleibt die Taskleiste im Vordergrund. Meine ist aber auch zwei-Zeilig.
Muss mal sehen, ob das mit einer einzeiligen genauso ist.
Win11 x64 | PB 6.20
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Crawler hat geschrieben:Gibts noch Meinungen zum zweiten Problem?
SaveLinkedList() und LoadLinkedList() gibt es nicht. Das müsstest Du Dir
selber programmieren (ist aber auch kein großer Aufwand). Wenn Du Hilfe
hierzu benötigst, dann sag Bescheid.

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

> Jetzt habe ich noch das Minimize- und das Maximize-Smbol eingefügt. Und siehe da, die Taskleiste ist auch zu sehen

Aha, naja, war vielleicht nur so ne macke...
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Jetzt habe ich noch das Minimize- und das Maximize-Smbol eingefügt. Und siehe da, die Taskleiste ist auch zu sehen.

der Hintergrund ist, dass ein Fenster, was nicht manuell zu minimieren ist,
auch nicht von der Taskleiste gestört wird.
zum Beispiel für Games, die einen bildfüllenden WindowedScreen benutzen wollen.
(das ist etwas anderes als ein "echter" Fullscreen...)

------------------------------------------

wie Kiffi sagte, routinen zum liste speichern muss man selber schreiben.
Listen stehen nicht zwangsweise ununterbrochen im Speicher, ein abspeichern als Block ist per se unmöglich.
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Beitrag von Crawler »

Gleiches Programm, neues Problem. Ist es üblich, gleich einen neuen Thread zu erstellen?

Code: Alles auswählen

Repeat
  event=WaitWindowEvent (20)
  Select event
    Case #PB_Event_CloseWindow
      CloseSerialPort (1)
    EndSelect
  
  If IsSerialPort (1)
    input.l=AvailableSerialPortInput (1)
    If input.l
      a.s=Space (input.l)
      ReadSerialPortData (1, @a.s, input.l)
      text.s=text.s+a.s
      If Len (text.s)>1024
        text.s=Right(text.s, 1020)
      EndIf  
    EndIf
  EndIf

  .
  .
  .
      
Until event=#PB_Event_CloseWindow
Das ist im großen und ganzen meine Hauptschleife und die funktioniert eigentlich auch tadellos. Ich beschränke meinen Text (text.s) immer auf eine bestimmte Anzahl Zeichen. Konkret handelt es sich dabei um MNEA-Daten eines GPS-Empfängers.
Nun gefiel mir aber der Code nicht so, ich möchte die Abfrage der seriellen schnittstelle gern in eine Prozedur legen, diese dann aufrufen und als Rückgabewert einen String erhalten. Klang für mich auch gar nicht kompliziert, also entstand dieser (aufs notwenidige gekürzte) Code:

Code: Alles auswählen

Procedure.s getTextSerial ()
  input.l=AvailableSerialPortInput (1)
  If input.l
    a.s=Space (input.l)
    ReadSerialPortData (1, @a.s, input.l)
    t.s=t.s+a.s
    If Len (t.s)>1024
      t.s=Right(t.s, 1000)
    EndIf  
  EndIf
  ProcedureReturn t.s
EndProcedure 

Repeat
  event=WaitWindowEvent (20)
  Select event
    Case #PB_Event_CloseWindow
      If IsSerialPort(1) 
        CloseSerialPort (1)
      EndIf  
      ende=1
    Case #PB_Event_Gadget
      Select EventGadget ()
        Case 20
          ;MessageRequester ("Info", "Koordinate erfassen")
          .
          .
          .
        Case 21
          ende=1  
      EndSelect
  EndSelect
  
  If IsSerialPort (1)
    nmea.s=GetTextSerial ()
  EndIf
  
  .
  .
  .    
        
Until ende=1
Leider funktioniert das aber nicht, zumindest nicht richtig, der zurückgelieferte String enthält zwar auch einige NMEA-Datensätz, aber auch ungehörig viele Leerzeichen, die eigentlich nur aus der
space
-Anweisung kommen können. Warum ist as so? Wie lässt sich das beheben?

Danke fürs Lesen,
Danke fürs Nachdenken,
Danke fürs Antworten...

Crawler

[edit] Ich kann notfalls auch das ganze Programm hochladen, falls Fragen dazu kommen. Wenn die Prozedur dann funktionieren sollte, kann man die auch in einen Thread legen? Daran bin ich nämlich auch gescheitert...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn ich Deine Procedure richtig verstanden habe, würde ich die so schreiben:

Code: Alles auswählen

Procedure.s getTextSerial()
  Protected input.i, *mem, length.i, result.s
  
  input = AvailableSerialPortInput(1)
  If input > 0
    *mem = AllocateMemory(input)
    If *mem
      length = ReadSerialPortData (1, *mem, input)
      If length
        result = PeekS(*mem, length, #PB_Ascii)
        If Len(result) > 1024
          result = Right(result, 1000)
        EndIf
      EndIf
      FreeMemory(*mem)
    EndIf
  EndIf
  
  ProcedureReturn result

EndProcedure
Aber ob es das ist, was Du brauchst?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Beitrag von Crawler »

Schönen Dank für den Code, leider ergab das keine Veränderung. Nun bin ich erst recht ratlos. im übrigen handelt es sich entgegen meiner Annahme nicht um viele Leerzeichen, da wird einfach ein Zeilenumbruch gesetzt.
Sonst noch Ideen?
Antworten