Fenster maximiert zeigen, LinkedList speichern
Fenster maximiert zeigen, LinkedList speichern
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
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
Bei mir ist die Taskleiste noch zu sehen. Oder ist Startleiste bei dir wasCrawler 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?
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
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
[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.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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.
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.
Gleiches Programm, neues Problem. Ist es üblich, gleich einen neuen Thread zu erstellen?
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:
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
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...
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
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
-Anweisung kommen können. Warum ist as so? Wie lässt sich das beheben?space
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...
- 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
Wenn ich Deine Procedure richtig verstanden habe, würde ich die so schreiben:
Aber ob es das ist, was Du brauchst?
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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
