AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign FreePascal "Sanduhr" Funktion / "Programm arbeitet"
Thema durchsuchen
Ansicht
Themen-Optionen

"Sanduhr" Funktion / "Programm arbeitet"

Ein Thema von Monday · begonnen am 10. Sep 2018 · letzter Beitrag vom 10. Sep 2018
Antwort Antwort
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#1

"Sanduhr" Funktion / "Programm arbeitet"

  Alt 10. Sep 2018, 12:38
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

Geändert von Monday (10. Sep 2018 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: "Sanduhr" Funktion / "Programm arbeitet"

  Alt 10. Sep 2018, 13:33
Was hat das 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
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.
LabelA.Caption := WorkChars[(IndexStr(LabelA.Caption, WorkStrings) + 1 + Length(WorkStrings)) mod Length(WorkStrings)];
$2B or not $2B

Geändert von himitsu (10. Sep 2018 um 21:52 Uhr)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

AW: "Sanduhr" Funktion / "Programm arbeitet"

  Alt 10. Sep 2018, 13:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: "Sanduhr" Funktion / "Programm arbeitet"

  Alt 10. Sep 2018, 17:20
Vielleicht magst Du ja auch noch die Sanduhr als Cursor haben.
Hier eine gut aussehende Helfer-Unit dazu
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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