Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 16:06
Ich weiss, peinlich. Ich Frage trotzdem mal nach.
Das ist der Ausgangspunkt:
FillSize:= SolveForX(PercentDone, W)
Ergebnis: FillSize 0<=W.
Nun kommt eine Variable dazu, nennen wir sie A diese kann Werte annehmen 0<=X
Fillsize soll nun zusätzlich den Wert von A annehmen und A soll wiederum Proportional >=0 werden wenn Fillsize <=W wird.
vergebliche Versuche, naja......
FillSize:= SolveForX(PercentDone, W) + A ..... (Fillsize (/) (*) irgendwas - irgenwas (/) (*) ...) ????
Aber wie immer pack ich die Reihenfolge nicht, wo was an welcher Stelle mit wem, sein muss!?
Selbst auf Papier(mehrere Seiten) will nichts zustande kommen
und hoffe da könnt ihr weiter Helfen.
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 04.11.10 16:14
ALF hat folgendes geschrieben : | Fillsize soll nun zusätzlich den Wert von A annehmen und A soll wiederum Proportional >=0 werden wenn Fillsize <=max wird. |
Kannst du diesen Satz noch einmal mathematisch definieren? Bis jetzt sieht er für mich so aus, als könnte man das Blaue vom Himmel dort hinein-interpretieren  .
/edit: Es fängt schon früher an, was soll
Zitat: | Ergebnis: FillSize 0<=W. |
bedeuten? 0 <= FillSize <= W?
_________________ >λ=
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 04.11.10 16:15
Kann es sein das du einfach ne Progressbar nachbauen willst? So mehr oder weniger?
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 16:31
@elundril: jo hab ich schon. Problem ist der zusätzliche Border, den ich ab bzw dazu rechnen muss.
@Kha: Ok ohne Symbole.
FillSize soll nun zusätzlich den Wert von A annehmen.
A, soll wiederum proportional kleiner gleich 0 werden, wenn FillSize grösser wird bis max W.
Hinweis: A, ist nie grösser als W
Bin nun mal kein Mathematiker um dies so zu schreiben oder anders zu erklären
Wüsste sonst nicht mehr wie man es noch schreiben soll?
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
buster
      
