Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zugriffsverletzung bei zuweisung von Self (https://www.delphipraxis.net/102816-zugriffsverletzung-bei-zuweisung-von-self.html)

franktron 5. Nov 2007 13:44


Zugriffsverletzung bei zuweisung von Self
 
Delphi-Quellcode:
//Hier die Klasse
Tonl_kaltermin = class(TPanel)
   private
    Fuserid: Longint;
    Fvon: TDateTime;
    Fbis: TDateTime;
    Ftitle: String;
    procedure Setbis(const Value: TDateTime);
    procedure Setuserid(const Value: Longint);
    procedure Setvon(const Value: TDateTime);
    procedure Settitle(const Value: String);
   public
      { Public-Deklarationen }
      Constructor Create(AOwner: TComponent); override;
      Destructor Destroy; override;
   published
      property von      : TDateTime read Fvon write Setvon;
      property bis      : TDateTime read Fbis write Setbis;
      property userid : Longint read Fuserid write Setuserid;
      property title   : String read Ftitle write Settitle;

      property Width;
      property Height;
      property Top;
      property Left;
      property Visible;
      property Color;
   End;

//Hier der aufruf
FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self; <= Hier kommt immer ein Fehler (mit Nil gehts)
      FNewtermin.Color:=clBlack;
      FNewtermin.Left:=x;
      FNewtermin.Top:=y;
Also wenn ich den Code oben ausführe kommt immer eine Zugriffsverletzung 00000 x 00000 u.s.w.

was habe ich falsch gemacht (mit anderen Klassen gehts (z.b. TPainbox) nur mit der nicht mit TPanel gehts auch

Deep-Sea 5. Nov 2007 13:46

Re: Zugriffsverletzung bei zuweisung von Self
 
Ein Objekt kann nicht der Parent von sich selber sein ...
Oder wer ist in dem Fall Self? ^^

franktron 5. Nov 2007 13:48

Re: Zugriffsverletzung bei zuweisung von Self
 
Ist es ja auch nicht Self ist die Kombo in der ich das Panel erstellen will.
Habs schon mit Self.Name getestet

Deep-Sea 5. Nov 2007 13:51

Re: Zugriffsverletzung bei zuweisung von Self
 
Ja wo "drin" steht denn der betroffene Code? Zeig mal ein bisschen mehr ^^

franktron 5. Nov 2007 14:45

Re: Zugriffsverletzung bei zuweisung von Self
 
Delphi-Quellcode:
Tonl_kalender = class(TWinControl)
   private
    FHGColor: TColor;
      FDayColor: TColor;
    FNightColor: TColor;
    FFont: TFont;
    FOnChange: TOnChange;
      FDatum: TDate;
      FAnzTimes   : Integer;
    FHeaderHeigth : Longint;

      FPHeader   : TPanel;
      FTimeResult: TTimeResult;
      FTimeWidth    : Integer;
      FPaintda      : Boolean;
      FStartDay: TTime;
    FEndDay: TTime;
      FAktTime: TTime;
      FPaint   : TPaintBox;

      FS1,FS2   : TScrollBar;
    FHeaderColor: TColor;
    FJahr: Word;
    FUserWidth: Integer;
      FUsers: Tonl_kalusers;

      FZeitList   : TZeitList;

      FAnzTimeRec   : Longint;

      FDblBuffer   : graphics.TBitmap;
    FOnGetFeierTag: TOnGetFeierTag;
      FFeiertagFont: TFont;

      FXMark,FYMark   : Longint;
    FOnChangeTag: TOnChangeTag;
    FAktDayColor: TColor;
    FZK: TZk;
    FZKEffect: TzkEffekt;
      FTermine: Tonl_kaltermine;
      FCreateTermin: Boolean;
      FNewtermin: Tonl_kaltermin;

      procedure WMSize(var Message: TWMSize); message WM_SIZE;
      procedure WMPaint(var AMessage : TWMPaint); message wm_Paint;

    procedure SetDayColor(const Value: TColor);
    procedure SetFont(const Value: TFont);
    procedure SetHGColor(const Value: TColor);
    procedure SetNightColor(const Value: TColor);
    procedure SetOnChange(const Value: TOnChange);
      procedure SetDatum(const Value: TDate);

      Procedure SetAnzTimes;
    procedure SetTimeResult(const Value: TTimeResult);
    procedure SetEndDay(const Value: TTime);
    procedure SetStartDay(const Value: TTime);
      procedure SetAktTime(const Value: TTime);
      procedure SetOnGetFeierTag(const Value: TOnGetFeierTag);
      procedure SetFeiertagFont(const Value: TFont);

      Procedure CreateHeaders(C : TCanvas);
      Procedure CreateUsers(C : TCanvas);
      Procedure CreateView;

      procedure SetHeaderColor(const Value: TColor);
      function LinearBlendedColor(Color1, Color2: TColor; alpha: Integer): TColor;
    procedure SetUserWidth(const Value: Integer);
      procedure SetUsers(const Value: Tonl_kalusers);
      Procedure ZeichneKasten(x,y,w,h : Longint;C : TCanvas;Farbe : TColor;Style : TZk;effekt : TzkEffekt;Farbe1 : TColor=0);

      Procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;var ScrollPos: Integer);
      procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,   Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);

    procedure SetOnChangeTag(const Value: TOnChangeTag);
    procedure SetAktDayColor(const Value: TColor);
    procedure SetZK(const Value: TZk);
    procedure SetZKEffect(const Value: TzkEffekt);
    procedure SetTermine(const Value: Tonl_kaltermine);

      { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
   public
      { Public-Deklarationen }
      Constructor Create(AOwner: TComponent); override;
      Destructor Destroy; override;

   published
      { Published-Deklarationen }
      property Align;

      Property HGColor      : TColor read FHGColor write SetHGColor;
      Property DayColor      : TColor read FDayColor write SetDayColor;
      Property NightColor   : TColor read FNightColor write SetNightColor;
      Property HeaderColor: TColor read FHeaderColor write SetHeaderColor;
      Property AktDayColor: TColor read FAktDayColor write SetAktDayColor;
      Property Font            : TFont read FFont write SetFont;
      Property FeiertagFont   : TFont read FFeiertagFont write SetFeiertagFont;
      Property Datum         : TDate read FDatum write SetDatum;
      Property TimeResult   : TTimeResult read FTimeResult write SetTimeResult;
      Property StartDay      : TTime read FStartDay write SetStartDay;
      Property EndDay         : TTime read FEndDay write SetEndDay;
      Property AktTime      : TTime read FAktTime write SetAktTime;
      Property Jahr            : Word read FJahr;
      Property UserWidth   : Integer read FUserWidth write SetUserWidth;
      Property ZK               : TZk read FZK write SetZK;
      Property ZKEffect      : TzkEffekt read FZKEffect write SetZKEffect;

      Property Users         : Tonl_kalusers read FUsers write SetUsers;
      Property Termine      : Tonl_kaltermine read FTermine write SetTermine;

      Property OnChange          : TOnChange read FOnChange write SetOnChange;
      Property OnGetFeierTag   : TOnGetFeierTag read FOnGetFeierTag write SetOnGetFeierTag;
      Property OnChangeTag      : TOnChangeTag read FOnChangeTag write SetOnChangeTag;

   end;


procedure Tonl_kalender.FormMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
   xp,yp      : Longint;
begin
   xp:=(x-FUserWidth) DIV TimeWidth;
   yp:=(y-FHeaderHeigth) DIV TimeHeight;
   If (xp>=0) and (yp>=0) then
   Begin
      FCreateTermin:=True;
      FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self;
      FNewtermin.Color:=clBlack;
      FNewtermin.Left:=x;
      FNewtermin.Top:=y;
   End;
end;

constructor Tonl_kalender.Create(AOwner: TComponent);
begin
   inherited;
   FCreateTermin:=False;
   FZeitList:=TZeitList.Create;
   FPaintda:=False;
   FHGColor:=clBtnFace;
   FDayColor:=clCream;
   FNightColor:=clSkyBlue;
   FHeaderColor:=clBlue;
   FFont:=TFont.Create;
   FFont.Name:='Arial';
   FFont.Size:=10;
   FFont.Color:=clBlack;
   FFeiertagFont:=TFont.Create;
   FFeiertagFont.Name:='Arial';
   FFeiertagFont.Size:=10;
   FFeiertagFont.Color:=clRed;
  FAktDayColor:=clLime;
   FPHeader:=TPanel.Create(Self);
   FStartDay:=StrToTime('08:00');
   FEndDay:=StrToTime('18:00');
   FUserWidth:=60;
   FDatum:=Date;
   FAktTime:=Now;
   FJahr:=StrToInt(FormatDateTime('yyyy',FDatum));

   FAnzTimes:=0;
   FTimeWidth:=0;
   FTimeResult:=onltk_15min;

   With FPHeader do
   Begin
      Name:='p_header';
    Caption:='';
      Parent:=Self;<= Warum geht das hier
      Left:=0;
      Top:=0;
      Height:=20;
      Width:=Self.Width;
      Align:=alTop;
    Visible:=False;
   End;

   FS1:=TScrollBar.Create(Self);
   With FS1 do
   Begin
      Parent:=Self;
      Align:=alBottom;
      Visible:=False;
      Kind:=sbHorizontal;
    OnScroll:=ScrollBar1Scroll;
   End;

   FS2:=TScrollBar.Create(Self);
   With FS2 do
   Begin
      Parent:=Self;
      Align:=alRight;
      Visible:=False;
    Kind:=sbVertical;
   End;

   FPaint:=TPaintBox.Create(Self);
   With FPaint do
   Begin
    Parent:=Self;
      Align:=alClient;
      OnMouseMove:=FormMouseMove;
      OnMouseDown:=FormMouseDown;
    OnMouseUp:=FormMouseUp;
   End;

   FDblBuffer:=graphics.TBitmap.Create;

   FUsers:=Tonl_kalusers.Create;

    SetAnzTimes;
end;
Hier ist mehr :)

