Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Entfernung zwischen zwei Pixelkoordinaten (https://www.delphipraxis.net/102692-entfernung-zwischen-zwei-pixelkoordinaten.html)

dominikkv 2. Nov 2007 14:46

Re: Entfernung zwischen zwei Pixelkoordinaten
 
du solltest erst einmal suchen was genau am längsten in deiner procedure dauert.
-das berechnen der entfernung?
-das verändern der lautstärke (SetMasterVolume)?
wie sieht bis jetzt deine Timerprozedur aus (also hast du was verändert)?

cRayZo 2. Nov 2007 15:06

Re: Entfernung zwischen zwei Pixelkoordinaten
 
nicht viel aber ich kann sie dir ja mal vollständig mit Funktionen kopieren:

[code=delphi]function _VolumeControl(Mixer: hMixerObj;
var Control: TMixerControl): MMResult;
var
Line : TMixerLine;
Controls : TMixerLineControls;
begin
ZeroMemory(@Line, SizeOf(Line));
Line.cbStruct := SizeOf(Line);
Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
Result := mixerGetLineInfo(Mixer,
@Line,
MIXER_GETLINEINFOF_COMPONENTTYPE);
if Result = MMSYSERR_NOERROR then begin
ZeroMemory(@Controls, SizeOf(Controls));
Controls.cbStruct := SizeOf(Controls);
Controls.dwLineID := Line.dwLineID;
Controls.cControls := 1;
Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
Controls.cbmxctrl := SizeOf(Control);
Controls.pamxctrl := @Control;
Result := mixerGetLineControls(Mixer,
@Controls,
MIXER_GETLINECONTROLSF_ONEBYTYPE);
end;
end;

procedure SetMasterVolume(Mixer: hMixerObj; Value: Word);
var
MasterVolume : TMixerControl;
Details : TMixerControlDetails;
UnsignedDetails : TMixerControlDetailsUnsigned;
Code : MMResult;
begin
Code := _VolumeControl(Mixer, MasterVolume);
if Code = MMSYSERR_NOERROR then begin
with Details do begin
cbStruct := SizeOf(Details);
dwControlID := MasterVolume.dwControlID;
cChannels := 1; // set all channels
cMultipleItems := 0;
cbDetails := SizeOf(UnsignedDetails);
paDetails := @UnsignedDetails;
end;
UnsignedDetails.dwValue := Value;
Code := mixerSetControlDetails(Mixer,
@Details,
MIXER_SETCONTROLDETAILSF_VALUE);
end;
if Code <> MMSYSERR_NOERROR then
raise Exception.CreateFmt('SetMasterVolume failure, '+
'multimedia system error #%d',
Code:
);
end;
/////////////////////////////////////////////////function end////////////////////////

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
    Shape1.Left:= X-4 {1};
    Shape1.Top := Y-4 {2};

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  leftx,topx:                        real;
  shape1top, shape1left,entfernung:  integer;
begin
    shape1Top:=shape1.Top;shape1left:=shape1.Left;
if Edit1.Text='' then Edit1.Text:='500';  try Timer1.Interval:=strtoint(edit1.Text) except end;

//PC001
     topx:=abs(PC001.Top-shape1Top);
     leftx:=abs(PC001.left-shape1left);
  entfernung:=trunc(250*sqrt(leftx*leftx+topx*topx));
                if entfernung>65000 
                then entfernung:=65000;
  SetMasterVolume(MasterVolumeControl,65000-entfernung);
  lbPC001.Caption:=floattostr(65000-entfernung);
vll geht die Lösung des Problems so leichter ;)
lg cRayZo

dominikkv 2. Nov 2007 15:18

Re: Entfernung zwischen zwei Pixelkoordinaten
 
das hier:
Delphi-Quellcode:
if Edit1.Text='' then Edit1.Text:='500';  try Timer1.Interval:=strtoint(edit1.Text) except end;
solltest du anders lösen... zB im OnChange des Edits oder du spendierst noch nen Button bei dem du das änderst.
Versuchs mal so:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  X, Y, entfernung: Integer;
begin
  Y := abs(PC001.Top - shape1.Top);
  X := abs(PC001.left - shape1.left);
  entfernung := min(round(250 * sqrt(X * X + Y * Y)), 65000);

  SetMasterVolume(MasterVolumeControl, 65000 - entfernung);
  lbPC001.Caption := IntToStr(65000 - entfernung);
end;

Nikolas 2. Nov 2007 15:54

Re: Entfernung zwischen zwei Pixelkoordinaten
 
Die Zeit wird eher beim lautstärke setzen und nicht bei der entfernungsberechnung verbraten.

Du könntest zum einen das Mouse-move Event nehmen und nur was machen, wenn sich die Maus bewegt hat, (vgl. Klaus), oder du merkst dir die aktuelle lautstärke undveränderst sie nur, wenn der neue Wert mehr als 5% davon abweicht.

Stoppe doch einfach mal die Zeit um 10000 mal die Entfernung zu berechnen und um 10.000 Mal eine neue Lautstärke zu setzen und schreibe hier mal die Zeiten hin. Wenn du etwas optimieren willst, solltest du schon wissen, wo die Zeit bleibt.

cRayZo 2. Nov 2007 19:31

Re: Entfernung zwischen zwei Pixelkoordinaten
 
ja es ist auf jeden Fall die Lautstärke, (ich meine das sieht man ja eig schon)
aber das Problem ist (was ich eig sonst nicht mache, aber ich war halt faul) der code is ned von mir, und ich versteh ihn nicht^^ Es gibt auch keine einfachere Lösung für die Änderung der Soundlautstärke oder?


//edit: ich habe für die Frage im Soundbereich die Frage gestellt, das Problem mit der Entfernung ist ja jetzt gut gelöst, thx nochmal ;)

Nikolas 2. Nov 2007 21:17

Re: Entfernung zwischen zwei Pixelkoordinaten
 
Zitat:

Soundlautstärke
Wie viele Lautstärken kennst du eigentlich? TonLautstärke ist echt ein schönes Wort :wall:
Da kann ich doch gleich zum ServicePoint der DB direkt neben dem Station Store gehen und mir ein Ticket kaufen, um nach England auszuwandern. Was hat dir die deutsche Sprache getan, dass du sie so behandeln musst? :shock:

Nu mal sinnvoll:

Die Frage ist doch, warum du diesen Code sooft ausführst. Greif dir doch einmal mal ein memo und trage bei jedem Aufruf deiner Funktion dort den neuen Wert ein. Ich wette, dass du ziemlich scrollen musst, um unterschiedliche Werte zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.
Seite 2 von 2     12   

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