Seite 1 von 2
Fenster maximiert zeigen, LinkedList speichern
Verfasst: 08.02.2009 20:08
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
Verfasst: 08.02.2009 20:30
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
Verfasst: 08.02.2009 21:00
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?
Verfasst: 08.02.2009 21:02
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.
Verfasst: 08.02.2009 21:17
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
Verfasst: 08.02.2009 21:20
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...
Verfasst: 08.02.2009 21:25
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.
Verfasst: 17.02.2009 22:02
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...
Verfasst: 17.02.2009 22:40
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?
Verfasst: 17.02.2009 23:41
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?