mkinzler 5. Nov 2007 14:51

Re: Zugriffsverletzung bei zuweisung von Self
 
Wie gesagt eine Komponente kann nicht ihr eigener Parent sein!
Genauso wenig wie du dein eigener Vater sein kannst.

OldGrumpy 5. Nov 2007 15:06

Re: Zugriffsverletzung bei zuweisung von Self
 
IMHO ein schönes Beispiel dafür wie man mit WITH..DO sehr ordentliches Chaos verursachen kann.

Zitat:

Zitat von franktron
Delphi-Quellcode:
With FPHeader do
Begin
  Name:='p_header';
  Caption:='';
  Parent:=Self;<= Warum geht das hier
  Left:=0;
  Top:=0;
  Height:=20;
  Width:=Self.Width;
  Align:=alTop;
  Visible:=False;
End;

Ohne das WITH..DO sähen die ersten paar Zeilen so aus:

Delphi-Quellcode:
FPHeader.Name:='p_header';
FPHeader.Caption:='';
FPHeader.Parent:=FPHeader.Self; //KABOOM durch PICNIC ;)
[...]

franktron 5. Nov 2007 15:09

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von mkinzler
Wie gesagt eine Komponente kann nicht ihr eigener Parent sein!
Genauso wenig wie du dein eigener Vater sein kannst.

Komm ich nun ducheinander ??

Also mein denken.

Ich habe ein Kombo z.b. TMutter in der Erstelle ich TKind dann muss der Parent von TKind doch TMutter sein und nicht TGrossmutter oder ??

Deep-Sea 5. Nov 2007 15:10

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von OldGrumpy
IMHO ein schönes Beispiel dafür wie man mit WITH..DO sehr ordentliches Chaos verursachen kann.

Zitat:

Zitat von franktron
Delphi-Quellcode:
With FPHeader do
Begin
  Name:='p_header';
  Caption:='';
  Parent:=Self;<= Warum geht das hier
  Left:=0;
  Top:=0;
  Height:=20;
  Width:=Self.Width;
  Align:=alTop;
  Visible:=False;
End;

Ohne das WITH..DO sähen die ersten paar Zeilen so aus:

Delphi-Quellcode:
FPHeader.Name:='p_header';
FPHeader.Caption:='';
FPHeader.Parent:=FPHeader.Self; //KABOOM durch PICNIC ;)
[...]

An der Stelle geht es ja. FPHeader.Self gibt es nicht. Und Self ist auch nicht FPHeader ...

franktron 5. Nov 2007 15:14

Re: Zugriffsverletzung bei zuweisung von Self
 
Die stelle geht doch das ist ja gerade das lustige.

Aber wenn ich

Delphi-Quellcode:
FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self;
Mach dann knalltes


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.
Seite 1 von 2  1 2      

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