![]() |
FindComponent in einem Frame
Hallo Zusammen,
ich habe in einem Frame ein StringGrid und ein PageControl. Ich möchte gerne, dass wenn ich ich auf einen Eintrag in dem StringGrid klicke, dass er dann die richtige Seite auf dem PageControl wählt. Der Name des TabSheets auf dem PageControl lautet 'TabSheet_'+den ausgewählten Zelleninhalt. Leider bekomme ich das nicht ans laufen. Das fängt schon damit an, dass ich dem FindComponent nicht das Frame als Ausgangsobjekt geben kann. Ich hatte dann Folgendes (vergeblich) versucht:
Delphi-Quellcode:
Page_HelpList.ActivePage:=Page_HelpList.FindComponent(('TabeSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet);
Aber das kann ich nicht compilieren, denn ich bekomme den Fehler ausgewiesen:
Delphi-Quellcode:
[DCC Fehler] FrameHelpTablesUnit.pas(53): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
Ich bin mir auch nicht sicher, ob das TabSheet unter dem Objekt PageControl gefunden wird. Kann mir jemand einen Tip geben? Vielen Dank Patrick |
AW: FindComponent in einem Frame
Hi,
kann es sein dass du falsch geklammert hast? Wenn du das so in deinem Code hast versucht du aus einem String ein TAdvTabSheet zu machen.
Delphi-Quellcode:
Zudem musst du auch an der richtigen Stelle suchen, d.h. im Frame.
Page_HelpList.ActivePage:=Page_HelpList.FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
Das Ganze müsste dann also komplett so lauten:
Delphi-Quellcode:
Page_HelpList.ActivePage:=Frame.FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
|
AW: FindComponent in einem Frame
Hallo,
Das ist der Aufbau meines Frames:
Delphi-Quellcode:
unit FrameHelpTablesUnit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, AdvPageControl, ComCtrls, Grids, AdvObj, BaseGrid, AdvGrid, ExtCtrls, TGridDesignUnit, StdCtrls, AdvEdit; type TFrame_HilfsTabellen = class(TFrame) Panel_Left: TPanel; Grid_HelpList: TAdvStringGrid; Page_HelpList: TAdvPageControl; TabSheet_Abteilungen: TAdvTabSheet; TabSheet_Adresse: TAdvTabSheet; TabSheet_Branche: TAdvTabSheet; TabSheet_Gruppe: TAdvTabSheet; TabSheet_Sprache: TAdvTabSheet; TabSheet_Status: TAdvTabSheet; TabSheet_Unternehmen: TAdvTabSheet; Panel_Abteilungen_Titel: TPanel; Panel_Adresse_Titel: TPanel; Panel_Branche_Titel: TPanel; Panel_Gruppe_Titel: TPanel; Panel_Sprache_Titel: TPanel; Panel_Status_Titel: TPanel; Panel_Unternehmen_Titel: TPanel; Panel_Abteilung_GridTitel: TPanel; AdvStringGrid1: TAdvStringGrid; Panel1: TPanel; AdvEdit1: TAdvEdit; procedure FrameResize(Sender: TObject); procedure Grid_HelpListClickCell(Sender: TObject; ARow, ACol: Integer); procedure Grid_HelpListSelectionChanged(Sender: TObject; ALeft, ATop, ARight, ABottom: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; implementation Das ist der Procedureaufruf
Delphi-Quellcode:
Aber er erkennt Frame_Hilfstabellen nicht. Ich bekomme die Fehlermeldung:"Formular "Frame_Hilfstabellen" referenziert Formular Frame_Hilfstabellen das in der Unit FrameHelpTablesUnit deklariert ist, aber nicht in Ihrer Uses-List steht. Möchten Sie es hinzufügen?"
procedure TFrame_HilfsTabellen.Grid_HelpListSelectionChanged(Sender: TObject;
ALeft, ATop, ARight, ABottom: Integer); begin Page_HelpList.ActivePage:=Frame_Hilfstabellen.FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet; end; Wenn ich dann ja sage, fügt er es in der Uses-Liste hinzu und gibt mir dann den Fehler:
Delphi-Quellcode:
Was ja auch logisch ist.
[DCC Fataler Fehler] FrameHelpTablesUnit.pas(47): F2092 Das Programm oder die Unit 'FrameHelpTablesUnit' ruft sich selbst wieder auf
Kann mir jemand sagen, warum das bei einem Frame so schwierig ist? Vielen Dank Patrick |
AW: FindComponent in einem Frame
Du bist doch in einer Methode des Frames. Müsste daher
Delphi-Quellcode:
nicht genügen?
Page_HelpList.ActivePage := FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
|
AW: FindComponent in einem Frame
Ja, reicht...:wall::bounce2:
Vielen Dank |
AW: FindComponent in einem Frame
Zitat:
Delphi-Quellcode:
deklariert?
Frame_Hilfstabellen
Wer die findet kriegt ein Bier :cheers: Hoffentlich hilft das dabei in der Zukunft eben nicht mehr diese globalen Form-/DataModule-Variablen zu benutzen. Diese innerhalb der gleichen Klasse zu benutzen ist mMn grob fahrlässig! |
AW: FindComponent in einem Frame
Ähm, das verstehe ich nicht. Ich habe ein Frame mit dem Name Frame_HilfsTabellen angelegt und die Unit dieses Frames unter FrameHelpTablesUnit.pas abgespeichert. Warum ist das fahrlassig?
Gruß Patrick |
AW: FindComponent in einem Frame
Verwende jetzt mal diesen Frame mehrmals und überleg, was dann passiert?
In der Variable steht dann vermutlich immer nur die letzte Instanz und Frame1 würde dann auf Frame2 zugreifen, anstatt auf sich selber. Also innerhalb einer Klasseninstanz niemals über eine externe Variable gehen. Es ist schon vorgekommen, daß jemand "ausversehn" die MainForm vom Delphi hatte doppelt erstellen lassen und wunderte sich dann, daß über Form1.Edit1.Text irgendwie nicht das ausgelesen werden konnte, was man in das Edit reinschrieb. |
AW: FindComponent in einem Frame
Ok, dieses Thema würde ich gerne in einem anderen Thread vertiefen. Mich interessiert nämlich brennend, wie ich Daten von Unit zu Unit übergebe, ohne sie untereinander einzubinden.
In diesem Falle habe ich mir (nach meinem Verständnis) nix zu Schulden kommen lassen. Die Variable Frame_Hilfstabellen gibt es nämlich garnicht - es haette TFrame_Hilfstabellen heißen müssen, was er aber nicht gefunden hatte. Und weil ich dem Frame den Name Frame_Hilfstabelle gegeb hatte, habe ich es damit versucht, was er aber auch nicht gefunden hat. Sorry Gruß und vielen Dank an alle! Patrick |
AW: FindComponent in einem Frame
Zitat:
Wenn du auf etwas einer anderen Unit zugreifen willst, dann mußt du zwangsweise die andere Unit einbinden. Oder eine weitere Unit, wo die gewünschte Funktion durchgeschleift wurde. Wobei die andere Unit in der Weiteren eingebunden ist usw., also es bleibt bei der Abhängigkeit. Sollen beide Units keine direkte Abhängigkeit besitzen, dann muß das gemeinsame in eine weitere gemeinsam genutzte Unit rein, welche in Beiden units eingebunden wird. Alternativ kann man maximal noch Methoden der IPC prozessintern nutzen. > Ports, Named-Pipes, Named-MMFs, Register-Messages an "definierte" Fenster usw. FastMM macht das im Shared-Mode z.B. so, wo sich die erste Instantz im Prozess namentlich erkenntlich macht und die nächsten Instanzen, leiten dann auf Diese um. Und die VCL nutzt ein ATOM an den Fenstern, für seine Verlinkung zwischen TWinControl und HWND. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz