Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Komponenten verschieben (https://www.delphipraxis.net/153439-komponenten-verschieben.html)

Shark99 2. Aug 2010 22:41

Komponenten verschieben
 
Ich habe eine Allgemeine Frage zu Komponenten.

Wenn ich Beispielweise 5 Checkboxes und 5 Buttons habe, kann ich diese irgendwie Gruppieren und zur Runtime mit einer einzigen Zeile Code verschieben (also z.B. um 10 Pixel nach oben)?

mkinzler 2. Aug 2010 22:44

AW: Komponenten verschieben
 
Packe sie auf eine Containet-Komponente ( z.B. einen Panel)

Shark99 2. Aug 2010 23:02

AW: Komponenten verschieben
 
Dass es mit einem Panel geht ist mir klar, ich wollte aber eine allgemeingültige Lösung. Ein Panel ist nicht durchsichtig und deshalb muss man fummeln wenn die Form z.B. eine Grafik als Hintergrund hat (wie in meinem aktuellen Projekt).

Teekeks 2. Aug 2010 23:09

AW: Komponenten verschieben
 
Ich habe eine Idee, Warum schreibst du dir nich selbst eine solche Komponente? Ich kenne auch noch keine die eine solch einfache funktion beherrscht (einfach nur Container sein).

sx2008 3. Aug 2010 00:13

AW: Komponenten verschieben
 
Seltsam, dass es in der VCL keine unsichtbaren Panels gibt.
Man bräuchte diese auch schon allein deswegen um die sichtbaren Controls
gezielt zu gruppieren.
Hier wäre so ein Transparent Panel (Freeware mit Source)

MarcoWarm 3. Aug 2010 07:44

AW: Komponenten verschieben
 
Falls du bereits Jedi nutzt, kannst du das TJvPanel nehmen und auf Transparent:=True setzen

LoCrux 3. Aug 2010 09:05

AW: Komponenten verschieben
 
Ganz schnell und billig... Nutze z.B. die Tag-Eigenschaft (ist für sowas vorgesehen)...

Delphi-Quellcode:
function MovedTaggedComponents(ParentComponent:TComponent;TagID:Integer;dx,dy:Integer):Integer;
var
  i    : Integer;
  Comp : TComponent;
  moved : Integer;
begin
  moved := 0;
  if assigned(ParentComponent)
  then begin

    for i := 0 to ParentComponent.ComponentCount-1
    do begin
      Comp := ParentComponent.Components[i];
      if (Comp is TButton) or (Comp is TCheckbox)
      then begin
        if (Comp.Tag = TagID)
        then with (Comp as TWinControl)
        do begin
          Left := Left+dx;
          Top := Top+dy;
          Update;
          inc(moved);
        end;
      end;
    end;

  end;
  result := moved;
end;
Dann hast du nur noch eien Zeile

Delphi-Quellcode:
  .
  MovedTaggedComponents(Form1,1,-10,50);
  .

Bernhard Geyer 3. Aug 2010 09:11

AW: Komponenten verschieben
 
Zitat:

Zitat von sx2008 (Beitrag 1039148)
Seltsam, dass es in der VCL keine unsichtbaren Panels gibt.

Wieso sollte man Panels nicht "Unsichtbar" machen können? Einfach die Borders deaktivieren und schon gehts. Haben wir hier "ein paar mal" im Einsatz.

mkinzler 3. Aug 2010 09:14

AW: Komponenten verschieben
 
Mit unsichtbar hat er wohl transparent gemeint. das geht aber, wie schon geschrieben mit JVPanel oder anderen Lösungen.

Das mit dem Panel war zudem nur ein Beispiel für eine Container-Komponente

blackfin 3. Aug 2010 09:19

AW: Komponenten verschieben
 
Ich würde das entweder, wie schon gesagt wurde, mit dem Tag-Wert machen, oder, wenns eleganter werden soll, über eine selbsterstellte Containter-Klasse, ähnlich einer Liste, der du zur Laufzeit Objekte hinzufügen und entfernen kannst. (z.B. realisiert über eine TObjectList innerhalb der Klasse)
Diese Klasse ist selbst nicht sichtbar, also keine visuelle Komponente, sondern nur eine Klasse.
Dieser Klasse gibst du dann z.B. eine Funktion Move(x,y), die alle der Klasse hinzugefügten Objekte (alle Objekte in der internen TObjectList) um x/y verschiebt.
Damit bist du dann insgesamt flexibler, da du Objekte entfernen kannst und welche hinzufügen, ohne dass du mit dem unübersichtlichen Tag-Wert rumfummeln müsstest.

Bernhard Geyer 3. Aug 2010 09:21

AW: Komponenten verschieben
 
Zitat:

Zitat von mkinzler (Beitrag 1039185)
Mit unsichtbar hat er wohl transparent gemeint. das geht aber, wie schon geschrieben mit JVPanel oder anderen Lösungen.

Kann doch auch das Panel (jedenfalls in neueren Delphi-Versionen wenn Theming aktiv ist)

Sherlock 3. Aug 2010 11:15

AW: Komponenten verschieben
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1039188)
Zitat:

Zitat von mkinzler (Beitrag 1039185)
Mit unsichtbar hat er wohl transparent gemeint. das geht aber, wie schon geschrieben mit JVPanel oder anderen Lösungen.

Kann doch auch das Panel (jedenfalls in neueren Delphi-Versionen wenn Theming aktiv ist)

Das wäre dann die Property ParentBackground, wenn ich mich nicht irre.

Sherlock

Shark99 3. Aug 2010 12:33

AW: Komponenten verschieben
 
Das mit den Tags ist eine nette Idee, leider nutze ich die schon für etwas anderes. Ich versuche es mal mit einem transparenten Panel.

Shark99 4. Aug 2010 12:57

AW: Komponenten verschieben
 
Klappte mit dem Jedi Panel, jedoch nicht mit dem normalen + Parentbackground.

Es gibt eine Einschränkung. Komponenten die transparent sich und auf einem transparenten Panel sitzen, können sich manchmal merkwürdig (Repaint-Probleme) verhalten.

xZise 12. Aug 2010 06:00

AW: Komponenten verschieben
 
Zitat:

Zitat von Shark99 (Beitrag 1039496)
Klappte mit dem Jedi Panel, jedoch nicht mit dem normalen + Parentbackground.

Es gibt eine Einschränkung. Komponenten die transparent sich und auf einem transparenten Panel sitzen, können sich manchmal merkwürdig (Repaint-Probleme) verhalten.

Dann empfehle ich dir du schreibst diese Komponenten in eine Liste und sagst dann der Liste was alle Elemente die es enthält machen soll.
Delphi-Quellcode:
type
  TComponentList = class(TObject)
  private
    FList : TObjectList;
  public
    // Im Konstruktor die liste erzeugen (ownobjects auf false!)
    // Im Destructor die Liste wieder freigeben

    procedure Add(Component : TComponent);
    procedure MoveAll(DeltaX, DeltaY : Integer);
  end;

procedure TComponentList.Add(Component : TComponent);
begin
  FList.Add(Component);
end;

procedure TComponentList.MoveAll(DeltaX, DeltaY : Integer);
var
  i : Integer;
  Element : TComponent;
begin
  for i := 0 to FList.Count - 1 do
  begin
    Element := FList[i] as TComponent;
    Element.Left := Element.Left + DeltaX;
    Element.Top := Element.Top + DeltaY;
  end;
end;
Das kannst du dann selber um eigene Sachen erweitern. Die Liste muss du dann Anfangs einmal erstellen, und mit allen Elementen füllen, die da rein sollen.

MfG
Fabian


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