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/)
-   -   Delphi FindComponent findet Label nicht (https://www.delphipraxis.net/76118-findcomponent-findet-label-nicht.html)

day 30. Aug 2006 09:30


FindComponent findet Label nicht
 
Hallo,
Ich habe ein panel auf dem sich Labels befinden. ich erzeuge dynamisch noch zusätzlich labels. Jetzt möchte aber vorher überprüfen ob das label das ich erzeuge nicht bereits mit dem gleichen namen existiert. dazu verwende ich die funktion
Delphi-Quellcode:
     lExistendLabel := Component.FindComponent(LabelName);
Component ist vom Type TComponent. Leider findet diese funktionein bereits existierendes label nicht.
Diese Funktion findet nur labels die ich dynamisch (create) angelegt habe. Labels die ich während der Entwicklung auf dem Panel platziert habe findet es nicht! Woran liegt das?????

Muetze1 30. Aug 2006 09:33

Re: FindComponent findet Label nicht
 
FindComponent() findet nur Elemente die der Komponente untergeordnet sind. Wenn du also als Parent Component angibst, dann werden die Komponenten beim Aufruf von FindComponent() bei Component gefunden. Die zur Designzeit platzierten Labels liegen aber anscheinend in einem anderen Container. Die Frage ist hier: wo sind die Labels zur Designzeit abgelegt worden und was ist Component für eine Komponente?

mkinzler 30. Aug 2006 09:34

Re: FindComponent findet Label nicht
 
Wende das .FindComponent mal auf die Form an. Möglicherweise ist das ja der Owner des Labels.

Schaedel 30. Aug 2006 09:35

Re: FindComponent findet Label nicht
 
Hallo,
Delphi-Quellcode:
var
c : TLabel;
begin
c := (FindComponent('A' + IntToStr(i)) as Tlabel
   if C <> NIL then
....
Also bei mir funktioniert das so ...

Muetze1 30. Aug 2006 09:40

Re: FindComponent findet Label nicht
 
Jo, du schreibst dein Code in der Methode der Form und somit rufst du auch FindComponent() der Form auf. Und die Form ist Owner der Elemente...

naja, wurde alles schon gesagt...

day 30. Aug 2006 09:43

Re: FindComponent findet Label nicht
 
hallo,
Also Component ist ein Panel auf welchem sich einpaar labels befinden. Das Panel liegt auf einer Form. Wie finde ich den heraus was der Parent ist bei den Platzierten labels. Habe bei den eingenschaften nichts gefunden und kann man den Parent ändern? Den so wie es ausschaut ist ja der Parent des Labels nicht das Panel.

Schaedel 30. Aug 2006 09:45

Re: FindComponent findet Label nicht
 
Also du Createst ja so ...
Delphi-Quellcode:
 Mylabel.Create(Panel);
In der Klammer steht der Parent... da kannst du den setzen ...

Muetze1 30. Aug 2006 09:47

Re: FindComponent findet Label nicht
 
Die Frage ist: sind die Labels ordentlich auf dem Panel platziert? D.h. wenn du das Panel verschiebst, werden alle Label mit verschoben (zur Designzeit)? Wenn nein, dann stimmt dies nicht.

Den Parent änderst du, in dem du die Elemente woanders zur Designzeit einfügst. Es ist wichtig wo sie eingefügt werden, weil bestimmte Container Elemente (z.B. TPanel), welche weitere Elemente aufnehmen können, eine Gruppe für sich sind. Dadurch würde ein FindComponent() von dem TPanel nur die Elemente finden, welche auch wirklich in dem TPanel liegen oder in einem Element auf dem TPanel.

day 30. Aug 2006 09:48

Re: FindComponent findet Label nicht
 
hallo,
Bei den Labels die ich zur laufzeit erzeuge funktioniert es ja auch. Ich habe aber noch labels die ich bereits vorher platziert habe. Jetzt möchte ich eben herausfinden ob das label welches ich zur laufzeit erzeuge bereits auf dem Panel existiert.

day 30. Aug 2006 09:50

Re: FindComponent findet Label nicht
 
wenn ich das Panel zur designzeit verschiebe dan verschieben sich alle labels auch.

day 30. Aug 2006 10:01

Re: FindComponent findet Label nicht
 
Ich habe folgenden Test gemacht. Habe zwei Panels welche übereinander liegen. Label1 liegt auf dem Obersten Panel (Panel2). Jetzt erzeuge ich auf Panel2 nochmals ein label mit dem selben namen. Die Funktion FindComponent findet Label1 nicht.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
lLabel : TLabel;
lComponent : TComponent;
begin
  lComponent := Panel2.FindComponent('Label1');
  if(lComponent = nil) then
  Begin
    lLabel := TLabel.Create(Panel2);
    lLabel.Parent := Panel2;
    lLabel.Visible := True;
    lLabel.Name := 'Label1';

  End;
end;

end.

mkinzler 30. Aug 2006 10:06

Re: FindComponent findet Label nicht
 
Schau mal, wer der Owner des Label1 ist. Ich vermute die Form.

day 30. Aug 2006 10:09

Re: FindComponent findet Label nicht
 
Hallo,
Wenn man der create funktion die Form übergibt und den parent auf Panel2 setzt scheint es zu funktionieren! Ich finde es aber nicht so schön, dass der Ower bei der Create funktion nicht auch das parentPanel sein kann.

lLabel := TLabel.Create(Form1);
lLabel.Parent := Panel2;

mkinzler 30. Aug 2006 10:24

Re: FindComponent findet Label nicht
 
Du mußt also alle Labels dynamisch erzeugen oder .FindComponent auf die Form anwenden.

Sourcemaker 30. Aug 2006 11:42

Re: FindComponent findet Label nicht
 
Hi,

alternativ könntest Du mit
Delphi-Quellcode:
for i := 0 to Panel.ControlCount-1 do
   if TContol(Panel.Controls[i]).Name = xName then
   begin
      lFound := true;
      break;
   end;
über die Controls des Panels oder Groupbox etc. laufen und
Deine Componente bzw. Control finden.
(Das könnte man natürlich auch in eine Funktion FindControl kapseln)

Grüße

Frank

MacGuyver 29. Mär 2011 09:37

AW: FindComponent findet Label nicht
 
Moin Leute, :hi:

ich musste mich gerade mit dem Thema auseinandersetzen.

Also:
Der Owner ist die Form. Ganz wichtig. Jedes Control muss beim Create die Form übergeben bekommen. Die Form "besitzt" alle Controls, ist halt wie der König und sein Folk.

Bei dem neu erzeugten Control muss Parent auf seinen Vorfahr gesetzt werden, damit da die Verbindung für die Gui da ist.

FindComponent: NUR in der Form aufrufen. Die Funktion durchläuft die Components, die nur in der Form gesetzt sind.

FindControl: Die Funktion läuft über die Contols, die Nachfahren.
Will man über FindControls eine Komponente finden, muss man von der Form aus rekursiv alle Controls durchlaufen. Das kann man sich sparen, indem man gleich von der Form aus FindComponent aufruft.

Man kann Controls umhängen und verschieben, wie man will. In Components bleiben sie erhalten. Wird ein Control freigegeben, verschwindet der Eintrag auch aus dem Components.

DeddyH 29. Mär 2011 09:50

AW: FindComponent findet Label nicht
 
Einmal genügt doch, dafür muss man doch keine Thread-Leichen aus dem Keller zerren.

MacGuyver 29. Mär 2011 09:58

AW: FindComponent findet Label nicht
 
Die Seelen der Leichen irrten noch umher weil das Thema noch nicht beendet war. :angel:
Spaß beiseite. Wenn jemand auf der Suche ist, ärgert er sich wieder weil es heißt, jetzt funktioniert es, ich weiß aber nicht warum.
Sind wir hier nicht auf der Suche einer Lösung und nicht einer Halben?

DeddyH 29. Mär 2011 10:02

AW: FindComponent findet Label nicht
 
Trotzdem muss man doch nicht uralte Threads raussuchen, bei denen die Lösung passt, sonst würde das Forum ganz schnell aus allen Nähten platzen. Da sucht man sich exemplarisch einen raus (z.B. den aktuellsten) und postet dort.

Sir Rufo 29. Mär 2011 10:13

AW: FindComponent findet Label nicht
 
Noch besser wäre es einen neuen Thread zu eröffnen und die alten Threads darin zu verlinken.

Und dann auch noch irreführende Aussagen:
Zitat:

Zitat von MacGuyver (Beitrag 1091682)
Der Owner ist die Form. Ganz wichtig. Jedes Control muss beim Create die Form übergeben bekommen. Die Form "besitzt" alle Controls, ist halt wie der König und sein Folk.
[...]
Wird ein Control freigegeben, verschwindet der Eintrag auch aus dem Components.

wenn ein Owner angegeben wird, dann ist dieser Owner für die Freigabe der Instanz zuständig.
(Darum ja auch der Unterschied Owner und Parent)
Dann ist es auch ganz doof so eine Instanz einfach so wieder freizugeben.

Faustregel:
Also wenn ein Owner mit angegeben wird, dann soll sich der auch um die Freigabe kümmern.
Will ich mich selber darum kümmern, dann keinen Owner mitgeben!

Ansonsten wird es kompliziert oder es knallt halt.

himitsu 29. Mär 2011 16:39

AW: FindComponent findet Label nicht
 
Zitat:

FindComponent: NUR in der Form aufrufen. Die Funktion durchläuft die Components, die nur in der Form gesetzt sind.
Wieso nur da?

Man muß FindControl nur innerhalb des Namesspaces aufrufen, welcher als Owner für die gesuchten Componenten verwendet wurde.

Es ist also vollkommen egal wo die erstellten Komponenten verwaltet werden (also was der Owner ist) und von wo aus FindControl aufgerufen wird.

Die VCL nutzt, für alle über die DFM geladenen Componenten, die zugehörige Form als Owner, weswegen man innerhalb einer Methode der Form FindControl direkt aufrufen kann und da dann alles findet, wovon die Form als Owner fungiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf