Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekt an Trackbar Position ausrichten (https://www.delphipraxis.net/179728-objekt-trackbar-position-ausrichten.html)

Luki206 27. Mär 2014 14:59

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:
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;
Ich hole mir die Position der Trackpar in Pixeln mit dem:
Delphi-Quellcode:
pos := Trb.Position * Form1.Width div 100;
das ist aber nicht das Gelbe vom Ei da die Position nicht stimmt bzw. sehr stark abweicht.
Wie kann ich eine 'elegantere' Methode benutzen falls es eine gibt :mrgreen:
Danke
Luki :)

Dalai 27. Mär 2014 15:09

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

Luki206 27. Mär 2014 15:13

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:
h := ...
aus oder verstehe ich gerade etwas falsch?

nuclearping 27. Mär 2014 15:35

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?

MSDN-Library durchsuchenLoadLibrary

Delphi-Quellcode:
if (h = 0) then ... Fehler

Luki206 27. Mär 2014 15:37

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?

stahli 27. Mär 2014 15:42

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.

Popov 27. Mär 2014 16:11

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: http://www.delphipraxis.net/1253570-post9.html macht zwar etwas anderes, es richtet aber auch ein Fenster an einem Objekt aus. Evtl. reicht das schon.

Dalai 27. Mär 2014 16:19

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:
Trb.Position * Form1.Width div 100;
40           * 1000          / 100    = 400
Oder überseh ich was?

MfG Dalai

himitsu 27. Mär 2014 16:53

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ß.

Luki206 28. Mär 2014 12:56

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:
pos := (Trb.Position * (Trb.Width div 100))+25; //pos ist die Position für das Image, Trb ist die Trackbar
Und wenn ich dann jetzt das Objekt erzeuge ist es ziemlich genau zur Trackbar Position ;)

stahli 28. Mär 2014 13:20

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.

lbccaleb 28. Mär 2014 15:36

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.


http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Luki206 28. Mär 2014 15:42

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?

lbccaleb 28. Mär 2014 15:44

AW: Objekt an Trackbar Position ausrichten
 
Ähh Google?

Gleich der erste Treffer:

http://www.delphigroups.info/2/bf/405793.html

Luki206 31. Mär 2014 20:15

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:
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)*)
Gibt es nicht noch eine elegantere Methode das zu lösen?
Danke
Luki :)

PS: Bei größeren Zahlen als 60 Sekunden bewegt sich der Schieber nicht mehr

lbccaleb 1. Apr 2014 05:56

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:

Luki206 1. Apr 2014 14:04

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.

lbccaleb 1. Apr 2014 19:04

AW: Objekt an Trackbar Position ausrichten
 
Schau mal hier hab ich mal vor langer Zeit dran rumprobiert, vllt. kann dir das ja helfen...
http://www.delphipraxis.net/130916-t...-erzeugen.html

Luki206 1. Apr 2014 19:58

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..

stahli 1. Apr 2014 20:43

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.

Luki206 2. Apr 2014 18:32

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 ;)

stahli 2. Apr 2014 19:02

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?

Luki206 2. Apr 2014 19:11

AW: Objekt an Trackbar Position ausrichten
 
Ich möchte das sie als Fortschrittsanzeige dient aber auch später verschoben werden kann

stahli 2. Apr 2014 19:44

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.

Luki206 2. Apr 2014 19:51

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 ;)

Sir Rufo 2. Apr 2014 19:56

AW: Objekt an Trackbar Position ausrichten
 
Zitat:

Zitat von Luki206 (Beitrag 1254462)
Irgendwie stehe ich gerade auf dem Schlauch... Ich werde einmal eine Nacht drüber schlafen, mal sehen ob ich's morgen hin bekomme ;)

Schlafen ist auch eine Alternative - besser ist aber allemal, wenn du das zunächst analog mit Papier und Bleistift durchspielst

stahli 2. Apr 2014 20:07

AW: Objekt an Trackbar Position ausrichten
 
... und dazu mal für alle Eigenschaften "Setter" vorsehen in folgender Form:

Delphi-Quellcode:
procedure Form1.SetMaxValue(aValue: Integer);
begin
  if MaxValue <> aValue then
  begin
    CalcXPosition;
    PaintTrackbar;
  end;
end;
Natürlich musst Du die beiden Methoden dann auch noch deklarieren.

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. ;-)

Sir Rufo 2. Apr 2014 20:25

AW: Objekt an Trackbar Position ausrichten
 
Hier mal eine Methode um ein Control an der Position der TrackBar auszurichten
Delphi-Quellcode:
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;
Du willst ein Image daran ausrichten, dann einfach
Delphi-Quellcode:
procedure TForm1.TrackBar1Change( Sender : TObject );
begin
  ControlOnTrackBarPosition( Image1, Sender as TTrackBar );
end;
und schon wandert das Image ganz brav an der TrackBar entlang, zentriert über dem Pinörpel ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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