Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi klassen prozedur (https://www.delphipraxis.net/9206-klassen-prozedur.html)

LoL 20. Sep 2003 14:23


klassen prozedur
 
hi

ich hatte vor 2 tagen schon mal über dieses thema gpostet aber nun habe ich ein neues problem. da ich es schlecht erklären kann poste ich mal den quelltext:

Delphi-Quellcode:
unit test
...
type Work_Panel = Class ( TPanel )
  class procedure panel_creation;
end;
...
var pnl_3d : Tpanel;
    pnl : TPanel;
...

class procedure Work_panel.panel_creation;
begin
  pnl       := TPanel.create(pnl_3d);
  pnl.Align := alclient;
  pnl.name  := 'p_eingabe';
  pnl.Parent := pnl_3d;

  pnl        := TPanel.create(FindComponent('p_eingabe')); <---------
  pnl.Name   := 'p_daten';
  pnl.Caption := '';
  pnl.Parent := FindComponent('p_eingabe');
end;
die klassen prozedur Work_panel.panel_creation wird bei form OnCreate in einer anderen unit names main aufgerufen.
nun bekomme ich folgende fehlermeldung an der gekennzeichneten stelle:
Zitat:

This form of method call only allowed for class methods

neolithos 22. Sep 2003 07:02

Re: klassen prozedur
 
FindComponent kann nur über eine Instanze gerufen werden.

Robert Marquardt 22. Sep 2003 07:40

Re: klassen prozedur
 
Eine class procedure wird nicht mit der Instanz eines Objektes aufgerufen, sondern seiner Klasse. Es muss also keine Instanz des Objektes vorhanden sein. FindComponent aber will die Instanz des Objektes nach untergeordneten Komponenten absuchen.

Motzi 22. Sep 2003 08:08

Re: klassen prozedur
 
Du brauchst aber in deinem Fall gar kein FindComponent:
Delphi-Quellcode:
class procedure Work_panel.panel_creation;
begin
  pnl       := TPanel.create(pnl_3d);
  pnl.Align := alclient;
  pnl.name  := 'p_eingabe';
  pnl.Parent := pnl_3d;

  pnl        := TPanel.create(pnl);
  pnl.Name   := 'p_daten';
  pnl.Caption := '';
  pnl.Parent := TWinControl(pnl.Owner);
end;

Robert Marquardt 22. Sep 2003 08:34

Re: klassen prozedur
 
Letztlich ist class procedure hier ein Holzweg.

LoL 22. Sep 2003 08:36

Re: klassen prozedur
 
??? :gruebel: :gruebel: :gruebel:

neolithos 22. Sep 2003 08:38

Re: klassen prozedur
 
Vielleich bin ich blöd!

:gruebel:

Aber was soll das ganze mal werden!

:gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel:

LoL 22. Sep 2003 08:46

Re: klassen prozedur
 
Zitat:

Zitat von neolithos
Vielleich bin ich blöd!

:gruebel:

kanst du ja nicht wissen, habs schon oft erklärt aber für dich auch nochmal:
ich habe einen auftrag bekommen ein programm zu entwickeln. da der auftraggeber mein programm in seines implementieren will und er ja ein formular schon hat und er quasi von mir nur ein panel braucht wo meine programmoberfläche drauf ist, will ich mein panel von meinem formular "abkoppeln", d.h. unhabhängig machen. man hat dann praktisch so wie in office ein leiste wo man die ganzen programmteile ausführen kann. er bledet dann prktisch immer blos mein panel ein und aus

Robert Marquardt 22. Sep 2003 08:46

Re: klassen prozedur
 
Du leitest ein TPanel ab um auf dem frisch kreierten Panel weitere Komponenten unterzubringen. Dazu ist aber eine class procedure der falsche Weg. Eine class procedure ist dazu da ohne die Instanz eines Objektes zu funktionieren. Du hast also moeglicherweise kein TPanel-Objekt um darauf Komponenten zu erzeugen.

Der richtige Weg ist es die Methode Loaded von TPanel zu ueberschreiben. Loaded wird aufgerufen wenn Delphi das .dfm file zur Erzeugung einer Form abgearbeitet hat und damit alle Komponenten auf der Form vollstaendig initialisiert sind
Code:
TWorkPanel = class(TPanel) // IMMER T-PREFIX AN TYPNAMEN!!!!!
protected
   procedure Loaded; override;
end;

TWorkPanel.Loaded;
begin
  inherited Loaded;
  // hier die Komponentne erzeugen
end;

LoL 22. Sep 2003 08:50

Re: klassen prozedur
 
ich mach mal ein bild um das zu erklären

LoL 22. Sep 2003 08:57

Re: klassen prozedur
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier mal der aufbau

auf dem panel eingabe kann sowohl die eingabemaske erscheinenn als auch die anpassung für den teechart, und noch andere sachen. dazu lösche ich immer die komponenten auf dem panel eingabe und erzeuge die komponenten die ich brauche

neolithos 22. Sep 2003 09:16

Re: klassen prozedur
 
Mein Vorschlag:

Delphi-Quellcode:
class
  TMyPanel = class(TPanel) // bzw. TWinControl
  private
    panTee,
    panInput : TPanel; // warum überhaupt zwei zusätzliche Panel's ????
  public
    constructor Create(afOwner : TComponent); override;
  end;


constructor Create(afOwner : TComponent); override;
begin
  inherited Create(afOwner);

  panTee := TPanel.Create(Self);
  panTee.Parent := Self;
  ....
end;

LoL 22. Sep 2003 09:18

Re: klassen prozedur
 
1.der chart selbst liegt auf keinem panel
2. die zweite variable deshalb da ich dann schneller zugreifen kann

negaH 22. Sep 2003 09:27

Re: klassen prozedur
 
Du baust mit ganz normalen TForm. D.h. statt mit einem Panel zu arbeiten das als Kontainer dient, ersetzt du dieses durch ein TForm. Dieses TForm dann .BorderSytle := bsNone; .Align := alClient; und mit .CreateParented() erzeugt.

Gruß Hagen


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