Announcement

Collapse
No announcement yet.

Cascadierte Progressbars...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cascadierte Progressbars...

    Hallo!<br>
    <br>
    Ich habe 2 Progressbars von denen die untere den Gesamtfortschritt anzeigen soll und die obere demzufolge jeden Einzelnen Schritt darstellt.
    Ich will jetzt nicht, das die ProgressBar für den Gesamtfortschritt (PBTotal) bei jedem vollendeten Einzelschritt von (PBStep) um den entsprechenden Progress-Wert springt, sondern das sie schon wärendessen mitläuft. Was mir fehlt ist die Formel mit deren Hilfe man den Gesamtanteil des Einzelschrittes in Abhängigkeit der beiden unterschiedlichen Skalierungen berechnet.<br>
    Mein Ansatz lautet folgendermaßen:
    <pre>public function GetTotalSubProgress(ATotalCount: Integer, ASubCount: Integer, ATotalValue: Integer, ASubValue: Integer): Integer;
    begin
    Return ((ATotalCount / 100) * ((((ASubCount / 100) * ASubValue) / ATotalValue)) * ((ATotalCount / 100) / (ASubCount / 100)));
    end;</pre>
    Vielen Dank für jede Hilfe...<br>
    <br>
    Gruß<br>
    &nbsp;Nico Stöckigt<br>

  • #2
    Einfach die Größe der Einzelschritte addieren und dann beide Progressbars um den gleichen Betrag wie die Einzelschrittprogressbar erhöhen.<br>
    Angenommen 4 Einzelschritte a 50 Schritte. Macht für Einzelschrittprogressbar 4 mal jeweils 50 Steps, und für die Gesamtprogressbar 1 mal von 0 - 200, mit 4 * 50 Steps.<br>

    Gruß Hage

    Comment


    • #3
      Hi!<br>
      <br>
      Leider ist das nicht ganz so einfach - das hätte ich auch noch hinbekommen! Das ganze ist absolut dynamisch! d.h. die Einzelschritte sind unterschiedlich groß (1 bis >10.000) und teilen sich in beliebig viele Schritte auf.<br>
      Zur Verdeutlichung ein Beispiel:<br>
      <br>
      Ein Grid mit ca. 9000 Einträgen. Der Benutzer wählt jetzt unterschiedliche 'ranges' aus, so das wir - <i>sagen wir mal</i> - auf 6 'ranges' kommen. Eine der 'ranges' hat nur einen Eintrag die nächste hat vielleicht 20 und eine andere vielleicht 1000.<br>
      Ich bekomme also die Anzahl der 'ranges' und die Anzahl der Einträge in der aktuellen 'range' sowie den Index der aktuellen 'range' und den aktuellen Index des Eintrags der aktuellen 'range'. Ich kann mir auch noch die Anzahl <u>aller</u> ausgewählten Eintrage zurückgeben lassen.<br>
      Gehen wir also von 2000 Eintragen in 6 'ranges' aus.<br>
      <br>
      Range0 = 7 Einträge<br>
      Range1 = 965 Einträge<br>
      Range2 = 1 Eintrag<br>
      Range3 = 214 Enträge<br>
      Range4 = 312 Einträge<br>
      Range5 = 501 Einträge<br>
      <br>
      Wie muß jetzt also meine Berechnung lauten, damit ich diese Einzelschritte entsprechend skaliert auf meinem PBTotal angezeigt bekomme?!?<br>
      <br>
      Vielen Dank!<br>
      &nbsp;Nico Stöckigt<br&gt

      Comment


      • #4
        Hallo Nico,<br>
        ich hab Hagens Idee grad mal ausprobiert:
        <pre class="sourcecode"><code>
        <b>const</b>
        Ranges: <b>array</b>[0..5] <b>of</b> Integer = (7, 965, 1, 214, 312, 501);
        <b>var</b>
        SumRange: Integer;
        <br>
        <b>procedure</b> TForm1.Button1Click(Sender: TObject);
        <b>var</b>
        i, j, sum: Integer;
        <b>begin</b>
        sum := 0;
        <b>for</b> i := 0 <b>to</b> 5 <b>do</b>
        <b>begin</b>
        ProgressBar2.Max := Ranges[i];
        <b>for</b> j := 0 <b>to</b> pred(Ranges[i]) <b>do</b>
        <b>begin</b>
        ProgressBar1.Position := sum;
        Label1.Caption := Format(<font color="#9933CC">'%d von %d'</font>, [sum, SumRange]);
        Inc(sum);
        ProgressBar2.Position := j;
        Label2.Caption := Format(<font color="#9933CC">'%d von %d'</font>, [j, Ranges[i]]);
        Sleep(1);
        Application.ProcessMessages;
        <b>end</b>;
        <b>end</b>;
        <b>end</b>;
        <br>
        <b>procedure</b> TForm1.FormCreate(Sender: TObject);
        <b>var</b>
        i: Integer;
        <b>begin</b>
        SumRange := 0;
        <b>for</b> i := 0 <b>to</b> 5 <b>do</b>
        Inc(SumRange, Ranges[i]);
        ProgressBar1.Max := SumRange;
        <b>end</b>;
        </code></pre>
        und das schaut mit "smoothen" ProgressBars ganz gut aus (bis auf ein paar One-Off-Fehler meinerseits).
        <p>Uli

        Comment


        • #5
          ...so weit, so gut!<br>
          <br>
          Ein simples Beispiel mit dieser Lösung aufziehen geht ja noch... aber ich habe hier ein recht komplexes Projekt in dem von überall her Funktionen angestoßen werden die dann über eine (bzw. insgesamt 3) ProgressBar(s) ihren Status zurückgeben.<br>
          Wenn ich das auf die Art und Weise, wie Du's oben gemacht hast, in mein Projekt einbinden würde, wäre es die Arbeit nicht wert!<br>
          Für diese ganze Geschichte gibt es auch einen mathematischen Weg auf den ich <i>imo</i> nicht komme. Ich weiß meine Max-Werte und meine aktuellen Werte. Anhand der Max-Werte kann ich die Skala eines PB berechnen. Den Fortschritt des SubPB weiß ich und muß ihn nur noch auf die Skala des ParentPB umrechnen <- das ist genau mein Problem...<br>
          <br>
          Also...<br>
          Insgesamt sind es x Schritte die jeweils den selben Anteil am gesamt Prozess haben. Jeder Schritt hat eine unbestimmte aber konstante Anzahl an Unterschritten (y) die zusammen wieder den Gesamtfortschritt darstellen.<pre>x/100=(y[x-x]+...+y[x])/100</pre>Mit der Entsprechendn Formel kann man, wenn man weiß wieviele Schritte es sind und in welchem Schritt ich mich gerade befinde sowie die Anzahl der Subschritte und deren Index bekannt sind, ermitteln zu welchem Anzeil der Gesamtprozess sich gerade befindet... und nun wieder das große Problem... die beiden PBs haben unterschiedliche Skalierungen (1:x und 1:y) und der SubProzess muß auf den ParentProzess aufskaliert werden... irgend ein findiger Informatik- oder Mathe-Student wird doch sowas schonmal gemacht haben!..<br>
          <br>
          1000 Dank!<br>
          &nbsp;Nico Stöckigt<br&gt

          Comment


          • #6
            Nochmal die Voraussetzungen: Du kennst im Voraus die Anzahl der Ranges und ihre Max-Werte? Und wann immer du die ProgressBars updaten willst, weißt du den Index der aktuellen Range und den Fortschritt *innerhalb* dieser Range?
            <p>Wenn das soweit richtig ist, dann setze vor Start der Aktion das Max der Gesamt-PB auf die Summe aller Teil-Max-Werte (siehe mein FormCreate).
            Bei jedem Update während des Laufs summiere die Max-Werte aller schon vollständig durchlaufenen Ranges, addiere den aktuellen Teilfortschritt dazu und fertig.
            <p>Oder habe ich jetzt schon wieder das Wesentliche übersehen? ;-)
            <p>Ciao, Uli

            Comment


            • #7
              ...mmh! So könnte es auch gehen (hab' ich aufgrund der Einfachheit übersehen =b ). Der mathematische Weg ist halt der schönste und läßt sich zudem sehr gut kapseln und weiterverwenden...<br>
              Montag ist einfach nicht der beste Tag um sich sowas auszudenken! Ich denke ich versuche es jetzt erstmal so, und wenn ich wiedermal einen geistigen Höhenflug habe, poste ich den mathematischen Weg hier rein.<br>
              <br>
              t.a.l.<br>
              &nbsp;Nico Stöckigt<br&gt

              Comment


              • #8
                Also, ich empfinde die Lösung als ziemlich mathematisch. Allerdings bin ich Mathematiker und habe laut Aussage meiner Kollegen die Tendenz, *alles* mathematisch zu sehen. :-)
                <br>Uli

                Comment


                • #9
                  Also, so ganz verstehe ich dein Problem nicht!
                  <P>
                  Alle Datensätze (=2000=allCount), alle Datensätze der aktuellen Range (=7=allSubCount), aktueller Datensatz in aktueller Range (=2=subCount).
                  <P>
                  Hieraus ergibt sich für den Gesamtfortschritt:
                  <B>allCount/allSubCount=100/x</B>. Somit ist der Anteil der deiner Range an den 100% Fortschritt das x.
                  <P>
                  Für den SubFortschritt gilt:
                  <B>allSubCount/subCount=(100*(allSubCount/allCount))/y</B>. Was das selbe ist wie: <B>=100*(subCount/allCount)</B>. Dein y ist also der Anteil an dem Anteil der gesamten Range im Gesamtfortschritt.
                  <P>
                  Zur Umsetzung. Dein Max Wert in der ProgressBar für den Gesamtfortschritt ist immer 100. Der für den SubFortschritt ist immer das x. Beim abarbeiten der Ranges ergibts sich somit folgende Formel für die n-te Range: <B>x-Wert Range0+...+x-Wert Range(n-1)+y</B>. Das war es. Ich hoffe du blickst bei dem was ich geschrieben habe durch. Ansonsten melde dich nochmal und ich schicke es dir per Mail als schöne Formel.

                  Gruß

                  Sebastia

                  Comment


                  • #10
                    Ich weiß nicht. So wie es Ulrich erklärt hat ist es doch die einfachste Lösung. Übrigens genau das Gleiche was ich meinte.<br>
                    Warum noch irgendwelche Verhältnisgleichungen aufstellen ??<br>
                    Einzigstes Problem ist das die Progressbar nur mit ShortInt arbeiten kann. Die max Werte sollten also > 32xxx nicht übersteigen.<br>
                    Aber auch dann ist es einfach. Du rechnest den gesamten Maximalen Wert durch addieren aus. Dann rechnest du ihn auf 100 um. Step := 100 / Max. Nun realtivierst du jeden Telschritt per Progressbar.Step := Step * TeilMax. Also immer relativ zum gesamten Maximum.<br>
                    Zum Schluß würden so alle Progressbars von 0-99 zählen.<br>

                    Gruß Hage

                    Comment


                    • #11
                      He! Das klingt verdammt nach dem was ich eigentlich suchte... Es ist natürlich viel einfacher jede beteiligte PB mit der gleichen Skalierung laufen zu lassen, dann erspart man sich komplizierte Berechnungen und jede Menge unnütze Knoten im Hirn =) !<br>
                      Hab mal wieder viel zu kompliziert gedacht...<br>
                      <br>
                      Vielen Dank!<br>
                      <br>
                      Gruß<br>
                      &nbsp;Nico Stöckigt<br>
                      <br>
                      --- Thread closed --

                      Comment

                      Working...
                      X