AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Komponenten ansteuern

Ein Thema von Plastewolf · begonnen am 25. Apr 2014 · letzter Beitrag vom 26. Apr 2014
Antwort Antwort
Plastewolf
(Gast)

n/a Beiträge
 
#1

Dynamische Komponenten ansteuern

  Alt 25. Apr 2014, 20:33
Hallo miteinander,

Ich stehe gerade vor einem kleinen Problem bei dem ich nicht so recht weiter weiß. Ich erstelle über eine Function einige kleine Shapes auf meinem Form. Diese Shapes möchste ich jedoch zur Laufzeit gerne verschieben. Hier ist auch schon das Problem: Dadurch das der Name variabel vergeben wird kann ich diese nicht direkt ansteuern.

Gibt es eine Methode um diese dennoch zu verwalten?

Hier die Function:

Delphi-Quellcode:
function Shape_gen(Name: String):String;
var
  Shape : TShape;
begin
 Shape := TShape.Create(Form1);

 With Shape do
  begin
   Parent := Form1;
   Left := Round(Form1.Width/2);
   Top := Round(Form1.Height/2);
   Width := 30;
   Height := 30;
   Shape := stCircle;
   Name := Name;
  end;
end;
Der Name des Shapes wird als Parameter übergeben und derzeit von einem entferntem TCP Server vergeben. Der Name ist jedoch innerhalb der Applikation bekannt.
Vielen Dank im voraus.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dynamische Komponenten ansteuern

  Alt 25. Apr 2014, 20:39
Dann bennen den Parameter nicht Name oder verwende das böse WITH nicht.

Und warum ist Shape_gen keine Methode von TForm1?
Und wieso heißt das immernoch Form1?
$2B or not $2B
  Mit Zitat antworten Zitat
Plastewolf
(Gast)

n/a Beiträge
 
#3

AW: Dynamische Komponenten ansteuern

  Alt 25. Apr 2014, 20:41
Warum sollte es denn nicht Form1 heißen?

Wie würdest du es denn realisieren?
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#4

AW: Dynamische Komponenten ansteuern

  Alt 26. Apr 2014, 00:09
Hallo,

Zitat:
[...] Hier ist auch schon das Problem: Dadurch das der Name variabel vergeben wird kann ich diese nicht direkt ansteuern. [...] Der Name ist jedoch innerhalb der Applikation bekannt
Dann kannst Du über die Methode FindComponent die entsprechende TShape-Instanz über deren Namen suchen.

Zitat:
Warum sollte es denn nicht Form1 heißen?
Naja, Du gehst davon aus, dass Form1 auch wirklich instanziiert ist - ist dem nicht so, dann geht das böse in die Hose. Besser: Du packst die Funktion als Methode in Dein Form ein und beziehst Dich dann auf Self , dann stellt sich dieses Problem nicht.

Zitat:
Wie würdest du es denn realisieren?
Keine Ahnung wie himitsu das angehen würde, als Ansatz mal:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FSelectedShape : TShape;
    function CreateShape (const ShapeName : string) : TShape;
    function GetShapeByName (const ShapeName : string) : TShape;
    procedure SetSelectedShape (const Shape : TShape);
    procedure ShapeMouseDown (Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
  public
    { Public-Deklarationen }
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned (GetShapeByNAme ('Shape1')) then
    CreateShape ('Shape1')
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if not Assigned (GetShapeByNAme ('Shape2')) then
    CreateShape ('Shape2')
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s : TShape;
begin
  s := GetShapeByName ('Shape2');
  if Assigned (s) then
    begin
      SetSelectedShape (s);
      s.Left := s.Left + 10
    end
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if Assigned (FSelectedShape) then
    FSelectedShape.Top := FSelectedShape.Top - 10
end;

function TForm1.CreateShape (const ShapeName : string) : TShape; // Jetzt als Methode der Form
begin
  Result := TShape.Create (Self);

  Result.Parent := Self;
  Result.Left := Width div 2;
  Result.Top := Height div 2;
  Result.Width := 30;
  Result.Height := 30;
  Result.Shape := stCircle;
  Result.Name := ShapeName;
  Result.OnMouseDown := ShapeMouseDown
end;

function TForm1.GetShapeByName (const ShapeName : string) : TShape;
begin
  Result := TShape (FindComponent (ShapeName))
end;

procedure TForm1.SetSelectedShape (const Shape : TShape);
begin
  if Assigned (FSelectedShape) then
    FSelectedShape.Brush.Color := clWhite;

  FSelectedShape := Shape;
  FSelectedShape.Brush.Color := clRed
end;

procedure TForm1.ShapeMouseDown (Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
begin
  if Sender is TShape then
    SetSelectedShape (TShape (Sender))
end;
Gruß
Volker Zeller

Geändert von Volker Z. (26. Apr 2014 um 00:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dynamische Komponenten ansteuern

  Alt 26. Apr 2014, 07:43
Warum sollte es denn nicht Form1 heißen?
Weil der Name nichts darüber sagt was das für ein Formular ist. Ein Beispiel wäre frmShapeDisplay, wenn das Formular z.B. zur Anzeige von Shapes dient.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Plastewolf
(Gast)

n/a Beiträge
 
#6

AW: Dynamische Komponenten ansteuern

  Alt 26. Apr 2014, 16:10
Vielen Dank für deine Hilfe. Das hat mir wirklich sehr geholfen
  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 02:45 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