Stausbalken hilfe.

Started by SpEEDY, June 18, 2009, 01:27:04 AM

Previous topic - Next topic

SpEEDY

Hallo Forum,

Hab beim basteln mit Opendcl.
Den Statusbalken gefunden.
Jetzt ist mir aber die frage gekommen wie arbeitet so einen Balken ein.
Habe in den Samplers geguckt bin aber nicht schlauer geworden.
Könnte wir vielleicht jemand erklären wie das funktioniert.

Muss einen Variable vielleicht auf 100 hoch gezählt werden oder so?
Bin leider noch Anfänger.   ;D

Danke schon mal.

SpEEDY
Es ist unmöglich etwas Idiotensicher zu machen, weil Idioten so genial sind!

Fred Tomke

Hallo SpEEDY, das ist ganz einfach. Dafür gibt's zwei Ansätze, den relativen und den absoluten.

Relativer Ansatz:
Der geht immer von 100 % als Ziel aus. D.h. Du setzt MinValue im Studio auf 0 und MaxValue auf 100. Speicherst das Projekt, dann läuft der Rest im Quellcode.

Code (autolisp) Select

(if (setq ssAusw (ssget "X"))
  (progn
    (dcl_control_setvalue MyProj_MyForm_MyControl 0) ;; mache ich beim Beginn immer so
    (setq intCnt -1)
    (repeat (setq intGes (sslength ssAusw))
      (setq entObj (ssname ssAusw (setq intCnt (1+ intCnt))))
      (dcl_control_setvalue MyProj_MyForm_MyControl (fix (* (/ (float intCnt) intGes) 100.0)))
      (do_something_senseful)
    ); repeat
    (dcl_control_setvalue MyProj_MyForm_MyControl 0) ;; mache ich beim Ende immer so
  ); progn
); if


Absoluter Ansatz
In diesem Falle weist Du dem Verlaufsbalken den Maximalwert deiner Schleife zu und änderst bei jedem Durchlauf den Wert. Du setzt MinValue im Studio auf 0. Speicherst das Projekt, dann läuft der Rest im Quellcode.

Code (autolisp) Select

(if (setq ssAusw (ssget "X"))
  (progn
    (setq intCnt -1)
    (setq intGes (sslength ssAusw))
    (dcl_control_setvalue MyProj_MyForm_MyControl 0) ;; mache ich beim Beginn immer so
    (dcl_Control_SetMaxValue MyProj_MyForm_MyControl intGes)
    (repeat
      (setq entObj (ssname ssAusw (setq intCnt (1+ intCnt))))
      (dcl_control_setvalue MyProj_MyForm_MyControl intCnt)
      (do_something_senseful)
    ); repeat
    (dcl_control_setvalue MyProj_MyForm_MyControl 0) ;; mache ich beim Ende immer so
  ); progn
); if


Erfahrungswert:
Wir hatten einmal den Fall, dass jemand über 10.000 zu prüfende Objekte in der Zeichnung hatte. Die Prüfroutine zeigte einen Verlaufsbalken an und jedes mal wurde Value gesetzt. Bei irgendeinem Wert über 10.000 erschien eine Zugriffsverletzung. Wir ließen den Verlaufsbalken weg und siehe da - keine Zugriffsverletzung. Wenn man jetzt bedenkt, dass jeder Zugriff auf die Dialogbox Zeit kostet und der visuelle Unterschied eines Einzelwertes zwischen 0 und 100 eher marginal ist, empfehle ich den optimierten relativen Ansatz.

Optimierter relativer Ansatz

Code (autolisp) Select

(if (setq ssAusw (ssget "X"))
  (progn
    (setq intGes (sslength ssAusw))
    (setq reaGes (float intGes))
    (setq intCnt -1)
    (setq intCur 0)
    (dcl_control_setvalue MyProj_MyForm_MyControl intCur)
    (repeat intGes
      (setq intCnt (1+ intCnt))
      (setq entObj (ssname ssAusw intCnt))
      (if (> (setq intNum (fix (* (/ intCnt reaGes) 100.0))) intCur)
        (dcl_control_setvalue MyProj_MyForm_MyControl (setq intCur intNum))
      ); if
      (do_something_senseful)
    ); repeat
    (dcl_control_setvalue MyProj_MyForm_MyControl 0)
  ); progn
); if


Fred
Fred Tomke
Dipl.-Ing. (FH) Landespflege

[ landscaper - landscape developer - digital landscape and urban design]