![]() |
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:
Das kann so ja eigentlich nicht die richtige Lösung sein.
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; 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:
... Hoffentlich ist der Text oben auch verständlich.
MyButton.Parent := MyPaintbox;
Bin für jeden hilfreichen Beitrag dankbar. |
AW: Button auf verschobener Paintbox erstellen
Du brauchst den Parent doch nicht abzusuchen, Du kennst doch Dein Top und Left
|
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.
|
AW: Button auf verschobener Paintbox erstellen
Zitat:
Aber trotzdem bleibt noch die Frage: Muss ich den Abstand immer zu der Buttonposition manuell addieren, oder kann ich das irgendwie umgehen? ----------------------------------------------------------------- Zitat:
|
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; |
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:
es sei denn Du benötigst Transparenzen, dann wie gehabt
TMyPaintControl=Class(Controls.TCustomControl)
public Property Canvas; Procedure Paint;override; End; |
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. |
AW: Button auf verschobener Paintbox erstellen
Delphi-Quellcode:
Ich hoffe du hattest tmpZeichenflaeche auch ordentlich initialisiert?
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 ... 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 |
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 09:13 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