![]() |
TScrollBox BUG????
Hallo an alle, ich schon wieder.
Ich habe ein Problem mit einer TScrollBox. Folgendes Umfeld: -Ich erstelle zur Laufzeit ein TPageControl -darin zur Laufzeit TabSheets (Wobei ich TMyTabSheet verwende -> hat nur ein paar Eigenschaften mehr) -darin erstelle ich die TScrollBox, welche (scheinbar) meine Probleme verursacht -die ScrollBox wird mit eigenen Komponenten (Align:=alTop) befüllt, bis sie soweit befüllt ist, das die ScrollBar erscheint -> Es gibt nun zwei Scenarien die auftreten können, wenn ich einzelne dieser Komponenten wieder löschen: 1. Ich lösche nur soviele Komponenten, dass die ScrollBar noch immer sichtbar ist -> wenn ich nun neue Komponenten erstelle, funktioniert alles super. Sie werde wie erwartet an die bereits vorhanden angehängt (alTop) 2. Ich lösche soviele Komponenten, das der Clientbereich der Scrollbox nicht ganz ausgefüllt ist und somit die ScrollBar verschwindet -> wenn ich nun neue Komponenten erstellen möchte, bekomme ich eine Exception: "Im Projekt Test.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x004a1060: read of address 0x00000050' aufgetreten." -> komischerweise tritt diese Exception innerhalb meiner Komponente auf: -die Komponente hat eine private Eigenschaft (eBezeichnung: TEdit), welche im constructor erstellt wird an folgender Stelle tritt die Exception (laut durchsteppen im Debugger) auf:
Delphi-Quellcode:
// BEZEICHNUNG ---------------------------------------------------------------
eBezeichnung := TEdit.Create(Self); with eBezeichnung do begin Parent := Self; <-------------------------------------------------- Left := 50; Top := (Self.Height div 2) - (Height div 2); Width := 450; Text := FBezeichnung; OnChange := MyComponentOnDataChange; OnEnter := MyComponentOnEnter; OnMouseLeave := MyMouseLeave; end; Ich kann es mir nicht erklären, dass das nur dann passiert, wenn die Scrollbar der ScrollBox nicht mehr sichtbar ist. Zufall??? |
AW: TScrollBox BUG????
Das böse With
Delphi-Quellcode:
wer ist hier wohl Self ....
with eBezeichnung do begin
Parent := Self; |
AW: TScrollBox BUG????
Self ist der versteckte Self-Parameter der Methode, wo dieser Code drin ist.
Solange niemand mal auf die Idee kommt, ein Feld/Property mit diesem namen anzulegen, gibt es da eigentlich keine Probleme. (ist genauso, wie mit den anderen Parametern und lokalen Variablen) |
AW: TScrollBox BUG????
Oh, das ging aber schnell! :)
@Bummi Diesen Ablauf verwende ich schon seit geraumer Zeit ohne Probleme. Zudem wird das Edit ja auch richtig zugewiesen und auf meiner Komponente angezeigt. Ich bin immer noch am rumtesten und nun habe ich auch folgendes festgestellt (ich weiss nicht ob es hilfreich ist): -Wenn ich meiner Komponent (dem Parent des eBezeichnung) keinen Parent zu weise, dann funkionieren alle Varianten die ich ausprobierte habe. Bin immer noch absolut ratlos. |
AW: TScrollBox BUG????
Jetzt nimm doch einfach mal den Rat von Bummi an, entferne das With und kopiere vor alle entsprechenden Bezeichner die Zeichenfolge "eBezeichnung.". Danach wirst du mit Sicherheit selbst erkennen, wo der Fehler lag.
Man sollte With meiden wie der Teufel das Weihwasser, es birgt zu viele Fallstricke. |
AW: TScrollBox BUG????
@Perlsau
Selbstverständlich habe ich das auch ausprobiert, nachdem Bummi seine Antwort gegeben hat. Leider brachte das keine Besserung. Wenn es hilft und jemand sowohl die Zeit als auch die Lust hat, würde ich auch das gesamte Projekt einmal posten. Vielleicht könnt ihr das besser verstehen, wenn ihr es in der Gesamtheit vor der Nase habt! |
AW: TScrollBox BUG????
Ich habe den Fehler gefunden. Und ich könnte mich so ärgern, weil es eigentlich ein Anfängerfehler ist :wall::
Das OnCreate meiner Komponent sieht so aus (Kurzfassung):
Delphi-Quellcode:
Ich habe das OnPaint meiner Komponente überschrieben.
constructor TTest.Create(...);
begin inherited Create(AOwner); Parent := ... Align := ... Edit1 := TEdit.Create with Edit1 do begin Parent := Self; ... end; Edit2 := TEdit.Create with Edit2 do begin Parent := Self; ... end; Edit3 := TEdit.Create with Edit3 do begin Parent := Self; ... end; ... end; Innerhalb des OnPaint habe ich einen Zugriff auf alle beinhalteten Komponenten gemacht:
Delphi-Quellcode:
Da das OnPaint durch das zuweisen
Edit1.Left := ...
Edit2.Left := ... Edit3.Left := ...
Delphi-Quellcode:
ausgelöst wird, gibt es einen Fehler beim Zugriff auf
Edit1.Parent := Self
Delphi-Quellcode:
, welches zu diesem Zeitpunkt noch garnicht existiert.
Edit2.Left := ...
Wenn ich dafür sorge, dass das OnPaint nicht ausgeführt wird, bevor das OnCreate der Komponente gelaufen ist, läuft alles reibungslos. Ich danke euch trotzdem allen für eure Bemühungen! |
AW: TScrollBox BUG????
Du hast gerufen? Hier bin ich! :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz