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 in anderer Unit (https://www.delphipraxis.net/76385-findcomponent-anderer-unit.html)

Andreas L. 3. Sep 2006 14:19


FindComponent in anderer Unit
 
Hi,
ich habe mir eine Unit gebastelt mit einer procedure. Diese Procedure erstellt mehrere Komponenten auf den übergebenen parent. Damit ich auch die Eigenschaften dieser Komponenten verändern kann habe ich FindComponent verwendet. Leider meldet mir der Compiler das FindComponent ein undefinierter Bezeichner sei. Ich habe folgende Units eingebunden:

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, pngimage, JvGif, ExtCtrls;
Aufgerufen wird die Procedure von einer anderen Unit (mit Form) aus wie folgt.

Delphi-Quellcode:
procedure blubbCreate(form1, 'Titel', 5, 5, 5, 5);
Der erste Parameter ist das Parent (also die Form der aufrufenden Unit), 2 Titel und die anderen sind Integer für Width, Height, Left, Top);

Die procedure ruft folgenden Code auf:

Delphi-Quellcode:
 TPanel.Create(Parent).Name:=Name;
 with TPanel(FindComponent(Name)) do
  begin
   Parent:=Parent;
   Width:=Width;
   Height:=Height;
   Left:=Left;
   Top:=Top;
   Color:=clWhite;
   Caption:='';
  end;

  TScrollBox.Create(TPanel(FindComponent(Name))).Name:=Name+'page';
  with TScrollBox(FindComponent(Name+'page')) do
   begin
    Parent:=TPanel(FindComponent(Name)).parent;
    Align:=alClient;
    Color:=clWhite;
   end;
Wieso kann ich FindComponent nicht benutzen. Geht es überhaupt so wie ich es gemacht hab auf einer Form von einer anderen Unit aus die also nichts mit den Form zu tun hat Komponenten zu erstellen? (Mir ist klar das ich die 2te Unit bei der Form-Unit einbinden muss ;-))

Schonmal Danke

DGL-luke 3. Sep 2006 14:22

Re: FindComponent in anderer Unit
 
Wenn die komponente auf form1 liegt, musst du das findcomponent auch für form1 ausführen. dann müsste das auch hinhauen.

andere sache: warum findcomponent? Es gibt fast immer elegantere möglichkeiten, als da mindestens wären array und TObjectList...

3_of_8 3. Sep 2006 14:22

Re: FindComponent in anderer Unit
 
FindComponent ist eine Methode der Form. Du musst also nur das FindComponent deiner anderen Formularinstanz aufrufen.

Andreas L. 3. Sep 2006 14:31

Re: FindComponent in anderer Unit
 
Zitat:

Zitat von 3_of_8
FindComponent ist eine Methode der Form. Du musst also nur das FindComponent deiner anderen Formularinstanz aufrufen.

Es kompiliert ;-)

Aber jetzt bekomm eich eine Exception wenn ich der SCrollbox ein Parent zuweise. Woran könnte das liegen?

Delphi-Quellcode:
Parent:=TPanel(wParent.FindComponent(sName));
wParent ist bei meinen Beispiel aufruf Form1 und sName einfach nur ein String. Die SCrollbox soll quasi auf den vorhin erstellten Panel abgelegt werden.

3_of_8 3. Sep 2006 14:35

Re: FindComponent in anderer Unit
 
Delphi-Quellcode:
Parent:=TWinControl(wParent.FindComponent(sName));

DGL-luke 3. Sep 2006 14:37

Re: FindComponent in anderer Unit
 
ich würde dir dringendst empfehlen, FindComponent komplett aus deinem Code zu entfernen. das ist langsam und fehlerträchtig. Mach es, wie ich bereits vorgeschlagen habe, mit TObjectList oder einem array. Besonders wenn du eh alles selber erstellst, ist das viel sauberer.

zu deinem fehler: erstens ist das ein harte cast, und zweitens ist nicht gewährleistet, dass überhaupt was rauskommt. es könnte auch NIL rauskommen, das du dann auf TPanel castest und zuweist... das schreit ja förmlich nach AV.

mkinzler 3. Sep 2006 14:37

Re: FindComponent in anderer Unit
 
-Welche Exception?
-Ist die andere Form schon instantieert?
Das casten nach nach TPanel ist übrigens unnötigt, da der parent ja auch von Typ TComponent ist.

3_of_8 3. Sep 2006 14:38

Re: FindComponent in anderer Unit
 
Ich dachte Parent wäre eine TWinControl-Eigenschaft? :gruebel:

mkinzler 3. Sep 2006 14:41

Re: FindComponent in anderer Unit
 
Zitat:

Zitat von 3_of_8
Ich dachte Parent wäre eine TWinControl-Eigenschaft? :gruebel:

Stimmt ist vom Typ TWinControl

Andreas L. 3. Sep 2006 15:33

Re: FindComponent in anderer Unit
 
Oops, es ist keine Exception sondern eine AV (siehe Anhang). Der Code
Delphi-Quellcode:
Parent:=TWinControl(wParent.FindComponent(sName));
ruft die selbe AV auf.

Was ist casten? Wie verwenden ich TObjectList? Was heißt Form1 instantieert?

mkinzler 3. Sep 2006 15:40

Re: FindComponent in anderer Unit
 
Zitat:

Was ist casten?
TPanel(), TWinControl()
Zitat:

Was heißt Form1 instantieert?
Wurde schon einen Instanz der Klasse TForm1 erzeugt?

Warum brichst du den Cast und den Zugriff nicht auf:

Delphi-Quellcode:
if wParent.FindComponent(sName) <> nil then
    Parent:=TWinControl(wParent.FindComponent(sName));

Andreas L. 3. Sep 2006 15:47

Re: FindComponent in anderer Unit
 
Zitat:

Zitat von mkinzler
Zitat:

Was heißt Form1 instantieert?
Wurde schon einen Instanz der Klasse TForm1 erzeugt?

Warum brichst du den Cast und den Zugriff nicht auf:

Delphi-Quellcode:
if wParent.FindComponent(sName) <> nil then
    Parent:=TWinControl(wParent.FindComponent(sName));

Instanz wurde erzeugt. Ich habe deinen Code verwendet, die AV komt trotzdem. Warum?

Hawkeye219 3. Sep 2006 15:56

Re: FindComponent in anderer Unit
 
Hallo onlinehome,

Zitat:

Zitat von onlinehome
Delphi-Quellcode:
TPanel.Create(Parent).Name:=Name; // <-- Instanz erzeugen, aber Zeiger nicht speichern?
with TPanel(FindComponent(Name)) do
  begin
   Parent:=Parent; // <--- das kann nicht funktionieren
   Width:=Width;   //      woher soll der Compiler wissen,
   Height:=Height; //      ob du den Prozedurparameter
   Left:=Left;     //      oder die Eigenschaft meinst?
   Top:=Top;       //
   Color:=clWhite;
   Caption:='';
  end;

Ich vermute, du möchtest so etwas erreichen:

Delphi-Quellcode:
procedure CreatePanelWithScrollBox (aParent: TWinControl;
                                    aName: string;
                                    aLeft, aTop, aWidth, aHeight: Integer);
var
  lPanel    : TPanel;
  lScrollBox : TScrollBox;
begin
  // Panel erzeugen
  lPanel := TPanel.Create(aParent);
  with lPanel do
    begin
      Name := aName;
      Parent := aParent;
      SetBounds (aLeft, aTop, aWidth, aHeight);
      Color := clWhite;
      Caption := '';
    end;
  // ScrollBox erzeugen
  lScrollBox := TScrollBox.Create(lPanel);
  with lScrollBox do
    begin
      Name := aName + 'page';
      Parent := lPanel;
      Align := alClient;
      Color := clWhite;
    end;
end;
Ich habe den Code nicht getestet, Fehler sind möglich.

Gruß Hawkeye

3_of_8 3. Sep 2006 16:11

Re: FindComponent in anderer Unit
 
Eine AV IST eine Exception.

Andreas L. 3. Sep 2006 16:29

Re: FindComponent in anderer Unit
 
Zitat:

Zitat von Hawkeye219
Hallo onlinehome,

Zitat:

Zitat von onlinehome
Delphi-Quellcode:
TPanel.Create(Parent).Name:=Name; // <-- Instanz erzeugen, aber Zeiger nicht speichern?
with TPanel(FindComponent(Name)) do
  begin
   Parent:=Parent; // <--- das kann nicht funktionieren
   Width:=Width;   //      woher soll der Compiler wissen,
   Height:=Height; //      ob du den Prozedurparameter
   Left:=Left;     //      oder die Eigenschaft meinst?
   Top:=Top;       //
   Color:=clWhite;
   Caption:='';
  end;

Ich vermute, du möchtest so etwas erreichen:

Delphi-Quellcode:
procedure CreatePanelWithScrollBox (aParent: TWinControl;
                                    aName: string;
                                    aLeft, aTop, aWidth, aHeight: Integer);
var
  lPanel    : TPanel;
  lScrollBox : TScrollBox;
begin
  // Panel erzeugen
  lPanel := TPanel.Create(aParent);
  with lPanel do
    begin
      Name := aName;
      Parent := aParent;
      SetBounds (aLeft, aTop, aWidth, aHeight);
      Color := clWhite;
      Caption := '';
    end;
  // ScrollBox erzeugen
  lScrollBox := TScrollBox.Create(lPanel);
  with lScrollBox do
    begin
      Name := aName + 'page';
      Parent := lPanel;
      Align := alClient;
      Color := clWhite;
    end;
end;
Ich habe den Code nicht getestet, Fehler sind möglich.

Gruß Hawkeye

Ja, so hatte ich das auch schonmal. Keine Ahnung wieso ich diese Lösung damals nicht mehr verwendet habe. Mein Source ist shcon etwas älter :-) Danke an alle. Schönen Sonntag Abend noch.

MacGuyver 29. Mär 2011 08:39

AW: FindComponent in anderer Unit
 
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.


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