Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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.
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) private oMnPnl : TCustomPanel; oPnl : TPanel ; oProgBar : TProgressBar; oLbl : TLabel ; oName : String ; oTag : Integer ;
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
public constructor Create( Owner: TComponent ); override; destructor Destroy; override;
procedure SetLd ( Min, Max : Integer; Capt : String; Vis : Boolean ); procedure SetRang( Min, Max : Integer ); procedure SetStep( Capt : String ); procedure StepIt;
property Min : Integer Write WriteMin ; property Max : Integer Write WriteMax ; property Position : Integer Write WritePos ; property Step : Integer Write WriteStep ;
published 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:
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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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:
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 := ''; 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:
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
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 10.03.16 22:34
Peter18 hat folgendes geschrieben : | 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 WasWeißDennIch schrieb alles selber zeichnen, wenn du ohnehin ein TGraphicControl benutzt. Dafür ist das nämlich gedacht.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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.
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
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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
|
Verfasst: 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.
|
|
|