Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: So 06.03.16 19:34 
Ein freundliches Hallo an alle,

ich habe mich an einer Komponente versucht, die zur Entwicklungszeit aus der Galerie in ein Formular eingetragen werden kann. Es tritt aber ein Zugriffsfehler (vcl40) auf und das Objekt im Formular sieht auch nicht wie erwartet aus.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
type
  T_LoadCont = class(TGraphicControl)                //(TPanel)   (TComponent) 
  private
    { Private-Deklarationen }
    oMnPnl   : TCustomPanel;   // HauptPanel auf dem alle Komponenten sitzen
    oPnl     : TPanel      ;   // Panel auf dem die Fortschrittsanzeige sitzt
    oProgBar : TProgressBar;   // Balkenanzeige
    oLbl     : TLabel      ;   // Beschreibung der Aktion
    oName    : String      ;
    oTag     : Integer     ;

    // Properties
    procedure WriteCap    ( C : String  );
    procedure WriteTop    ( M : Integer );
    procedure WriteLeft   ( M : Integer );
    procedure WriteHeight ( M : Integer );
    procedure WriteWidth  ( M : Integer );
    procedure WriteMin    ( M : Integer );
    procedure WriteMax    ( M : Integer );
    procedure WritePos    ( P : Integer );
    procedure WriteStep   ( S : Integer );
    procedure WriteVisible( B : Boolean );

  protected
    { Protected-Deklarationen }

  public
    { Public-Deklarationen}
    constructor Create( Owner: TComponent );                           override;
    destructor  Destroy;                                               override;

    // Methoden
    procedure SetLd  ( Min, Max : Integer; Capt : String; Vis : Boolean );
    procedure SetRang( Min, Max : Integer                               );
    procedure SetStep(                     Capt : String                );
    procedure StepIt;

    // Eigenschaften
    property Min      : Integer               Write WriteMin    ;
    property Max      : Integer               Write WriteMax    ;
    property Position : Integer               Write WritePos    ;
    property Step     : Integer               Write WriteStep   ;

  published
    { Published-Deklarationen }
    property Caption  : String                Write WriteCap    ;
    property Top      : Integer               Write WriteTop    ;
    property Left     : Integer               Write WriteLeft   ;
    property Height   : Integer               Write WriteHeight ;
    property Width    : Integer               Write WriteWidth  ;
    property Visible  : Boolean               Write WriteVisible;
    property Name     : String   Read oName   Write oName       ;
    property Tag      : Integer  Read oTag    Write oTag        ;
  end;

procedure Register;

implementation


Formular:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  object TCustomPanel
    Left = 5
    Top = 10
    Width = 640
    Height = 21
  end


Ich hatte "T_LoadCont" statt "TCustomPanel" erwartet!

Irgend was läuft da noch falsch. Hab ich da irgendetwas falsch verstanden??

Grüße von der Nordsee

Peter
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mo 07.03.16 20:00 
Werden die ganzen Unterkomponenten denn auch irgendwo erzeugt und ein Parent zugewiesen? Überhaupt stellt sich die Frage, wozu die ganzen Darstellungskomponenten, Du könntest doch gleich alles selbst zeichnen, wenn Du schon von TGraphicControl ableitest.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 07.03.16 22:57 
Wie wäre es mit einem Frame? Der macht genau was du da versuchst, nur dass du die Komponenten wie auf einem Formular visuell anordnen kannst...
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 10.03.16 18:38 
Hallo,

komme leider erst jetzt zum Antworten.

Hallo WasWeißDennIch, hallo Sebastian,

Dank Euch für die Antworten. Selbstschmunzelnd werden im Constructor die Objekte angelegt und Parent gesetzt. Ich sehe die Objekte auch, aber wie schon gesagt, im Formular taucht nicht mein Objekt auf, sondern "TCustomPanel". Es geht mir auch nicht nur darum, die Anzeige irgendwie zum Funktionieren zu bringen, sondern darum zu verstehen, was ich da mache. Selbst zeichnen? Vielleicht im nächsten Schritt, wenn ich weiß wie das geht. Wenn ich Dich richtig verstanden habe Sebastian, kann ich das doch auch mit dem Panel. Das neue Objekt soll aber noch weitere Eigenschaften erhalten.

Falls ein Fehler im Constructor steckt:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
constructor T_LoadCont.Create( Owner: TComponent );
begin
  inherited                            Create( Owner );
  oMnPnl               := TCustomPanel.Create( Self );
  oMnPnl.Top           := 10 ;
  oMnPnl.Left          := 5  ;
  oMnPnl.Width         := 640;
  oMnPnl.Height        := 21 ;
  oMnPnl.Parent        := TWinControl  ( Self   ) ;
  oPnl                 := TPanel.Create( oMnPnl );
  oLbl                 := TLabel.Create( oMnPnl );
  oPnl.Parent          := oMnPnl;
  oPnl.Top             := 0     ;
  oPnl.Left            := 0     ;
  oPnl.Width           := 196   ;
  oPnl.Height          := 21    ;
  oPnl.Color           := clRed                      ;
  oPnl.Caption         := ''                         ;
  oProgBar             := TProgressBar.Create( oPnl );
  oProgBar.Orientation := pbHorizontal               ;
  oProgBar.Parent      := oPnl                       ;
  oProgBar.Top         := 5     ;
  oProgBar.Left        := 5     ;
  oProgBar.Width       := 185   ;
  oProgBar.Height      := 11    ;
  oProgBar.Min         := 0     ;
  oProgBar.Max         := 100   ;
  oProgBar.Position    := 0     ;
  oProgBar.Step        := 1     ;
  oLbl.Parent          := oMnPnl;
  oLbl.Top             := 4     ;
  oLbl.Left            := 210   ;
  oLbl.Caption         := '';   //Copy( Name, 2, 250 )
  oPnl.Anchors         := [akTop]+[akLeft]+[akBottom];
  oProgBar.Anchors     := [akTop]+[akLeft]+[akBottom];
  oLbl.Anchors         := [akTop]+[akLeft]+[akBottom];
end;


Ich habe den Verdacht mit "Ownwer" und "Parent" stimmt irgend etwas noch nicht.
Beim Scheiben diese Antwort habe ich gesehen, dass ich "inherited Create( Owner );" nicht hingeschrieben hatte, aber es funktioniert noch immer nicht. Statt dessen kann ich es nicht mehr selektieren. Da fehlt anscheinend noch etwas.

Für alle Fälle auch noch den Destructor:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
destructor T_LoadCont.Destroy;
begin
  oProgBar.Free;
  oPnl.Free    ;
  oLbl.Free    ;
  oMnPnl.Free  ;
  inherited    ;
end;


Grüße von der bisher trüben und jetzt sonnigen Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.03.16 22:34 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
  oMnPnl.Parent        := TWinControl  ( Self   ) ;					
Ein TGraphicControl ist kein TWinControl. Du kannst auf ein TGraphicControl keine anderen Komponenten setzen, das geht einfach nicht.

Deshalb frage ich noch einmal: Warum kein Frame?
Der ist zur Kapselung anderer Komponenten gedacht und du musst die noch nicht einmal selber erstellen, sondern kannst die einfach wie auf einem Formular designen, Ereignisse zuweisen usw.
Den Frame kannst du dann wie eine Komponente auf das Formular legen.

Ansonsten kannst du von TWinControl ableiten oder wie user profile iconWasWeißDennIch schrieb alles selber zeichnen, wenn du ohnehin ein TGraphicControl benutzt. Dafür ist das nämlich gedacht.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 11.03.16 18:19 
Hallo Sebastian,

danke Dir für Deine Antwort. Ich hatte "TGraphicControl" gewählt, weil die Objekte keinen Focus benötigen. Wenn ich das Ganze richtig verstanden habe, muß ich dann meine Objekte selbst zeichnen.

Zitat:
Warum kein Frame?
Nun, weil ich bislang keinen "TFame" gefunden habe. "Bevel" wäre vielleicht eine Möglichkeit. Frames tauchen zusammen mit dem Mediaplayer auf (Delphi 4).

Vielleicht kannst Du mir eine Übersicht geben, was wovon sinnvoller Weise 'abgelitten' werden kann. Die Hilfe ist nicht grade ausführlich und das Buch beschreibt nur Beispiele.

Grüße von der sonnigen Nordsee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 21.03.16 17:33 
Ein freundliches Hallo an alle,

anscheinend hat mein Compiler irgendwelchen Datenmüll in binären Dateien oder der Registry zurückgelassen. Es wurden Propertys nicht angezeigt und beim Löschen der Komponente im Formular gab es eine Zugriffsverletzung.

Ich habe meine Komponente dann nochmals von "TCustomPanel" abgeleitet, in kleinsten Schritten aufgebaut und getestet. Nun sind alle Properties da und es treten keine Fehler mehr auf. Ich sehe keine wesentlichen Unterschiede im Quelltext bei den beiden Varianten. Es haben sich jedoch noch weitere Fragen ergeben, die ich aber unter einem neuen Titel stellen werde: Caption bei TCustomPanel. Diese Frage erkläre ich erst mal für beantwortet.

Grüße von der Nordsee

Peter
CCRDude
Hält's aus hier
Beiträge: 5
Erhaltene Danke: 2



BeitragVerfasst: Di 22.03.16 09:58 
Als Verfechter von barrierefreier Software möchte ich anmerken, dass es mMn so gut wie keine Komponenten gibt, die keinen Fokus benötigen, dafür aber viele Entwickler, die dies unnötigerweise übersehen.

Als Hintergrundinformation: sehbehinderte Menschen (egal ob Screen Reader, Braille, o.ä.) bewegen sich idR mit der Tastatur durch eine GUI und sind darauf angewiesen, dass Komponenten den Fokus bekommen können und auf GETTEXT-Messages aussagekräftig reagieren. Das ist, wenn man bei der Komponentenentwicklung daran denkt, kaum Mehraufwand, nachträglich aber immer Frust.

Darüber hinaus möchte ich darauf hinweisen, dass Owner und Parent nicht dasselbe sind. Ich empfehle, Komponenten anfangs immer erstmal dynamisch erzeugt zu entwickeln und testen, dabei tauchen etliche Stolperfallen viel früher auf. Am Quelltext der mitgelieferten Komponenten kann man ganz gut abschauen, was denn alles in den Konstruktor, und was besser in SetParent gehört.

Hier konkret: Was, wenn Owner=nil? Was, wenn Parent nachträglich geändert? Nur weil jetzt evtl. nicht vorstellbar heißt das nicht, dass nicht bei Weiterentwicklung eines Projektes neue Anforderungen dazukommen, und da ist es sinnvoll, wenn sich eine Komponente/ein Control auch so verhält, wie es andere tun.