AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TScrollBox BUG????

Ein Thema von sintronic86 · begonnen am 3. Apr 2014 · letzter Beitrag vom 3. Apr 2014
Antwort Antwort
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

TScrollBox BUG????

  Alt 3. Apr 2014, 12:53
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???
Björn
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 13:21
Das böse With
Delphi-Quellcode:
with eBezeichnung do begin
    Parent := Self;
wer ist hier wohl Self ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 13:26
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 13:33
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.
Björn
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 13:47
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.
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 13:52
@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!
Björn
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 14:55
Ich habe den Fehler gefunden. Und ich könnte mich so ärgern, weil es eigentlich ein Anfängerfehler ist :


Das OnCreate meiner Komponent sieht so aus (Kurzfassung):

Delphi-Quellcode:
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;
Ich habe das OnPaint meiner Komponente überschrieben.
Innerhalb des OnPaint habe ich einen Zugriff auf alle beinhalteten Komponenten gemacht:

Delphi-Quellcode:
Edit1.Left := ...
Edit2.Left := ...
Edit3.Left := ...
Da das OnPaint durch das zuweisen Edit1.Parent := Self ausgelöst wird, gibt es einen Fehler beim Zugriff auf Edit2.Left := ... , welches zu diesem Zeitpunkt noch garnicht existiert.
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!
Björn
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: TScrollBox BUG????

  Alt 3. Apr 2014, 20:24
Du hast gerufen? Hier bin ich!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 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