Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kleines rechnen problem (https://www.delphipraxis.net/160258-kleines-rechnen-problem.html)

EWeiss 4. Mai 2011 22:55

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

Aphton 4. Mai 2011 23:03

AW: Kleines rechnen problem
 
Zitat:

Zitat von EWeiss (Beitrag 1098915)
Wenn ich bei der ersten Trackbar[0] eine value von 65 habe und die anderen alle eine Value von 35.

Dann?

Edit: Dein Problem ist schwer verständlich!

EWeiss 4. Mai 2011 23:11

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098917)
Zitat:

Zitat von EWeiss (Beitrag 1098915)
Wenn ich bei der ersten Trackbar[0] eine value von 65 habe und die anderen alle eine Value von 35.

Dann?

Edit: Dein Problem ist schwer verständlich!

Ok sagen wir mal so

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:
For IntI := 0 to 15
 Trackbars[IntI] := MasterTrackbar.Value;
Damit verschiebe ich jetzt alle Trackbars von 0..15 abhängig von der 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

Aphton 4. Mai 2011 23:18

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:
For IntI := 0 to 15 do
 Trackbars[IntI] := Trackbars[IntI] + MasterTrackbar.Value;
Dann solltest du folgendes machen:
Delphi-Quellcode:
For IntI := 0 to 15 do
 Trackbars[IntI] := Min(Trackbars[IntI] + MasterTrackbar.Value, 100);
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!

Edit: Faaalllss ich dein Problem richtig verstanden habe...

EWeiss 4. Mai 2011 23:22

AW: Kleines rechnen problem
 
Hier mal der originale Code
hab ihn geändert.
Delphi-Quellcode:
        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;
Aber auch das funktioniert nicht. :(

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

Aphton 4. Mai 2011 23:26

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!

EWeiss 4. Mai 2011 23:29

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098921)
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!

Schau mal mein Pic..

Volume[IntI] Min = 0; Max 100
Das selbe bei der MasterVolume

gruss

Aphton 4. Mai 2011 23:31

AW: Kleines rechnen problem
 
Willst du, dass die 1..16 Regler den Wert des Masterreglers nicht überschreiten?

EWeiss 4. Mai 2011 23:33

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098923)
Willst du, dass die 1..16 Regler den Wert des Masterreglers nicht überschreiten?

Ich möchte das die Regler ihren wert behalten aber komplett mit dem Masterregler verschoben werden.
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

BUG 4. Mai 2011 23:39

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.

EWeiss 4. Mai 2011 23:42

AW: Kleines rechnen problem
 
Zitat:

Zitat von BUG (Beitrag 1098925)
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.

Das tue ich ja schon in den propertys des Controlls selbst. ;)
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

Aphton 4. Mai 2011 23:47

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 := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, wp));
TempVal muss die Differenz des neuen und des alten Wertes sein.
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

EWeiss 4. Mai 2011 23:51

AW: Kleines rechnen problem
 
Zitat:

Du willst bei allen Reglern eine Inkrementierung bzw. Dekrementierung mit der Differenz des geänderten Wertes des Masterreglers und des ursprünglichen Wertes machen.
Korrekt.. ;)
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

rainerg 4. Mai 2011 23:53

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.

Aphton 5. Mai 2011 00:00

AW: Kleines rechnen problem
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das dürfte helfen...

EWeiss 5. Mai 2011 00:03

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098930)
Das dürfte helfen...

Danke werde es mal anschauen..

Delphi-Quellcode:
        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;
Wenn Volume[0]; einen wert von 67 hat kommt bei mir
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

Aphton 5. Mai 2011 00:17

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:
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;
Dürfte dann so aussehen...

EWeiss 5. Mai 2011 00:20

AW: Kleines rechnen problem
 
Zitat:

Falls es für alle ist - heißt das, dass kein Regler mehr inkrementiert werden darf, wenn schon eines 100 erreicht hat?
Ja so meine ich das dass gleiche bei 0

Danke für deine hilfe

gruss

Aphton 5. Mai 2011 00:22

AW: Kleines rechnen problem
 
Nicht der Rede wert =P

EWeiss 5. Mai 2011 00:24

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

Aphton 5. Mai 2011 00:25

AW: Kleines rechnen problem
 
Ähm dann positiniere den Masterregler neu vor jedem Abort =\
Das dürftest du aber schon selber hinkriegen!

EWeiss 5. Mai 2011 00:31

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098936)
Ähm dann positiniere den Masterregler neu vor jedem Abort =\
Das dürftest du aber schon selber hinkriegen!

Jo denk ich auch :)
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

EWeiss 5. Mai 2011 00:50

AW: Kleines rechnen problem
 
Habe es jetzt mal umgesetzt.
Delphi-Quellcode:
        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;
bekomme aber bei Abort ein EAbort Exception..
Ansonsten funktioniert es Hervorragend ;)

gruss

Aphton 5. Mai 2011 00:59

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;

EWeiss 5. Mai 2011 01:05

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098939)
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;

Jo non-vcl'e ;)

So gehts mit ein paar einschränkungen aber das regel ich selbst.
Danke dir ;)

Delphi-Quellcode:
        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;
gruss

Aphton 5. Mai 2011 01:06

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!

EWeiss 5. Mai 2011 01:13

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098941)
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!

Jo das ist immer so eine sache mit Klassen grundsätzlich gebe ich dir da recht.
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

Aphton 5. Mai 2011 01:16

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.

EWeiss 5. Mai 2011 01:22

AW: Kleines rechnen problem
 
Zitat:

Zitat von Aphton (Beitrag 1098943)
Ä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.

Wollte damit sagen das es in diesen Fall besser wäre die Klasse in der DLL
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:

Ich hab auch zb. ein paar Komponente für die Bass.dll geschrieben.
Jo ich nur eine die Bass_vis.dll
Hab den Support aber eingestellt.

Edit:
Jetzt funktioniert soweit alles.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz