是否可以根据进度条中的完成百分比显示不同的颜色?

Is it possible to display different colors depending on percentage completion in progress bar?

进步专家您好!!!

我正在尝试根据进度条中的完成百分比显示不同的颜色,例如 百分比 0% - 25% - 红色,25% - 50% - 黄色,50% - 100% - 绿色。

这里的问题是以下代码有助于在填充框中提供完成百分比,但我不知道如何给颜色。

注意 - 填充框中的颜色应逐渐变化和移动。 (就像我们通常在复制粘贴到另一个文件夹时在系统中看到进度条一样)。

我听说我们可以使用正在进行的 .NET 方法。如果可以用这个就更好了

这可能是个愚蠢的问题(逐渐移动)或无法进行。是的!如您所知,不断问问题为什么或为什么不有益于获得一些知识。

请在这里扔一个小的lamp给黑暗。

DEFINE VARIABLE I                  AS INTEGER NO-UNDO.
DEFINE VARIABLE iPercentage        AS INTEGER NO-UNDO.
DEFINE VARIABLE iComp              AS INTEGER NO-UNDO.
DEFINE VARIABLE iRec               AS INTEGER NO-UNDO.

ASSIGN
    I     = 0
    iComp = 0
    iRec  = 0
    iPercentage = 0.


/* Calculating Total records*/
FOR EACH <table> NO-LOCK:
    iRec = iRec + 1.
END.
/* Taking each records from the same table to update*/
FOR EACH <table> NO-LOCK:
  I = I + 1.

  IF I = 1 THEN DO:
     RUN UpdateRecord.p (INPUT <table>.<tablefield>)
     ASSIGN
        iComp =  iComp  + I.
        iPercentage  = 100 * (iComp / iRec).

     DO WITH FRAME {&FRAME-NAME}:    
           ASSIGN
           /* fiProgress is FILL-IN */
           fiProgress:SCREEN-VALUE = STRING(iPercentage) + '%'.
           PROCESS EVENTS. 
     END.
     IF iPercentage = 100 THEN DO:
        MESSAGE "Record Updation Is completed".
     END.
     ELSE DO:
         I = 0
         NEXT.
     END.

  END.

END.

您可以使用 fiProgress:BGCOLOR 实现此目的,但 ABL GUI 中的颜色值非常有限,因为它们仅限于会话开始时加载的色板。从技术上讲,您可以在运行时覆盖它们,但这不是一个好主意。

(...) color should change and move gradually (...)

如果您逐渐想要真正的渐变效果,那么使用纯 Progress 就不走运了。 BGCOLOR 只接受调色板中定义的颜色(1-15,除非您想创建自己的动态新颜色(这是可能的,但需要一些工作)。 但是,您可以使用 RGB-VALUE 函数将其分配给 ActiveX 字段(以前称为 OCX),但是如果您沿着这条路走,我敢打赌您可能会找到一个 ActiveX 进度条来使用并消除需要重新创建轮子。我会将您的问题视为您想添加的纯粹的进度功能。

为了代码的可重用性和适应性,这是本网站的目标,我决定创建一些可以独立于您发布的代码(如果您允许的话),但很容易内置的东西。

所以在这个例子中你应该有 2 个填充,其中一个带有 NO-LABEL 并且在第一个之上,在完全相同的列和行坐标。

DEFINE VARIABLE iCount AS INTEGER     NO-UNDO.
DEFINE VARIABLE iCalc  AS INTEGER     NO-UNDO.
REPEAT:
  ASSIGN fill-in-1:BGCOLOR = IF iCount = 0 THEN 12
                             ELSE IF iCount = 25 THEN 14
                             ELSE IF iCount = 50 THEN 2
                             ELSE IF iCount = 75 THEN 10
                             ELSE fill-in-1:BGCOLOR.
  ASSIGN iCount = iCount + 1.

  /* Calculate reduction and placement of white fill-in */
  ASSIGN iCalc = INT((100 - iCount) * fill-in-1:WIDTH / 100)
         fill-in-2:WIDTH = if iCalc <> 0 then iCalc else 0.1
         fill-in-2:COLUMN = fill-in-1:COLUMN + (fill-in-1:WIDTH - iCalc).

  IF iCalc = 0 THEN
     ASSIGN fill-in-2:VISIBLE = NO.
  /* /End calculation */

  ASSIGN fill-in-1:SCREEN-VALUE = STRING(iCount).
  IF iCount = 100 THEN LEAVE.
  PAUSE 0.2 NO-MESSAGE.
  PROCESS EVENTS.
END.

此代码段自身会休眠 0.2 秒,因此您可以了解发生了什么。删除暂停并将 iCount 替换为您的百分比,您应该得到您正在寻找的东西。处理事件是个好主意,但没有必要。

希望对您有所帮助。

编辑:向我的好友 Marlon Berkenbrock @marlonberkenbrock 大声喊叫,因为他引起了我的注意,他收到了一个零宽度警告(由于我的会话配置而从未向我显示)。当前版本修复了这个问题。

我找到了其他方法来解决我的问题,并且可以看到条形图逐渐移动。 感谢@bupereire 的想法。

注意 - 填充框宽度应为 1.00

      DEFINE VARIABLE iCount AS INTEGER     NO-UNDO.
      DEFINE VARIABLE iCalc  AS INTEGER     NO-UNDO.
      DO WITH FRAME {&FRAME-NAME}:  
      REPEAT:    
      ASSIGN iCount = iCount + 1
             iCalc = INT(100 - iCount)
             fill-in-1:WIDTH = 1
             fill-in-1:WIDTH = (fill-in-1:WIDTH + iCount)
             fill-in-1:BGCOLOR = IF iCount < 25 THEN 4
                                 ELSE IF (iCount > 25 AND iCount < 50)  THEN 9
                                 ELSE IF (iCount > 50 AND iCount < 75) THEN 14
                                 ELSE IF (iCount > 75 AND iCount < 100) THEN 10
                                 ELSE fill-in-1:BGCOLOR.

      IF iCount = 100 THEN LEAVE.
      PAUSE 0.5 NO-MESSAGE.
      PROCESS EVENTS.
      END.
      END.
      END PROCEDURE.