Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FindComponent in einem Frame (https://www.delphipraxis.net/178793-findcomponent-einem-frame.html)

Ykcim 28. Jan 2014 10:14

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

ManBu 28. Jan 2014 10:24

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:
Page_HelpList.ActivePage:=Page_HelpList.FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
Zudem musst du auch an der richtigen Stelle suchen, d.h. im Frame.

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;

Ykcim 28. Jan 2014 10:57

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:
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;
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?"

Wenn ich dann ja sage, fügt er es in der Uses-Liste hinzu und gibt mir dann den Fehler:
Delphi-Quellcode:
[DCC Fataler Fehler] FrameHelpTablesUnit.pas(47): F2092 Das Programm oder die Unit 'FrameHelpTablesUnit' ruft sich selbst wieder auf
Was ja auch logisch ist.

Kann mir jemand sagen, warum das bei einem Frame so schwierig ist?

Vielen Dank
Patrick

DeddyH 28. Jan 2014 11:00

AW: FindComponent in einem Frame
 
Du bist doch in einer Methode des Frames. Müsste daher
Delphi-Quellcode:
Page_HelpList.ActivePage := FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
nicht genügen?

Ykcim 28. Jan 2014 11:11

AW: FindComponent in einem Frame
 
Ja, reicht...:wall::bounce2:

Vielen Dank

Sir Rufo 28. Jan 2014 11:22

AW: FindComponent in einem Frame
 
Zitat:

Zitat von DeddyH (Beitrag 1245639)
Du bist doch in einer Methode des Frames. Müsste daher
Delphi-Quellcode:
Page_HelpList.ActivePage := FindComponent('TabSheet_'+Grid_HelpList.Cells[1,Grid_HelpList.Row]) as TAdvTabSheet;
nicht genügen?

Nicht nur nicht genügen, sondern wo ist denn diese ominöse Variable
Delphi-Quellcode:
Frame_Hilfstabellen
deklariert?
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!

Ykcim 28. Jan 2014 11:30

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

himitsu 28. Jan 2014 12:00

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.

Ykcim 28. Jan 2014 17:15

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

himitsu 28. Jan 2014 17:34

AW: FindComponent in einem Frame
 
Zitat:

Zitat von Ykcim (Beitrag 1245725)
Mich interessiert nämlich brennend, wie ich Daten von Unit zu Unit übergebe, ohne sie untereinander einzubinden.

Ohne geht einfach nicht.

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 07:10 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