Hallo,
ich habe eine Form....
Diese öffnet sich. Nach dem öffnen wird ein Frame angezeigt. Super.
Mit diesem Frame startet ein Timer der eine ProgressBar füllt. Sobald
die ProgressBar gefüllt ist soll sich der Frame wieder schließen und ein
nächster öffnen.
Ich bin soweit, das sich das Frame nach dem ablauf des Timer schließt,
jedoch dann passiert nichts mehr.
gui.pas
Wie kriege ich jetzt das ich danach wieder auf den Frame einen anderen
Frame anzeigen kann?
Ich hoffe mir kann der ein oder andere helfen.
Vielen dank.
Markus J. schrieb:> procedure TFrame1.Timer1Timer(Sender: TObject);> begin> progressInt:= progressInt + 20;> if progressInt=120 then> begin> Destroy;> end;> ProgressBar1.Position:= progressInt;>> end;
Der Timer gehört zum Frame. Mit 'Destroy' räumst du das Fenster (und
alles was dazu gehört) ab. Wer soll jetzt noch was Anzeigendes machen?
Du könntest vor 'Destroy' ein neues Fenster erzeugen, oder - der
Klassiker - ein bereits erzeugtes Fenster anzeigen lassen.
Hier ist das erklärt, hoffe ich:
https://wiki.freepascal.org/Form_Tutorial/de
Einen großen Lappen nehmen und das Fenster "putzen".
Es ist kein Problem alle Elemente "abzuschalten" und das Fenster neu
garnieren.
Alternativ kannst Du auch zwei Panele in Fenstergröße platzieren und
diese einfach Wechseln. Funktioniert (optisch) so ähnlich wie
Tabulatoren, bei denen allerdings die Steuerelemente - gewünscht -
sichtbar bleiben.
Vergiss nicht das Panel zu deaktivieren und damit die platzierten
Steuerelemente, sonst sind letztere noch via Tab zu erreichen.
Es ist auch möglich das ursprüngliche Aussehen wieder herzustellen,
indem das erste Panel wieder in den Vordergrund geholt wird und das
zweite passiv gemacht wird.
Oder auch nicht.
Sebastian S. schrieb:> Es ist kein Problem alle Elemente "abzuschalten" und das Fenster neu> garnieren.
Na ja, die Fenster werden in der IDE zusammen geclicked. Und man
'designed' sich die Fenster, die man haben will. Zur Laufzeit wird dann
einfach hin und her geschaltet oder auch mehrere gleichzeitig zur
Anzeige gebracht. Wenn du Angst um deinen Speicher hast, erzeugst du die
- in Delphi/Lazarus immer dynamsichen - Fenster erst zur Laufzeit.
Aber die einzelnen Elemente zur Laufzeit aufs Fenster zu poppen oder
mehrere alternative Panel/Frames/sonstige Container übereinander zu
designen ist absoluter Murks.
@(amateur): Aber warum einfach, wenn 's auch ...
Ok...
Also ich habe es jetzt schon ein Stückchen weiter...
Also ich habe nun zwei frames... Die ich "hin und her" bzw ein und
ausschalten kann.
Für mich ist diese Sprache... Ähm ja... Einfach nur verwirrend... Und
naja..
Die gui klickt man sich zusammen.. Das finde ich super... Ich klicke mir
einfach jede Ansicht zusammen und lasse diese dann ein/ausblenden...
Das zumindest geht...
Aber jetzt geht es an die dynamischen Daten....
Wenn ich jetzt z.b.
ein "echo 30“ | sudo tee sys...../brigthness
Machen will...
Also ich habe eine Trackbar... Und bei der Änderung... Ja... Alao
SysUtils.ExecuteProzess(......)
Dann kommt das er den Befehl nicht ausführen kann.. Auf der Bash
(gleicher user) klappt das aber...
Markus J. schrieb:> Aber jetzt geht es an die dynamischen Daten....> Wenn ich jetzt z.b.> ein "echo 30“ | sudo tee sys...../brigthness> Machen will...> Also ich habe eine Trackbar... Und bei der Änderung... Ja... Alao> SysUtils.ExecuteProzess(......)> Dann kommt das er den Befehl nicht ausführen kann.. Auf der Bash> (gleicher user) klappt das aber...
"dynamisches Raten" beschreibt dieses Gedanken-Gestotter perfekt
Was willst du jetzt mit dem sudo-Command in der Pascal-GUI?
Also...
Ich habe eine Trackbar... Die gui läuft auf einem Raspberry mit dem
offiziellen 7 Zoll TFT.
So..wenn ich nun die Trackbar bewege soll diese bei einem change den
Befehl ausführen. Diesen Befehl ändert die Display Helligkeit.
Ich habe mir jetzt mal ein testscript geschrieben...
1
#!/bin/bash
2
3
echo 20 | sudo tee /sys/class/backlight/rpi_backlight/brightness
abgelegt unter
/usr/local/bin/set_brigth
ausführbar gemacht.. Getestet... Klappt...
So...
SysUtils.Prozess......
klappt auch im delphi
Script geändert
1
#!/bin/bash
2
3
echo${1} | sudo tee /sys/class/backlight/rpi_backlight/brightness
getestet mit
set_bright n
klappt. (n = Wert zwischen 0-255)
SysUtils.Pro.....'set_brigth ' + TrackBar1.Position...
Sobald ich die Trackbar bewege kommt ein error von wegen
Set_brigth n (also da steht dann die Zahl) kann er nicht ausführen....
Markus J. schrieb:> SysUtils.ExecuteProcess('/home/pihome/scripts/brightness ' +> IntToStr(TrackBar1.Position), '', []);
Error 127 meint Command not found.
SysUtils.ExecuteProcess erwartet Programm und Programmparameter in
getrennten Parametern, also eher :
SysUtils.ExecuteProcess('/home/pihome/scripts/brightness',IntToStr(Track
Bar1.Position), []);
Evtl. ist es auch nicht möglich bash-scripte direkt auszuführen, dann
evtl. explizit die Shell verwenden:
SysUtils.ExecuteProcess('/bin/bash/','/home/pihome/scripts/brightness '
+ IntToStr(TrackBar1.Position), []);
Die Shell sollte aber da liegen, sonst wäre das Script mit dem shebang
#!/bin/bash
ja auch falsch. Ich hatte da aber einen Schreibfehler, da war ein Slash
zuviel:
SysUtils.ExecuteProcess('/bin/bash','/home/pihome/scripts/brightness '
+ IntToStr(TrackBar1.Position), []);
Markus J. schrieb:> Aber jetzt geht es an die dynamischen Daten....> Wenn ich jetzt z.b.> ein "echo 30“ | sudo tee sys...../brigthness> Machen will...
Ähemm.. und wozu willst du überhaupt eine Shell zum Ausführen eines
Shellscripts ausführen lassen?
Kannst du die Displayhelligkeit denn nicht ganz einfach innerhalb deines
Programms einstellen? Fehlt dir dazu irgend etwas geeignetes im API
deines OS?
und nein, einen Rat, wie du es besser machen kannst, kann ich dir nicht
geben, Linux ist nicht mein Ding. Mir fällt nur auf, daß du für sowas
überhaupt ein Shellscript benutzen willst.
W.S.
Markus J. schrieb:> #!/bin/bash
Mal als allgemeiner Hinweis: Das ist eine eklige Linux-Unart. Sofern man
nicht tatsächlich reine Bash-Features verwendet, gehört da /bin/sh hin,
denn es gibt nicht auf jedem System eine Bash.