![]() |
Objekt an Trackbar Position ausrichten
Hi DP, ich stehe vor einem Problem nämlich will ich ein Objekt zur Laufzeit erzeugen und dieses dann an der Trackbarposition ausrichten. Es soll also genau da entstehen wo der Trackbar Regler im Moment steht. Das ganze dient dazu Positionen aus der Trackbar zu speichern und später wieder aufzurufen. Hier ist mein bisheriger Code:
Delphi-Quellcode:
Ich hole mir die Position der Trackpar in Pixeln mit dem:
procedure TForm1.Button1Click(Sender: TObject);
var Img: TImage; pos, top: Integer; h: Cardinal; res: TResourcestream; Graphic: TGraphic; begin if not Cut1 then begin eins := Trb.Position; pos := Trb.Position * Form1.Width div 100; Img := TImage.Create(self); Img.Width := 32; Img.Height := 32; Img.Top := Trb.Top-30; Img.Left := pos-16; h := LoadLibrary('test.dll'); res := Tresourcestream.CreateFromID(h, 8, RT_RCDATA); Graphic:= TPngImage.Create; try Graphic.LoadFromStream(res); Img.Picture.Assign(Graphic); finally res.Free; Graphic.Free; end; self.InsertControl(Img); cut1 := true; end else begin Second := eins; Trb.Position := eins; end; end;
Delphi-Quellcode:
das ist aber nicht das Gelbe vom Ei da die Position nicht stimmt bzw. sehr stark abweicht.
pos := Trb.Position * Form1.Width div 100;
Wie kann ich eine 'elegantere' Methode benutzen falls es eine gibt :mrgreen: Danke Luki :) |
AW: Objekt an Trackbar Position ausrichten
Geht die TrackBar denn über die gesamte Breite der Form?
Übrigens fehlt zu dem LoadLibrary ein entsprechender FreeLibrary-Aufruf. Und die Rückgabe von LoadLibrary sollte ebenfalls ausgewertet werden. MfG Dalai |
AW: Objekt an Trackbar Position ausrichten
Ja, nur ist der Anchor akRight aktiv deshalb habe ich auch ein Problem mit den erzeugten Images aber egal, ich werte doch das LoadLibrary mit
Code:
aus oder verstehe ich gerade etwas falsch?
h := ...
|
AW: Objekt an Trackbar Position ausrichten
Was machst du, wenn's Test.dll nicht gibt oder er aus irgendwelchen anderen Gründen die DLL nicht laden konnte?
![]()
Delphi-Quellcode:
if (h = 0) then ... Fehler
|
AW: Objekt an Trackbar Position ausrichten
Ach so, ups.. Und wie kann ich das mit der Trackbar machen wenn sie über die ganze Form geht also Align alBottom?
|
AW: Objekt an Trackbar Position ausrichten
Da es TrackBar.SchiebereglerPositionX m.E. nicht gibt wird es wohl schwierig werden.
Du könntest ggf. eine eigene Komponente ableiten und die obige (neu hinzu zu fügende) Eigenschaft innerhalb der Zeichenfunktion selbst belegen. Ansonsten kannst Du vielleicht die Position selbst über Prozente von Width ermitteln, aber das kann dann durchaus Abweichungen enthalten. |
AW: Objekt an Trackbar Position ausrichten
Eventuell verstehe ich die Frage falsch, dann den Tipp ignorieren.
So wie es verstanden habe willst du ein Objekt an einem anderen Objekt aurichten. Das Beispiel (siehe Anhang) hier: ![]() |
AW: Objekt an Trackbar Position ausrichten
Mit Align alBottom (TrackBar geht über die gesamte Breite der Form, sofern sie darauf liegt) müsste der vorhandene Code doch schon passen. Nehmen wir an, die Form ist 1000 Pixel breit, die TrackBar hat Max=100 Schritte und der Slider steht bei Position=40. Dann kommt bei der Rechnung mit obigem Code ein Left-Wert von 400 raus, was 40 Prozent entspricht:
Code:
Oder überseh ich was?
Trb.Position * Form1.Width div 100;
40 * 1000 / 100 = 400 MfG Dalai |
AW: Objekt an Trackbar Position ausrichten
Der Schieberegler, bzw. dessen Mitte wird ja nicht über die gesamte KomponentenLlänge verschoben.
Am Anfang und Ende gibt es ein Offset, welches man natürlich noch mit einrechnen muß. |
AW: Objekt an Trackbar Position ausrichten
Ok danke für die Hilfe :thumb: Ich habe das jetzt einmal ausprobiert und habe mit ein paar Zahlen jongliert und kam dann auf folgenden Code:
Delphi-Quellcode:
Und wenn ich dann jetzt das Objekt erzeuge ist es ziemlich genau zur Trackbar Position ;)
pos := (Trb.Position * (Trb.Width div 100))+25; //pos ist die Position für das Image, Trb ist die Trackbar
|
AW: Objekt an Trackbar Position ausrichten
Etwas genauer wäre vermutlich noch:
pos := ((Trb.Position * (Trb.Width - Links - Rechts)) div 100))+ Links - (Image.Width div 2); // (Image.Width div 2) wenn das Image zentriert über dem Strich sitzen soll Wobei Links und Rechts der Abstand des ersten und letzten Strichs zum Rand wäre. |
AW: Objekt an Trackbar Position ausrichten
Du kannst die Area des Silders mit TBM_GETTHUMBRECT herausfinden. Diese ist bezogen auf die TrackBar Area. Damit kannst du dir die Pos. auf der Form errechnen.
![]() |
AW: Objekt an Trackbar Position ausrichten
Hmm.. ich habe eigentlich versucht den Sachen von Microsoft aus dem Weg zu gehen da ich nicht weiß wie ich das in Delphi benutzen muss.. Gibt es dann dazu irgendwelche Beispiele?
|
AW: Objekt an Trackbar Position ausrichten
|
AW: Objekt an Trackbar Position ausrichten
Ok ich habe jetzt in wenig herum gebastelt. Ich habe mir jetzt gedacht, zeichne dir doch einfach eine eigene Trackbar mit vier TImages. Zwei Enden, ein Mittelteil und ein Schieber. Alles schön und gut nur stehe ich jetzt vor dem Problem, wie mache ich das mit dem Max bzw. Min. Ich habe jetzt einmal folgendes probiert und es kommt eigentlich kein schlechtes Ergebnis dabei raus:
Delphi-Quellcode:
Gibt es nicht noch eine elegantere Methode das zu lösen?
ImgSlide.Left := ImgSlide.Left+(((ImgEck1.Left+ImgEck2.Left+32)+ max div 60)div max); (* Das Ganze liegt in einem Timer mit dem Interval 100, max wurde durch ein Edit definiert und liegt in private & der Rest erklärt sich von selbst (falls nicht hier meine Erklärung: ImgSlide= Schieber, ImgEck1= Linkeecke & ImgEck2= Rechteecke)*)
Danke Luki :) PS: Bei größeren Zahlen als 60 Sekunden bewegt sich der Schieber nicht mehr |
AW: Objekt an Trackbar Position ausrichten
Keiner weiß, was du da genau machst. Wie wäre es mal mit dem Code Abschnitt im ganzen?
Hier kann keiner Hellsehen...:glaskugel: |
AW: Objekt an Trackbar Position ausrichten
Ich werde es glaub ich nie lernen.. :wall: hier:
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Imaging.pngimage, Vcl.ExtCtrls, Vcl.StdCtrls; type TForm1 = class(TForm) ImgEck1: TImage; ImgSlideGro: TImage; ImgEck2: TImage; ImgSlide: TImage; Timer1: TTimer; LblTest: TLabel; Ed1: TEdit; Button1: TButton; Button2: TButton; Timer2: TTimer; Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); private { Private-Deklarationen } max : Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if not (Ed1.Text = '') then begin max := StrToInt(Ed1.Text) * 10; Timer1.Enabled := true; Timer2.Enabled := true; end else begin Application.MessageBox('Bitte eine Maximal-Zahl eingeben!', 'MAX ZAHL', MB_ICONWARNING or MB_OK); end; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled := false; Timer2.Enabled := false; Label1.Caption := '0'; ImgSlide.Left := ImgEck1.Left; end; procedure TForm1.Timer1Timer(Sender: TObject); var maxwi: Integer; begin if (ImgSlide.Left = ImgEck2.Left) or (ImgSlide.Left > ImgEck2.Left+5) then begin ImgSlide.Left := ImgEck1.Left; end else begin ImgSlide.Left := ImgSlide.Left+(((ImgEck1.Left+ImgEck2.Left+32)+ max div 60)div max); end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin Label1.Caption := IntToStr(StrToInt(Label1.Caption)+1); end; end. |
AW: Objekt an Trackbar Position ausrichten
Schau mal hier hab ich mal vor langer Zeit dran rumprobiert, vllt. kann dir das ja helfen...
![]() |
AW: Objekt an Trackbar Position ausrichten
Hmm.. Da wird ja die Trackbar in einem neuen Fenster geöffnet/erzeugt nur ich möchte ja eigentlich nur errechnen wie die Trackbar sich bewegt bei unterschiedlicher Länge eines Integer Wertes der Breite der 'gebauten' Trackbar und die Position des Schiebers.
Edit: Und wenn der Wert größer als 70 sek. hängt sich das ganze auf und der Schieber bewegt sich nicht mehr.. |
AW: Objekt an Trackbar Position ausrichten
Mir erschließt sich nicht, was Du mit den Timern machst.
Häng doch mal Dein Testprojekt als Zip an. Vielleicht kann dann ja jemand mal drauf schauen. |
AW: Objekt an Trackbar Position ausrichten
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe, damit ich das Projekt wiedererkennen kann, ihm den Namen TestTrackbar gegeben also nicht wundern ;)
|
AW: Objekt an Trackbar Position ausrichten
Hmm, ich weiß nicht recht, was Du da erreichen willst.
Auf jeden Fall solltest Du Dein Ziel etwas einfacher angehen. Je einfacher, desto besser nachvollziehbar und wartbar. Ich denke, Dein Problem liegt in dem
Delphi-Quellcode:
.
max div 60)div max
Wenn max > 60 ist dann hat das natürlich deutliche Auswirkungen. Aber für eine bessere Lösung müsste man wissen, was Du erreichen willst. Sind die Timer aktuell nur für Tests da? Willst Du die Trackbar später mit der Maus einstellen oder brauchst Du eher eine ProgressBar, die einen Fortschritt anzeigt? |
AW: Objekt an Trackbar Position ausrichten
Ich möchte das sie als Fortschrittsanzeige dient aber auch später verschoben werden kann
|
AW: Objekt an Trackbar Position ausrichten
Ok, dann mach einfach etwas Ordnung.
Folgende Eigenschaften brauchst Du: MinValue, MaxValue für Minimal- und Maximalwert. Position für den aktuellen Wert. Width für die Breite der Trackbar. XPosition für den Mittelwert des Schiebers in der Horizontalen. XPosition errechnest Du prozentual zu Width wie Position zu (MaxValue - MinValue) und zwar immer dann wenn eine der anderen Eigenschaften geändert wird (also in einer Prozedur CalcXPosition, die Du von unterschiedlichen Stellen aus aufrufen kannst). Wenn Du das Ganze funktionsfähig hast, dann kannst Du Dich auch mit der Komponentenentwicklung befassen. Dann wird so etwas nicht im Formularcode umgesetzt sondern in einer Komponente gekapselt (wie eben der TTrackBar), die dann überall einsetzbar ist. |
AW: Objekt an Trackbar Position ausrichten
Irgendwie stehe ich gerade auf dem Schlauch... Ich werde einmal eine Nacht drüber schlafen, mal sehen ob ich's morgen hin bekomme ;)
|
AW: Objekt an Trackbar Position ausrichten
Zitat:
|
AW: Objekt an Trackbar Position ausrichten
... und dazu mal für alle Eigenschaften "Setter" vorsehen in folgender Form:
Delphi-Quellcode:
Natürlich musst Du die beiden Methoden dann auch noch deklarieren.
procedure Form1.SetMaxValue(aValue: Integer);
begin if MaxValue <> aValue then begin CalcXPosition; PaintTrackbar; end; end; Das ist etwas mehr Schreibarbeit aber so ist das gut nachvollziehbar und Du weist auch später noch, was Du da programmiert hast. Die Werte änderst Du dann durch SetMaxValue(100), SetPosition(50) usw. Im Grunde hast Du dann schon fast die Funktionsweise einer echten Komponente. ;-) |
AW: Objekt an Trackbar Position ausrichten
Hier mal eine Methode um ein Control an der Position der TrackBar auszurichten
Delphi-Quellcode:
Du willst ein Image daran ausrichten, dann einfach
procedure TForm1.ControlOnTrackBarPosition( AControl : TControl; ATrackBar : TTrackBar );
const C_TRACKBAR_BORDER_LEFT = 12; C_TRACKBAR_BORDER_RIGHT = 12; var LLeft : Integer; begin LLeft := ATrackBar.Left + C_TRACKBAR_BORDER_LEFT + Round( ( ATrackBar.Width - C_TRACKBAR_BORDER_LEFT - C_TRACKBAR_BORDER_RIGHT ) * ATrackBar.Position / ( ATrackBar.Max - ATrackBar.Min ) ); AControl.Top := ATrackBar.Top - AControl.Height; AControl.Left := LLeft - AControl.Width div 2; end;
Delphi-Quellcode:
und schon wandert das Image ganz brav an der TrackBar entlang, zentriert über dem Pinörpel ;)
procedure TForm1.TrackBar1Change( Sender : TObject );
begin ControlOnTrackBarPosition( Image1, Sender as TTrackBar ); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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