Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Button auf verschobener Paintbox erstellen (https://www.delphipraxis.net/167145-button-auf-verschobener-paintbox-erstellen.html)

Root2k 15. Mär 2012 12:15


Button auf verschobener Paintbox erstellen
 
Hallo,

ich hoffe, dass ich den richtigen Bereich für mein Problem gewählt habe.

Das Problem:
Ich will zur Laufzeit einen Button auf einer Paintbox erstellen - z.B. an Position (0,0). Leider weiß ich aber nicht, was ich als Parent für den Button angeben kann/muss. Die Paintbox kann ich dafür nicht verwenden, da ich ansonsten die Fehlermeldung "Inkompatible Typen: TWinControl und TPaintBox" bekomme.
Delphi-Quellcode:
MyButton.Parent := MyPaintbox;


Wenn ich den Parent der Paintbox nehme (also die Hauptform), dann wird der Button natürlich nur solange an der richtigen Position angezeigt, solange sich die Paintbox an Position (0,0) der Hauptform befindet.
Delphi-Quellcode:
MyButton.Parent := MyPaintbox.Parent;

Sobald dem nicht mehr so ist, stimmt die Position des Buttons nicht mehr. Beginnt die Paintbox beispielsweise bei Position (100,100) dann liegt der Button außerhalb der Zeichenfläche. Eben an Position (0,0) der Form.

Kann ich dieses Problem irgendwie anders umgehen als auf den Parent der Paintbox zuzugreifen, die Komponente Paintbox zu suchen und dann den Abstand auf die Position der Buttons zu addieren?
Delphi-Quellcode:
for i := 0 to MyPaintbox.Parent.ComponentCount-1 do
begin
  if MyPaintbox.Parent.Components[i].ToString = 'TPaintBox' then
    tmpZeichenflaeche := (MyPaintbox.Parent.Components[i] as TPaintBox);
end;

if Assigned(tmpZeichenflaeche) then
begin
  AbstandTop := tmpZeichenflaeche.Top;
  AbstandLeft := tmpZeichenflaeche.Left;
end;

MyButton.Left := 0 + AbstandLeft;
MyButton.Top := 0 + AbstandTop;
Das kann so ja eigentlich nicht die richtige Lösung sein.
Kann mir da vielleicht jemand eine bessere Variante vorschlagen?

Wenn das hier funktionieren würde wäre es mir eigentlich am liebsten :wink:
Delphi-Quellcode:
MyButton.Parent := MyPaintbox;
... Hoffentlich ist der Text oben auch verständlich.

Bin für jeden hilfreichen Beitrag dankbar.

Bummi 15. Mär 2012 12:45

AW: Button auf verschobener Paintbox erstellen
 
Du brauchst den Parent doch nicht abzusuchen, Du kennst doch Dein Top und Left

Popov 15. Mär 2012 13:14

AW: Button auf verschobener Paintbox erstellen
 
Nur mal eine Idee, vielleicht reicht es schon. Wie wäre es die PaintBox in ein Panel einfügen. Der Button wäre dann auch im Panel. Du würdest dann nicht die PaintBox verschieben, sondern das Panel.

Root2k 15. Mär 2012 14:32

AW: Button auf verschobener Paintbox erstellen
 
Zitat:

Zitat von Bummi (Beitrag 1156684)
Du brauchst den Parent doch nicht abzusuchen, Du kennst doch Dein Top und Left

Oh man. Das ist natürlich echt sinnlos. Warum ich da so umständlich gedacht habe weiß ich selber nicht. :? :roll:

Aber trotzdem bleibt noch die Frage:
Muss ich den Abstand immer zu der Buttonposition manuell addieren, oder kann ich das irgendwie umgehen?

-----------------------------------------------------------------

Zitat:

Zitat von Popov (Beitrag 1156694)
Nur mal eine Idee, vielleicht reicht es schon. Wie wäre es die PaintBox in ein Panel einfügen. Der Button wäre dann auch im Panel. Du würdest dann nicht die PaintBox verschieben, sondern das Panel.

Ein Panel hat ebenfalls kein TWinControl.

Popov 15. Mär 2012 14:49

AW: Button auf verschobener Paintbox erstellen
 
Also ich weiß nicht ob ich dich richtig verstehe. Erstens hat Panel TWinControl und zweitens, hier dieses Beispiel funktioniert wunderbar. Ich erzeuge ein Button auf dem Panel und verschiebe das Panel mit gedrückter Maus:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton;
begin
  Button := TButton.Create(Panel1);
  Button.Left := 10;
  Button.Top := 10;
  Button.Width := 44;
  Button.Height := 22;
  Button.Parent := Panel1;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then
  begin
    ReleaseCapture;
    Panel1.Perform(WM_NCLBUTTONDOWN, HTCAPTION, varEmpty);
  end;
end;

Bummi 15. Mär 2012 15:01

AW: Button auf verschobener Paintbox erstellen
 
Du musst schieben

Aber Popov hat für Deinen Anwendungsfall recht, Du solltest gegf. statt von TGraphicControl/TpaintBox so ableiten ....

Delphi-Quellcode:
  TMyPaintControl=Class(Controls.TCustomControl)
    public
     Property Canvas;
     Procedure Paint;override;
  End;
es sei denn Du benötigst Transparenzen, dann wie gehabt

Root2k 16. Mär 2012 07:42

AW: Button auf verschobener Paintbox erstellen
 
Danke euch.
Ich habe keine Ahnung was Gestern los war. So viele Denkfehler hatte ich schon lange nicht mehr. :(
Ich war mir auch sicher, dass das mit dem Panel so nicht funktioniert hat. :?:

Naja... jetzt funktiontiert alles so wie ich will.

Danke nochmal.

himitsu 16. Mär 2012 11:46

AW: Button auf verschobener Paintbox erstellen
 
Delphi-Quellcode:
for i := 0 to MyPaintbox.Parent.ComponentCount-1 do
begin
  if MyPaintbox.Parent.Components[i].ToString = 'TPaintBox' then
    tmpZeichenflaeche := (MyPaintbox.Parent.Components[i] as TPaintBox);
end;

if Assigned(tmpZeichenflaeche) then
begin
  ...
Ich hoffe du hattest tmpZeichenflaeche auch ordentlich initialisiert?
Und was wäre, wenn es mehrere TPaintBoxen gäbe?

Ich würde dir auch davon abraten ToString für die Typenprüfung zu verwenden.
Um an den Namen der Klasse zu kommen, verwendet man natürlich ClassName, denn in ToString würde z.B. eine "ordentliche" Zahlen- oder Text-Klasse natürlich ihren Wert zurückgeben.

Delphi-Quellcode:
// also so
if MyPaintbox.Parent.Components[i].ClassName = 'TPaintBox' then

// in Wirklichkeit wolltest du allerdings den Typ prüfen (nur genau TPaintBox)
if MyPaintbox.Parent.Components[i].ClassType = TPaintBox then

// aber eigentlich machen es alle so (TPaintBox und Nachfahren)
if MyPaintbox.Parent.Components[i] is TPaintBox then



// Und wenn jetzt noch jemand auf folgende Idee kommt, dann ist demjenigen eigentlich eh nicht mehr zu helfen :stupid:
// PS: Genau das hast du aber, im Prinzip gemacht, (wie schon erwähnt wurde)
// allerdings mit dem Problem, daß bei mehrereren PaintBox ausversehn die Falsche genommen werden könnte.
if MyPaintbox.Parent.Components[i] = MyPaintbox then

Root2k 18. Mär 2012 11:32

AW: Button auf verschobener Paintbox erstellen
 
Danke, aber von dem Code habe ich mich schon gelöst.

*closed*


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