AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Button auf verschobener Paintbox erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Button auf verschobener Paintbox erstellen

Ein Thema von Root2k · begonnen am 15. Mär 2012 · letzter Beitrag vom 18. Mär 2012
Antwort Antwort
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#1

Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 12:15
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.
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.
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 = 'TPaintBoxthen
    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
MyButton.Parent := MyPaintbox; ... Hoffentlich ist der Text oben auch verständlich.

Bin für jeden hilfreichen Beitrag dankbar.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 12:45
Du brauchst den Parent doch nicht abzusuchen, Du kennst doch Dein Top und Left
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 13:14
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.
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 14:32
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.

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

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

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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 14:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Button auf verschobener Paintbox erstellen

  Alt 15. Mär 2012, 15:01
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#7

AW: Button auf verschobener Paintbox erstellen

  Alt 16. Mär 2012, 07:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#8

AW: Button auf verschobener Paintbox erstellen

  Alt 16. Mär 2012, 11:46
Delphi-Quellcode:
for i := 0 to MyPaintbox.Parent.ComponentCount-1 do
begin
  if MyPaintbox.Parent.Components[i].ToString = 'TPaintBoxthen
    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 = 'TPaintBoxthen

// 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Mär 2012 um 11:53 Uhr)
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#9

AW: Button auf verschobener Paintbox erstellen

  Alt 18. Mär 2012, 11:32
Danke, aber von dem Code habe ich mich schon gelöst.

*closed*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 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