Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal "Sanduhr" Funktion / "Programm arbeitet" (https://www.delphipraxis.net/197836-sanduhr-funktion-programm-arbeitet.html)

Monday 10. Sep 2018 11:38

"Sanduhr" Funktion / "Programm arbeitet"
 
Hallo,

in einer meiner Programme wollte ich Wissen, ob mein Programm noch arbeitet oder ob es irgendwo "hängt". Um einfach eine Bewegung anzuzeigen, wie die gute alte Sanduhr die sich bewegte wenn die Anwendung etwas machte, habe ich eine kleine Funktion geschrieben.

Vielleicht kann auch jemand anders gebrauchen:


Delphi-Quellcode:
procedure working(labela: TLabel);
var
    //zeichen1: array[1..4] of string = ('1','2','3','4');
    //zeichen1: array[1..4] of string = ('←','↑','→','↓');
    //zeichen1: array[1..4] of string = ('░','▒','▓','█');
    zeichen1: array[1..2] of string = ('◇','◆');
    //zeichen1: array[1..5] of string = ('ᚋ','ᚌ','ᚍ','ᚎ','ᚏ');
    i,a,nicht_vorhanden,stop: integer;
begin

  labela.Font.Name := 'Times New Roman';
  labela.Font.Style := [fsBold] ;
  labela.Font.Size := 15;

  nicht_vorhanden := 0;
  stop := 0;
   for i := 1 to length(zeichen1) do begin
      Application.ProcessMessages;
      if labela.caption = zeichen1[i] then begin
       if i = length(zeichen1) then begin
         labela.Caption := zeichen1[1];
       end else begin
          labela.Caption := zeichen1[i+1];
       end;
       nicht_vorhanden := 1;
       break;
      end;
   end;

  if nicht_vorhanden = 0 then begin
    labela.Caption := zeichen1[1];
  end;
end;

Die Anwendung ist ganz einfach:

Ein Label auf die Form setzen. Und die Funktion einfach in die zu arbeitende Stellen setzen.

Delphi-Quellcode:
// ... hier wird was berechnet, va. in einer Schleife?
     working(Label1);
// ... hier wird was berechnet
Bei den Zeichen kann man eigene auswählen, ich habe ein paar Beispiele auskommentiert dazu geschrieben (evtl. können nicht alle Zeichen verwendet werden, dann einfach andere auswählen).

LG
Monday

himitsu 10. Sep 2018 12:33

AW: "Sanduhr" Funktion / "Programm arbeitet"
 
Was hat das
Delphi-Quellcode:
Application.ProcessMessages;
in der Schleife zu suchen?

Maximal einmal nach der Schleife, aber wer ProcessMessages fahrlässig "einfach" so iggendwo rein macht, der gehört gesteinigt.
Also maximal ein Repaint/Refresh wäre wirklich vertretbar.
(sorry, wenn es etwas böse klingt, aber nach 30 Jahren Misshandlung darf PM zurückschlagen)


Wieso ist die Zeichensatzkonstante "zeichen1" eine Variable?


Doppelter Code?
Delphi-Quellcode:
if i = length(zeichen1) then begin
  labela.Caption := zeichen1[1];
end else begin
Kann weg, bei
Zitat:

for i := 1 to length(zeichen1) - 1 do begin
, denn
Delphi-Quellcode:
if nicht_vorhanden = 0 then begin
.

Ein Exit statt Break und die Variable nicht_vorhanden kann auch weg.


Denglisch? (englischer Funktionsname und deutsche Variablen ... warum nicht alles deutsch ODER englichcs?)


Und dann lässt sich das ganze als Einzeiler auch mathematisch lösen.
Delphi-Quellcode:
procedure Working(LabelA: TLabel);
const
  WorkChars = '░▒▓█'; // '1234' '←↑→↓' '░▒▓█' '◇◆' 'ᚋᚌᚍᚎᚏ' '|/-\'
begin
  LabelA.Caption := WorkChars[(Pos(LabelA.Caption, WorkChars) + Length(WorkChars)) mod Length(WorkChars) + 1];
  LabelA.Repaint;
end;
(falls ich mich jetzt nicht verrechnet hab)

Mit einem String-Array geht es auch, siehe Delphi-Referenz durchsuchenIndexStr statt Pos.
Delphi-Quellcode:
LabelA.Caption := WorkChars[(IndexStr(LabelA.Caption, WorkStrings) + 1 + Length(WorkStrings)) mod Length(WorkStrings)];

generic 10. Sep 2018 12:33

AW: "Sanduhr" Funktion / "Programm arbeitet"
 
Warum programmierst was eigenes, wenn doch Window einen Progressbar für so etwas hat?
Falls du die Prozentzahl nicht kennst, lässt der sich auch Marquee umstellen.
Hinzu kommt noch, dass es prima mit der Taskbar zusammen spielt.
Das Ding kennen die Benutzer und müssen sich nicht an fremde Darstellungen gewöhnen.

KodeZwerg 10. Sep 2018 16:20

AW: "Sanduhr" Funktion / "Programm arbeitet"
 
Vielleicht magst Du ja auch noch die Sanduhr als Cursor haben.
Hier eine gut aussehende Helfer-Unit dazu :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz