Autor Beitrag
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 14:00 
Ich hab ne Eigenschaft vom Typ TPersistent (siehe hier) und möchte, dass wenn der TPen, der ja eine Eigentschaft von TZeiger ist, geändert wird, repaintet wird, was ich so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TZeiger.SetLength(newValue: Real);
begin FLength := newValue; FOwner.Invalidate end;

procedure TZeiger.Setpen(newValue: TPen);
begin FPen := newValue; FOwner.Invalidate end;


normalerweise ja machen könnte

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
constructor TZeiger.Create;
begin
  inherited Create;

  if AOwner is TCustomControl then
    FOwner := TCustomControl(AOwner)
  else
    FOwner:=nil;

  Pen :=TPen.Create;
end;
aber irgendwas stimmt hier nicht :(

Ich bekomme eine Zugriffsverletzung direkt beim Start (wo ja die Funktionen zum erstenmal aufgerufen werden) :(

Ohne das FOwner.Invalidate gehts, wird jedoch nicht aktualisiert

Für alle hilfe dankbar: Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mo 02.06.03 14:12 
Hi,

hast du es schon mit

ausblenden Delphi-Quelltext
1:
FOwner.RePaint;					


probiert, wie ich es Dir im anderen Thread gepostet hatte?

MFG

- Ernesto -
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 14:13 
Ja, aber das gibt beides Fehler.

Ich glaube FOwner ist irgendwie leer oder fehlerhaft belegt.

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 14:16 
Wenn ich

ausblenden Delphi-Quelltext
1:
2:
3:
4:
//  if AOwner is TCustomControl then
    FOwner := TCustomControl(AOwner);
//  else
//    FOwner:=nil;


Also das immer mit dem Beleg dann geht's, jedoch weiß ich nicht was das für folgen hat.

soll ich vielleicht FOwner := AOwner?

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mo 02.06.03 14:20 
Hi,

ich weiss es jetzt. Du hattest ja deine Komponente von TGraphicControl abgeleitet. Und das wusste ich am Anfang nicht. Deswegen hatte ich dir ein Beispiel mit TCustomControl gepostet. Ersetze einfach TCustomControl mit TGraphicControl und schau mal was passiert.

MFG

- Ernesto -
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 14:23 
Es Geht :D thx,thx.
Trotzdem habe ich 2 Fragen:

1. Wozu brauche ich diesen if else block?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if AOwner is TGraphicControl then
    FOwner := TGraphicControl(AOwner)
  else
    FOwner:=nil;


Was passiert wenn ich ihn weglasse, d.h. nur FOwner = AOwner bzw FOwner = TGraphicControl(AOwner)?

2. Was soll ich benutzen, repaint oder invalidate, bzw. was ist der unterschied?

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mo 02.06.03 14:41 
Hallo,

1. also, hier wird geprüft ob der Parameter AOwner Instanz der Klasse TGraphicControl oder einer dessen Nachkommen ist. Wenn ja erfolgt die Zuweisung an FOwner, anderfalls wird FOwner nil zugewiesen.

2.
Delphi-Hilfe hat folgendes geschrieben:
Die Methode Invalidate aktualisiert das Steuerelement auf dem Bildschirm.

procedure Invalidate; virtual;

Beschreibung

Verwenden Sie Invalidate, wenn das gesamte Steuerelement neu gezeichnet werden muß. Wenn mehrere Bereiche innerhalb des Steuerelements neu aufgebaut werden müssen, zeichnet Invalidate das gesamte Fenster ohne Bildschirmflackern neu. Es wirkt sich auch nicht negativ auf die Ausführungsgeschwindigkeit aus, wenn Invalidate vor dem Neuzeichnen des Steuerelements mehrere Male aufgerufen wird.




Die Methode Repaint veranlaßt das Steuerelement, sich selbst erneut zu zeichnen.

procedure Repaint;

Beschreibung

Durch einen Aufruf von Repaint wird das Steuerelement veranlaßt, sich sofort erneut zu zeichnen. Wenn die Eigenschaft ControlStyle den Wert csOpaque enthält, zeichnet sich das Steuerelement direkt selbst. Andernfalls ruft Repaint zunächst Invalidate und danach Update auf, damit auch alle sichtbaren Bereiche der Komponenten unter dem Steuerelement erneut gezeichnet werden.


MFG

- Ernesto -
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 14:48 
2. Also Repaint, da es Invalidate sowieso internaufruft?

Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
Tweafis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 15:28 
Da Sind noch 2 Fehler Drin...

1. Wenn ich jetzt auf dem Form was an den eigenschaften von z.B. StdZeiger.Pen ändere tut sich nix

2. Ich kann von wUhr.Paint aus bei StdZeiger FOwner, FPen und FLength bearbeiten obwohl die F... in private deklariert sind.


P.S. Das mit dem {$I} funzt super.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses
  Windows, ...;

{$I TZeiger.definition.inc}

type
  TwUhr = class(TGraphicControl)
...

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.