Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi unbegründete AccessViolation? (https://www.delphipraxis.net/67010-unbegruendete-accessviolation.html)

Nicodius 7. Apr 2006 21:32


unbegründete AccessViolation?
 
Delphi-Quellcode:
procedure TMyArtz.NeuClick(Sender: TObject);
var newsheet:ttabsheet;
begin
  newsheet := ttabsheet.Create(tabs);
  newsheet.Name := 'ts_' + IntToStr(nr);
  newsheet.PageControl := tabs;
  newsheet.Caption := 'Unbekannt_' + IntToStr(nr);
  pb := TPaintbox.Create(Tabs);
  pb.Parent := Tabs.Pages[nr];
  pb.Tag := nr;
  pb.Name := 'pb_' + IntToStr(nr);
  inc(nr);
end;

procedure TMyArtz.Delete1Click(Sender: TObject);
var i : Integer;
begin
  i := TPaintbox(Sender).Tag;
  TPaintbox(Sender).Canvas.Rectangle(0,0,TPaintbox(Sender).Width, TPaintbox(Sender).Height);

end;
kurz - popup auf einem tabsheet wo auf dynamisch generiertenseiten auf pupupclick etwas geschehen soll..

ich kann nur darauf nicht zeichnen - sehr wohl aber .destroy ohne fehler bzw alle anderen sachen.


wär super hätte wer einen fehler gefunden(komm einfach nicht drauf und mag nicht stupide um diese uhrzeit rumprobieren)

grüße Nico

mkinzler 7. Apr 2006 21:35

Re: unbegründete AccessViolation?
 
Die Sheets haben keinen Parent.

Nicodius 7. Apr 2006 21:36

Re: unbegründete AccessViolation?
 
newsheet.PageControl := tabs; genügt wenn ich mich nicht irre


zumal das unten irrelevant ist :zwinker:

Christian Seehase 7. Apr 2006 21:39

Re: unbegründete AccessViolation?
 
Moin Nico,

prüf' doch erst einmal, ob der Sender überhaupt eine Paintbox ist:

Delphi-Quellcode:
if Sender is TPaintBox then ...
oder lass' Dir mit

Delphi-Quellcode:
ShowMessage(Sender.Classname);
mal ausgeben, welche Klasse der Sender hat.

mkinzler 7. Apr 2006 21:39

Re: unbegründete AccessViolation?
 
Ist möglich, würde es aber an deiner Stelle versuchen ob es was hilft, den parent zu setzen.
Die Symptomatik weist jedenfalls auf den fehlenden parent hin.

Nicodius 7. Apr 2006 21:41

Re: unbegründete AccessViolation?
 
@christian - hi


hatte ich vorhin zur kontrolle drinnen - der sender stimmt.

@mkinzler - danke, aber ist sicher nicht das problem(habs auch probiert ;) )

mkinzler 7. Apr 2006 21:46

Re: unbegründete AccessViolation?
 
Versuch mal
Delphi-Quellcode:
pb.Parent := newsheet;
statt
Delphi-Quellcode:
Tabs.Pages[nr];
Was ist der Initialwert von nr? 0 oder 1

Hawkeye219 7. Apr 2006 21:49

Re: unbegründete AccessViolation?
 
Hi Nico,

würde es helfen, der Paintbox eine Größe zu geben?

Gruß Hawkeye

Nicodius 7. Apr 2006 21:50

Re: unbegründete AccessViolation?
 
ging auch nicht ;)


der initialisierungswert ist 0 aber mit eins gehts auch nicht vorneweg ;)


@hawk - leider nicht - aber danke dass hab ich sowieso vergessen gehabt stimmt :oops:

Hawkeye219 7. Apr 2006 21:58

Re: unbegründete AccessViolation?
 
Was mir gerade noch so auffällt:

Bei einer TPaintBox sollte man doch nur in der Behandlungsroutine für OnPaint zeichnen.
Ist "Delete1Click" wirkliche diese Routine? :gruebel:

xaromz 7. Apr 2006 22:04

Re: unbegründete AccessViolation?
 
Hallo,
Zitat:

Zitat von Hawkeye219
Bei einer TPaintBox sollte man doch nur in der Behandlungsroutine für OnPaint zeichnen.

Wer sagt das?

//Edit:
Noch was zur Frage: Was löst denn das Ereignis "Delete1Click" aus? Das sieht mir nach einem Menüeintrag aus (Du schreibst ja auch von einem Popup-Menü). Dann ist Sender natürlich der Menüpunkt und somit auch keine Paintbox.

Gruß
xaromz

Hawkeye219 7. Apr 2006 22:09

Re: unbegründete AccessViolation?
 
Die Online-Hilfe:

Zitat:

Mit TPaintBox können Sie einem Formular benutzerdefinierte Bilder hinzufügen. Im Gegensatz zu TImage-Objekten, die Bilder aus einer Bitmap-, Symbol- oder Metadatei anzeigen, muß die Anwendung bei TPaintBox das Bild direkt auf der Zeichenfläche selbst erzeugen. Mit der Ereignisbehandlungsroutine OnPaint zeichnen Sie auf die Zeichenfläche der TPaintBox-Komponente.
Soviel ich weiß, kann die PaintBox - im Gegensatz zu TImage - das Bild gar nicht selbst wiederherstellen. Deshalb muß der Zeichencode in den Handler für OnPaint verlagert werden.

Korrigiere mich bitte, wenn ich mich irre!

Gruß Hawkeye

Nicodius 7. Apr 2006 22:15

Re: unbegründete AccessViolation?
 
also das ist eigentlich nur ein test diese zeile - normal sollte es das bild halt leeren


das mit dem sender vom popup kommt mir aber seltsam vor weil ich komme trotz

Delphi-Quellcode:
if Tpaintbox(Sender) <> nil then ...
absicherung in den block rein ;)


grüße Nico

Nicodius 7. Apr 2006 22:18

Re: unbegründete AccessViolation?
 
danke das mit dem sender stimmte natürlich - ich hab als sender ja das popupmenu


@ christian ich versteh nich ich hab die richtigen tagwerte bekommen bei meiner kontrolle und bin in den block gekommen?

Hawkeye219 7. Apr 2006 22:20

Re: unbegründete AccessViolation?
 
Noch ein Wort zu Deiner "Absicherung": es ist keine! Der Sender sollte unter normalen Umständen <> NIL sein, daran ändert auch der TypeCast nichts.
Christians Vorschlag war

Delphi-Quellcode:
if Sender is TPaintBox then ...
Gruß Hawkeye

Nicodius 7. Apr 2006 22:24

Re: unbegründete AccessViolation?
 
es geht doch noch nicht :(

Delphi-Quellcode:
procedure TMyArtz.NeuClick(Sender: TObject);
var newsheet:ttabsheet;
begin
  newsheet := ttabsheet.Create(tabs);
  newsheet.Name := 'ts_' + IntToStr(nr);
  newsheet.PageControl := tabs;
  newsheet.Caption := 'Unbekannt_' + IntToStr(nr);
  pb := TPaintbox.Create(Tabs);
  pb.Parent := newsheet;
  pb.Tag := nr;
  pb.Name := 'pb_' + IntToStr(nr);
  pb.Width := tabs.Width;
  pb.Height := tabs.Height;
  inc(nr);
end;

procedure TMyArtz.Delete1Click(Sender: TObject);
var i, w, h : Integer;
begin
  w := TPaintbox(FindComponent('pb_' + IntToStr(tabs.ActivePageIndex))).width;
  h := TPaintbox(FindComponent('pb_' + IntToStr(tabs.ActivePageIndex))).height;

  TPaintbox(FindComponent('pb_' + IntToStr(tabs.ActivePageIndex))).Canvas.Rectangle(0,0,w,h);
end;

so muss es doch gehn? - ich hab drei seiten erstellt und hab bei activepage auch schon mal -1 genommen...

Muetze1 7. Apr 2006 23:42

Re: unbegründete AccessViolation?
 
Delphi-Quellcode:
procedure TMyArtz.Delete1Click(Sender: TObject);
var
  i, w, h : Integer;
  lElem: TPaintBox;
begin
  If ( tabs.ActivePageIndex > -1 ) Then
  Begin
    lElem := FindComponent('pb_' + IntToStr(tabs.ActivePageIndex)) As TPaintBox;

    If Assigned(lElem) Then
    Begin
      w := lElem.width;
      h := lElem.height;

      lElem.Canvas.Rectangle(0,0,w,h);
    End;
  End;
end;

Nicodius 8. Apr 2006 07:40

Re: unbegründete AccessViolation?
 
heyy danke vielmals :)


das nennt man guten start in den tag :thumb:

ahh allerdings springts bei assigned(lelem) immer raus :(

grüße Nico :)


edit// pb := TPaintbox.Create(Self); hatte hinten Tabs stehen - in der früh merkt man die fehler eben :mrgreen: :mrgreen: danke an alle trotzdem vielmals ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr.

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