Beiträge: 66
Erhaltene Danke: 7
WIN 7
Delphi 2010 Prof
|
Verfasst: Do 04.11.10 17:09
öhm... A = W - FillSize ??? wenn W konstant bleibt 
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 17:38
Ich weiss, schlecht beschrieben aber wie soll ich es sonst Formulieren!!
@Buster: A ist ein selbständiger Wert und soll kleiner werden!
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Do 04.11.10 17:51
@Alf: Sorry, aber niemand versteht, worum es überhaupt geht?!? Vielleicht kannst du uns folgendermaßen helfen:
Welche Variable ist eine Konstante, welche nicht?
Für was stehen die Variablennamen A, w, ...
Was sind Maximal-/Minimalwerte?
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Do 04.11.10 17:52
Sowas?
Zitat: | FillSize soll nun zusätzlich den Wert von A annehmen.
A, soll wiederum proportional kleiner gleich 0 werden, wenn FillSize grösser wird bis max W.
Hinweis: A, ist nie grösser als W |
Delphi-Quelltext 1: 2: 3: 4:
| Fillsize := A; if A < W then A := A * (1 / Fillsize) |
LG
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 20:11
Ok, mal sehen ob ich es jetzt schaffe.
SolveForX(PercentDone, W) ist eine Funktion aus ProgressBar.
W kann einen Wert von 0 bis entlos annehmen. Setzen wir aber auf 100.
Quelltext 1: 2: 3:
| W = 100
Fillsize:= SolveForX(PercentDone, W) |
Fillsize enthält das Ergebnis von SolveForX(PercentDone, W), also in diesem Fall 0 bis 100.
Jetzt kommt das zusätzliche!
A kann einen Wert von 0 bis entlos annehmen. Setzen wir aber auf 3.
Quelltext
FillSize soll nun zusätzlich den Wert von A annehmen. Kein Problem
Quelltext 1:
| Fillsize:= SolveForX(PercentDone, W) + A |
jetzt wirds eng.
A soll aber proportional kleiner werden, wenn das Ergebnis von SolveForX(PercentDone, W) grösser wird
also in etwa so:
Quelltext 1:
| Fillsize:= SolveForX(PercentDone, W) + A - (( SolveForX(PercentDone, W) / A) * w) |
oder so ähnlich. Dabei darf A ja nicht kleiner als 0 werden.
Ich hoffe das es nun Verständlich ist
Wenn nicht, löscht einfach diesen Thread.
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Do 04.11.10 20:21
Also so?
Delphi-Quelltext 1:
| Fillsize := SolveForX(PercentDone, W) + (1 / SolveForX(PercentDone, W)) * A |
LG
Für diesen Beitrag haben gedankt: ALF
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 20:30
Im prinzip ja. Nur halt die Division durch null darf ja nicht vorkommen.
und da gabs auch was mit ner Formel???
Irgend wie so:
Quelltext 1:
| Fillsize := SolveForX(PercentDone, W) + (1 div (SolveForX(PercentDone, W) + 1) * PaintRect.Left); |
nur fehlt da noch was??
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Do 04.11.10 21:04
Moin,
wenn du ein proportionales schrumpfen möchtest, bietet sich soetwas einfach an  . Im einfachsten Fall kannst du einfach vorher abfragen, ob SolveForX > 0 ist (davon bin ich mal ausgegangen, bei <0 müsste man noch am Vorzeichen drehen. Wenn du einen Grenzwert möchtest, bietet sich ja eine Exponentialfunktion an
edit:
Sorry, hab deinen nachtrag zu spät gelesen. Also die addition dreht imho zu sehr am ergebnis. Auch die Divison mit div und die darauffolgende multiplikation versemmeln dir jegliche genauigkeit. Besser: erst rechnen, dann runden.
LG
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 04.11.10 21:14
Vielleicht kannst du einfach mal beschreiben, was du erreichen willst, ohne irgendwelche Formeln. Vielleicht eine Skizze, mit den Bereichen und dem Border. Wenn du dir die Fragestellung klar formulierst und skizzierst, kommst du vermutlich selbst auf die Lösung...
Du willst irgendwie die Breite des zu füllenden Rechtecks in einer Progressbar berechnen und dabei einen linken Rand berücksichtigen?
Damm meinst du vielleicht das hier: SolveForX(PercentDone, W) liefert einen Wert zwischen 0 und W. Du möchtest jetzt aber eine Verschobene und linear skalierte Funktion, die einen Wert zwischen A und W liefert. In dem Fall skalierst du das Resultat von SolveForX um den Faktor (W - A)/W und addierst A. Also FillSize = SolveForX(PercentDone, W) * (W - A) / W + A ?
Für diesen Beitrag haben gedankt: ALF
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 21:45
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 21:53
THX @delfiphan
Genau das war es
Also doch Formel, nur der Weg dahin schweeeeeeer.
Sorry 'Verschobene und linear skalierte Funktion' hat man ja nicht jeden Tag.
Merken kann ich mir sowas eh nicht, leider.
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 04.11.10 22:45
ALF hat folgendes geschrieben : | Also doch Formel, nur der Weg dahin schweeeeeeer.
Merken kann ich mir sowas eh nicht, leider. |
So viel zu merken gibt's da nicht
Du machst einfach eine Skizze und merkst, dass du aus dem Bereich der Grösse W einen Bereich der Grösse W - A machen willst. Daher kannst du mit dem Dreisatz einfach durch W dividieren und mit W - A multiplizieren. Dann noch A addieren, wie du bereits selbst herausgefunden hast. Gibt genau die Formel oben.
Dein Lösungsansatz war gar nicht so falsch. Du hast einfach den Dreisatz verkehrt angewendet. Die Formel "auf deine Art gelöst" müsste so gehen:
SolveForX(PercentDone, W) + A - SolveForX(PercentDone, W) / W * A
Alternativ könnte man auch schreiben:
SolveForX(PercentDone, W) + A - PercentDone / 100 * A
Die 3 Formeln kann man ineinander umrechnen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.11.10 23:08
Entweder werde ich durch die Chemo langsam matschig in der Birne oder er hat es so erklärt, dass es für den durchschnittlich intelligenten Erdenbürger, wie ich es einer bin, unverständlich bleibt.
Also er hat doch schon den Prozentsatz. Diesen muss er doch nur in Pixel in Abhängigkeit der Breite der Gauge umrechnen. Die Breite natürlich ohne Rand. Den Rand kann man dann ja beim Zeichnen berücksichtigen. Was ich sagen will, mir kommen eure Lösungen unnötig kompliziert vor.
Für diesen Beitrag haben gedankt: ALF
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 04.11.10 23:29
Naja, ob Percent / 100 * (W - A) + A. oder SolveForX(PercentDone, W) / W * (W - A) + A, ist praktisch das gleiche. Ich ging jetzt mal davon aus, dass er ums Verrecken seine Funktion verwenden will. Das hatte ich bisher noch nicht hinterfragt
Sinnvoll wäre eine "world transformation", die aus dem Parameter direkt die Breite in Pixel berechnet.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 04.11.10 23:31
Luckie hat folgendes geschrieben : | ...dass es für den durchschnittlich intelligenten Erdenbürger, wie ich es einer bin, unverständlich bleibt. |
Du erkennst an meiner Fragestellung wie weit ich da noch drunter bin!
EDIT: Zeilen entfernt.
Ok,ich nehme alles zurück und behaupte das gegenteil
Nach nochmaligen durchschauen der Paint Routine, habt ihr natürlich recht.
Ich kann die ganze Fläsche zeichnen und dann mit
Delphi-Quelltext 1: 2:
| if FBorderStyle = bsSingle then InflateRect(PaintRect, -FBorderSize, -FBorderSize); | das ganze wieder zurück zeichnen erspart man sich die Formel!
Aber durch solch Diskurs, kann man halt nur lernen und weis es beim nächsten mal selbst
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 05.11.10 03:17
Also ich hätte es so gemacht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; procedure FormPaint(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private FPercent: Integer; FPixels: Integer; procedure PaintGauge; procedure CalcPixels; public end;
var Form1: TForm1;
const MAXWIDTH = 375; PENWIDTH = 1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin FPercent := 0; CalcPixels; Form1.Repaint; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if FPercent < 100 then begin CalcPixels; Inc(FPercent); Caption := Format('Prozent: %d / Pixel: %d', [FPercent, FPixels]); end else FPercent := 0; Form1.Repaint; end;
procedure TForm1.FormPaint(Sender: TObject); begin PaintGauge; end;
procedure TForm1.CalcPixels; begin FPixels := MAXWIDTH * FPercent div 100; end;
procedure TForm1.PaintGauge; begin Canvas.Pen.Style := psSolid; Canvas.Pen.Color := clBlack; Canvas.Pen.Width := PENWIDTH; Canvas.Rectangle(100, 75, 100+MAXWIDTH, 90); Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := clWhite; Canvas.FillRect(Rect(100+PENWIDTH,75+PENWIDTH,100+MAXWIDTH-PENWIDTH,90-PENWIDTH)); Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := clRed; Canvas.FillRect(Rect(100+PENWIDTH,75+PENWIDTH,100+PENWIDTH+FPixels+PENWIDTH,90-PENWIDTH)); end;
end. |
Die Zeichenroutine stimmt nicht ganz. Ändert man die Zeichenstiftdicke, wird das nicht so richtig berücksichtigt. Mit den Zeichenroutinen kenne ich mich nicht so aus.
|
|
|