![]() |
Kleines rechnen problem
opps .. ja vielleicht ist es auch schon zu spät für mich
Habe 16 Trackbars [0..15] und eine MasterTrackbar Beide haben eine Maxvalue von 100. Wenn ich bei der ersten Trackbar[0] eine value von 65 habe und die anderen alle eine Value von 35. Wie berechne ich das jetzt am besten das beim verschieben der MasterTrackbar alle Trackbars abhängig von der aktuellen MasterTrackbar value verschoben werden aber ohne die maximale value von 100 zu überschreiten aber die alte Value der TrackBars[0..15] zu behalten (quasi zur MasterTrackbar addieren). gruss |
AW: Kleines rechnen problem
Zitat:
Edit: Dein Problem ist schwer verständlich! |
AW: Kleines rechnen problem
Zitat:
Meine MasterTrackbar hat eine aktuelle Value von 50. Meine anderen Trackbars[0..15] haben auch eine Value von 50. Dann mache ich folgendes!
Delphi-Quellcode:
Damit verschiebe ich jetzt alle Trackbars von 0..15 abhängig von der MasterTrackbar.Value
For IntI := 0 to 15
Trackbars[IntI] := MasterTrackbar.Value; Wenn ich aber nun Trackbars[0] > 50 habe bsp. 75 wäre dann beim verschieben der MasterTrackbar wenn diese die maximale Value erreicht hat bei der Trackbars[0] eine Value von 125 oder? Das darf aber nicht sein da die Hundert nicht überschritten werden darf. Ich möchte die alten value's behalten wenn die MasterTrackbar verschoben wird. Aber mit
Delphi-Quellcode:
Trackbars[0] := Trackbars[0] + MasterTrackbar.Value
komme ich nicht klar das es ja auch negative werte gibt wenn ich die MasterTrackbar nach links scrolle. Vielleicht ist das verständlicher. gruss |
AW: Kleines rechnen problem
Bei deinem Pseudocode verschiebst du nichts, du weißt allen Trackbars Elementen denselben Wert zu.
Aber zum angesprochenen Problem: Schau dir mal die Funktion Math.Min an! Min(a, b) liefert dir den kleineren Wert aus der Menge {a, b} Also wenn a < b, dann a, ansonsten b! Du könntest dann, falls du verschiebst (also einen Wert auf den aktuellen draufaddierst) bei der Zuweisung per Min(NeuerWert, 100) dafür sorgen, dass der Wert 100 nicht überschritten wird. Ich schätze mal dein Pseudocode war so gemeint:
Delphi-Quellcode:
Dann solltest du folgendes machen:
For IntI := 0 to 15 do
Trackbars[IntI] := Trackbars[IntI] + MasterTrackbar.Value;
Delphi-Quellcode:
Btw. bin mir nicht ganz sicher, was Min für einen Typ zurückliefert. Falls es ein Fließkommawert ist, müsste noch ein Round vornedran!
For IntI := 0 to 15 do
Trackbars[IntI] := Min(Trackbars[IntI] + MasterTrackbar.Value, 100); Edit: Faaalllss ich dein Problem richtig verstanden habe... |
AW: Kleines rechnen problem
Hier mal der originale Code
hab ihn geändert.
Delphi-Quellcode:
Aber auch das funktioniert nicht. :(
ID_TRACK_MASTERVOL:
begin TempVal := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)); for IntI := 0 to 15 do begin Volume[IntI] := Min(Volume[IntI] + TempVal, 100); SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, ID_VOLUME_FIRST + IntI), Volume[IntI]); end; end; EDIT: Wenn ich nur 3 pixel weiterfahre habe ich schon 100% bei allen 16 Trackbars. Dürfen sie aber erst haben wenn TempVal ebenfalls 100% hat Beim runterscrollen der (TempVal) bleiben alle Trackbars auf 100% gruss |
AW: Kleines rechnen problem
Was genau funktioniert nicht? Mit Min kannst du den Wert 100 nie überschreiten.
Könntest du den Fehler genauer beschreiben? Poste mal welche Werte welche Variablen annehmen und welche sie annehmen sollten! |
AW: Kleines rechnen problem
Zitat:
Volume[IntI] Min = 0; Max 100 Das selbe bei der MasterVolume gruss |
AW: Kleines rechnen problem
Willst du, dass die 1..16 Regler den Wert des Masterreglers nicht überschreiten?
|
AW: Kleines rechnen problem
Zitat:
Qasi eine inc/decrementierung aller aktuellen Valus abhängig vom Masterregler. EDIT: Ohne das der Regler mit der höchsten Value die Hundert überschreitet. Bzw.. der mit der niedrigsten Value die 0 unterschreitet. Alle anderen sollen dann solange inc/dec bis der mit der höchsten/niedrigsten Value 0 oder 100 erreicht hat. gruss |
AW: Kleines rechnen problem
Du könntest für jeden Regler die Position relativ zum Masterregler speichern und dabei aufpassen, das die absoluten Werten im gewünschten Bereich bleiben.
|
AW: Kleines rechnen problem
Zitat:
Allerdings im Speicher nicht in eine Datei. Das würde aber auch nichts ändern. Ob Datei oder Speicher.. bleibt das gleiche. Ich möchte erreichen das alle MidiSpuren gleichzeit abhängig von ihrer aktuelle position mit dem MasterRegler in der Lautstärke verändert werden. gruss |
AW: Kleines rechnen problem
Ich glaube, ich verstehe so langsam, worauf du hinaus willst.
Du willst bei allen Reglern eine Inkrementierung bzw. Dekrementierung mit der Differenz des geänderten Wertes des Masterreglers und des ursprünglichen Wertes machen. Boah, ist schon schwer zum Ausdrücken xD Also dann ist dein Fehler hier:
Delphi-Quellcode:
TempVal muss die Differenz des neuen und des alten Wertes sein.
TempVal := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp));
Also du musst den alten Wert vom Masterregler merken - sofern eine Änderung momentan stattfindet am Regler und sobald sich der Regler nicht mehr ändert, diesen neuen Wert- des gemerkten Wertes ist dein TempVal |
AW: Kleines rechnen problem
Zitat:
Unter der berücksichtigung das der wert 0 von der niedrigsten Value Volume[IntI] nicht unterschritten wird Das selbe mit der höchsten Value 100 nie überschritten wird. Muss dann quasi rausspringen wenn eine der Regler 0 bzw. 100 erreicht hat. Ist wirklich schwer rüber zu bringen :) Also mit meiner Berechnung hapert es da ein bißchen. :wall: Hab schon alles versucht zumal da es ja auch negativ werte gibt wenn die scrollbar nach links gescrollt wird. gruss |
AW: Kleines rechnen problem
Verwalte die Werte für die Trabkbars in einem Array. Dort dürfen die Werte größer als 100 oder kleiner als 0 werden. In Abhängigkeit vom Masteregler kannst du die anderen Werte dann steuern.
Berechne die Veränderung des Masterreglers zur alten Position (der wird dann positiv oder negativ sein) diesen Wert addierst (Minuswert ist ja dann logischerweise praktisch eine Subtraktion) du dann auf die einzelnen Regler. Danach kannst du die Werte auf die Trackbar übertragen, legst aber vorher fest (z. B. über Min/Max), wie mit den Werten größer 100 und kleiner 0 umgegangen werden soll. So gehen die eigentlichen Reglerwerte nicht verloren. Bewegst du eine der anderen Trackbars, also nicht den Master, musst du dessen Position in das entsprechende Arrayfeld übertragen, da du diesen Regler ja jetzt einzeln manipuliert hast. Eine etwas andere Variante wäre, die Positionen der Trackbars relativ zum Masterregler im Array zu speichern. Das Entscheidende ist, die Reglerposition nicht über die Trackbar direkt zu manipulieren. |
AW: Kleines rechnen problem
Liste der Anhänge anzeigen (Anzahl: 2)
Das dürfte helfen...
|
AW: Kleines rechnen problem
Zitat:
Delphi-Quellcode:
Wenn Volume[0]; einen wert von 67 hat kommt bei mir
ID_TRACK_MASTERVOL:
begin for IntI := 0 to 15 do begin OldVolVal := Volume[IntI]; TempVal := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)) - OldVolVal; Volume[IntI] := Min(Volume[IntI] + TempVal, 100); SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, ID_VOLUME_FIRST + IntI), Volume[IntI]); end; end; TempVal = -22 heraus Das ist dann schon der erste Fehler Volume[0]; springt dann auf seinen ursprünglichen wert zurück. EDIT: Dein Beispiel geht nicht(geht schon) Aber! da die anderen Regler alle nachziehen bis sie ebenfalls Hundert bzw. 0 erreicht haben. Das dürfen sie aber nicht ;) Bei Hundert müssen alle anderen dann auf ihre aktuellen Position stehen bleiben. gruss |
AW: Kleines rechnen problem
Liste der Anhänge anzeigen (Anzahl: 1)
Bei hundert?
Für welchen Regler gilt das, Masterregler oder für alle? Falls es für alle ist - heißt das, dass kein Regler mehr inkrementiert werden darf, wenn schon eines 100 erreicht hat? Falls das so ist, müsste da eig. nur eine kleine Abfrage und zwar, ob alle Regler < 100 und > 0 sind. Pass mal im Sourceode folgendes an:
Delphi-Quellcode:
Dürfte dann so aussehen...
procedure TForm1.MasterChange(Sender: TObject);
var Difference: Integer; i: Integer; t: TTrackbar; begin Difference := Master.Position - oldMasterPosition; oldMasterPosition := Master.Position; for i := 1 to 5 do begin t := FindComponent('Trackbar' + IntToStr(i)) as TTrackbar; if Sign(Difference) = 1 then begin if t.Position = 100 then Abort; end else if t.Position = 0 then Abort; end; // alle 5 trackbars durchgehen und den neuen wert anwenden for i := 1 to 5 do begin t := FindComponent('Trackbar' + IntToStr(i)) as TTrackbar; t.Position := Max(Min(t.Position + Difference, 100), 0); end; end; |
AW: Kleines rechnen problem
Zitat:
Danke für deine hilfe gruss |
AW: Kleines rechnen problem
Nicht der Rede wert =P
|
AW: Kleines rechnen problem
So ist das schon fast wie es sein sollte.
Nochmal Danke ;) Jetzt fehlt mir nur noch das der Masterregeler ebenfalls auf Hundert stehen muss wenn eines der Regler Hundert bzw. 0 erreicht hat. Dann wäre es perfekt. ;) gruss |
AW: Kleines rechnen problem
Ähm dann positiniere den Masterregler neu vor jedem Abort =\
Das dürftest du aber schon selber hinkriegen! |
AW: Kleines rechnen problem
Zitat:
Muss ja nur den Slider mit dem höchsten wert ermitteln minus der Maximalen value vom MasterRegler. Und diesen dann einen neuen Max wert übergeben. gruss |
AW: Kleines rechnen problem
Habe es jetzt mal umgesetzt.
Delphi-Quellcode:
bekomme aber bei Abort ein EAbort Exception..
ID_TRACK_MASTERVOL:
begin Difference := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)) - oldMasterVolume; oldMasterVolume := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)); for IntI := 0 to 15 do begin if Sign(Difference) = 1 then begin if Volume[IntI] = 100 then Abort; end else if Volume[IntI] = 0 then Abort; end; for IntI := 0 to 15 do begin Volume[IntI] := Max(Min(Volume[IntI] + Difference, 100), 0); SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, ID_VOLUME_FIRST + IntI), Volume[IntI]); end; end; Ansonsten funktioniert es Hervorragend ;) gruss |
AW: Kleines rechnen problem
Abort ist verknüpft mit dem Vcl-Message Handler.
Ich schätze mal, du arbeitest Non-Vcl. Verwende statt ein Abort folgendes
Delphi-Quellcode:
begin
SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, wp), SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)-Difference); Exit; end; |
AW: Kleines rechnen problem
Zitat:
So gehts mit ein paar einschränkungen aber das regel ich selbst. Danke dir ;)
Delphi-Quellcode:
gruss
ID_TRACK_MASTERVOL:
begin Difference := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)) - oldMasterVolume; oldMasterVolume := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp)); for IntI := 0 to 15 do begin if Sign(Difference) = 1 then begin if Volume[IntI] = 100 then begin SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, wp), Volume[IntI]); Result := 0; Exit; end; end else if Volume[IntI] = 0 then begin SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, wp), Volume[IntI]); Result := 0; Exit; end; end; for IntI := 0 to 15 do begin Volume[IntI] := Max(Min(Volume[IntI] + Difference, 100), 0); SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, ID_VOLUME_FIRST + IntI), Volume[IntI]); end; end; |
AW: Kleines rechnen problem
Nur so am Rande, die letzte Lösung, die ich gepostet habe ist so richtig XXX dirty.
So sollte man das nicht machen! Ich würde dafür direkt eine Klasse ableiten und das Verhalten dort definieren. Ich würd dafür sorgen, dass die Werte gar nicht erst gesetzt werden können, wenn nicht gesetzt werden darf! |
AW: Kleines rechnen problem
Zitat:
Das problem ist nur das ich auf eine DLL zugreife um das Controll Trackbar zu bedienen. Wenn ich einem User nur die DLL ohne Quelltext mitsende kann er da nicht rumpfuschen und muss in dem Fall alles aus der MainUnit heraus regeln. Dort jetzt dafür eine Klasse anlegen? Für ein Controll was sich in einer Externen DLL befindet? EDIT: Irgendwie will das immer noch nicht. Muss deinen Code nochmal anschauen. Alle Trackbars ausgenommen die erste Volume[0] setzen sich alle auf die Ausgangsposition zurück sobald ich den masterRegler anklicke. gruss |
AW: Kleines rechnen problem
Ähm, warum nicht. Ich hab auch zb. ein paar Komponente für die Bass.dll geschrieben. Die Hauptfunktionalität bietet mir die Dll, die Klasse kapselt dies ab. Klappt wunderbar
Edit: In diesem Falle könntest du ihm die Dll und die Wrapper-Unit mit den angesprochenen Klassen schicken. |
AW: Kleines rechnen problem
Zitat:
zu erweitern das wäre dann sinnvoller als in der MainUnit rumzupfuschen. Die frage wäre dann wie oft wird das vom User genutzt bzw.. Überhaupt genutz. Zitat:
Hab den Support aber eingestellt. Edit: Jetzt funktioniert soweit alles. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz