Vielleicht sehe ich vor lauter Bäumen mal wieder den Wald nicht mehr.
Wo liegen die Fehler der untenstehenden Unit ?
Erste Fehlermeldung ist Runtime Error 210 (Weitere durch den Programmabbruch (noch) nicht vorhanden).
unit unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
{ TB }
TB=class(TGraphicControl)
private
countpaint:Integer;
procedure procedure1;
protected
public
constructor create(Aowner:TComponent);
procedure Paint; override;
end;
{ TA }
TA=class(TComponent)
private
Fvisible: boolean;
FParent:TWinControl;
Fvisual: TB;
procedure Setparent(AValue: TWinControl);
procedure Setvisible(AValue: boolean);
protected
public
property visible:boolean read Fvisible write Setvisible;
property parent:TWinControl read FParent write Setparent;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
end;
var
Form1: TForm1;
var testTA:TA;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('?');
testTA:=TA.Create(self);
testTA.parent:=Form1;
TestTA.visible:=true;
end;
{ TB }
procedure TB.procedure1;
begin
if owner is TA then writeln('hurra') else writeln('doch nicht');
end;
constructor TB.create(Aowner: TComponent);
begin
left:=18;
top:=11;
width:=20;
height:=11;
countpaint:=0;
end;
procedure TB.Paint;
begin
inc(countpaint);
if (countpaint mod 2 = 0) then begin
inherited Paint;
Canvas.Brush.Color:=$550077;
Canvas.FillRect(1,1, width-1,height-1);
end else begin
procedure1;
end;
end;
{$R *.lfm}
{ TA }
procedure TA.Setvisible(AValue: boolean);
begin
if AValue then begin
if not Assigned(Fvisual) then begin
Fvisual:=TB.create(self);
if assigned(FParent) then Fvisual.Parent:=FParent;
end;
end else begin
if Assigned(Fvisual) then FreeAndNil(Fvisual);
end;
end;
constructor TA.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TA.Destroy;
begin
if Assigned(Fvisual) then FreeAndNil(Fvisual);
inherited Destroy;
end;
procedure TA.Setparent(AValue: TWinControl);
begin
Fvisual.Parent:=AValue;
FParent:=AValue;
end;
end.
Designfrage: Warum kapselst du ein Steuerelement in einer nicht-visuellen Komponente, anstatt direkt auf das Steuerelement zuzugreifen?
u-boot hat geschrieben:Bei Einzelschritten tritt der Fehler direkt nach ShowMessage('?'); auf.
Die Zeile testTA.parent:=Form1; würde mir besser passen; Aber es ist schon eine sehr seltsame Stelle, an der du dein TB erstellst…
Bei Einzelschritten reden wir auch alle von "Einen Schritt hinein" (F7) und nicht "Einen Schritt weiter"?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ah jetz hab ich das ... na muss man auch erst mal drauf kommen, dass der Debugger nicht funktioniert hat und ich die ganze Zeit an der falschen Stelle suche.
Parent einer Komponente zuweisen die es nicht gibt ist natürlich schlechte Idee.....
Socke hat geschrieben:Designfrage: Warum kapselst du ein Steuerelement in einer nicht-visuellen Komponente, anstatt direkt auf das Steuerelement zuzugreifen?
Hmm ich sehe es nicht als "Steuerelement" sondern als "gesteuertes Element".
Somit wollte ich einfach die visuelle Ausgabe auslagern und mich in der nicht-visuellen Komponente auf das wesentliche konzentrieren. Sollte mein Vorhaben irgendwann wirklich mal realität werden und alles klappen erhoffe ich mir in der nonvisuellen Rechenart Ressourcenvorteile. Wobei es durchaus sein kann, dass gegenüber einer visuellen Komponente mit visible:=false kaum Vorteile entstehen werden.
Es ist natürlich auch gut möglich, dass es letztenendes nur ein "gewurschtel" gibt und nix schön getrenntes ...
Erfolgsgarantie gibts also natürlich nicht... aber ich dachte Versuch wärs Wert....